在每次DAO測試之前,我清理我的數據庫,並且需要重置某些表的標識值。我創建了以下存儲過程:如何啓用非系統管理員帳戶來執行「DBCC CHECKIDENT」?
CREATE PROCEDURE SET_IDENTITY
@pTableName varchar(120),
@pSeedValue int
AS
BEGIN
DBCC CHECKIDENT(@pTableName, RESEED, @pSeedValue);
END
我的問題是我需要用「普通」用戶調用此存儲過程。按順序工作,該用戶不能成爲:sysadmin,db_owner,db_ddladmin的成員。
我已經試過:
一)CREATE PROCEDURE WITH EXECUTE AS OWNER
B)EXECUTE AS USER = 'sa' before call DBCC CHECKIDENT
但在這兩種情況下,我回來了:
服務器主體sa
無法訪問在當前安全上下文下的數據庫my_db_name
。
我使用微軟的SQL Server Express(64位)11.0.2100.60
謝謝你在前進,
阿貝爾
如果您的環境允許,請嘗試使用'ALTER AUTHORIZATION ON DATABASE :: [mydb] TO [sa]'將數據庫所有者設置爲SQL Server可以驗證的內容(確保您的數據庫沒有組帳戶首先由設計師設計一個所有者!)然後'EXECUTE AS OWNER'應該可以工作。對於更強大的解決方案,您可以使用加密簽名爲存儲過程提供必要的許可,但[涉及更多](http://sommarskog.se/grantperm.html#Certificates)。 –
另一種可能的解決方案是,如果「clean」意味着「清除整個表」,則使用'TRUNCATE TABLE',作爲副作用也會重置身份並且只需要表中的'ALTER'權限。還要考慮使用[數據庫項目](https://msdn.microsoft.com/library/hh272677)來創建一個乾淨的空數據庫,您可以在每次測試運行之前部署(或者每次測試,甚至是,但這可能太慢)。另一種選擇是恢復到[快照](https://docs.microsoft.com/zh-cn/sql/relational-databases/databases/database-snapshots-sql-server)或分離/附加空的數據庫。 –
規範聲明您不能在表上使用TRUNCATE TABLE,而是由FOREIGN KEY約束引用。 –