2009-04-28 49 views
7

我已經得到以下設置:問題與SQL Server「執行AS」

有一個SQL Server數據庫與幾個表上設置觸發器(收集歷史數據)。這些觸發器是使用EXECUTE AS 'HistoryUser'的CLR存儲過程。 HistoryUser用戶是數據庫中的簡單用戶,無需登錄。它具有足夠的權限來讀取所有表並寫入歷史記錄表。

當我備份數據庫,然後將其恢復到另一臺機器(在這種情況下,虛擬機,但它並不重要),觸發器不再工作。事實上,用戶不再冒用了。即使是一個簡單的語句,如本

exec ('select 3') as user='HistoryUser' 

產生一個錯誤:

Cannot execute as the database principal because the principal "HistoryUser" does not exist, this type of principal cannot be impersonated, or you do not have permission.

read in MSDN,如果DB所有者是域用戶這可能發生,但事實並非如此。即使我將它改爲其他任何東西(他們推薦的解決方案),這個問題仍然存在。

如果我創建另一個用戶沒有登錄,我可以用它來模仿就好了。也就是說,這工作得很好:

create user TestUser without login 
go 
exec ('select 3') as user='TestUser' 

我不想重新創建所有這些觸發器,那麼有沒有什麼辦法我怎樣才能使現有HistoryUser工作?

凹凸:抱歉,這是有點急...

回答

4

什麼用戶帳戶不觸發執行的。

您需要爲該用戶授予用戶帳戶HistoryUser的IMPERSONATE特權。

GRANT IMPERSONATE ON USER:: YourUser TO HistoryUser 

更多細節在這裏

http://msdn.microsoft.com/en-us/library/ms181362.aspx

+0

NOP,沒有幫助。 – 2009-04-28 15:15:01

4

的問題,像這樣從一臺機器移動數據庫到另一通常涉及不匹配的SID年代後出現的,雖然我不知道是否或如何適用於你的情況。嘗試刪除並重新創建數據庫用戶,確保恢復對這些表的權限。

+0

這就是要點 - 這個用戶從來沒有登錄過。什麼SID? 而且,正如我在上面的問題中所說的,我寧願不重新創建用戶,因爲那樣我也必須重新創建一大堆觸發器。 – 2009-04-29 06:59:14

+0

這對我有用。我們必須從另一臺服務器遷移數據庫,並遇到此問題。 – ahwm 2016-07-11 16:27:37

3

這是一個「孤兒用戶」。它不會工作。文件清楚地說明 :-( 修復「孤立用戶」狀態,它將再次運行

5

檢測孤立用戶,然後通過鏈接到登錄進行解析。

DETECT:

USE <DATABASE_NAME>;
GO;
sp_change_users_login @ Action = '舉報';
GO;

RESOLVE:
下面的命令重新鏈接由<LOGIN_NAME>與由<database_user>指定的數據庫用戶指定的服務器登錄帳戶:

USE <DATABASE_NAME>;
GO
的sp_change_users_login @動作= ' update_one ',
@ UserNamePattern = ' <database_user> ',
@ LoginName將= ' <LOGIN_NAME> ';
GO

https://msdn.microsoft.com/en-us/library/ms175475.aspx