我在使用混合模式身份驗證的Microsoft SQL Server 2008 Express實例中有一個名爲MyDB的數據庫。使用數據庫MyDB的應用程序當前使用Windows身份驗證使用當前用戶的Windows憑據進行連接。此登錄名是「公共」服務器角色的成員,並且有一個用戶映射到MyDB數據庫中。此數據庫用戶是db_datareader和db_datawriter數據庫角色的成員。在登錄觸發器內切換執行上下文
我想要的是,當應用程序連接時,它有權在MyDB中讀寫。但是當另一個應用程序使用相同的登錄連接時,應該只允許讀取它。
我的想法是,我會創建一個登錄觸發器,它將檢查連接字符串的應用程序名稱部分,並根據它決定是否應切換執行上下文。 (爲了記錄,我知道依賴連接字符串的應用程序名稱並不安全,並且很容易規避。此處的目的不是保護數據庫,而是爲了幫助用戶避免更改當他們使用其他應用程序(例如Microsoft Excel)連接時的數據)
我創建了一個名爲'myapp_reader'的新登錄映射到MyDB數據庫中的用戶,該用戶是db_datareader的成員。
然後我試着用下面的TSQL創建一個登錄觸發器:
CREATE TRIGGER CheckUser
ON ALL SERVER
AFTER LOGON AS
BEGIN
IF APP_NAME() <> 'My Application Name'
BEGIN
EXECUTE AS LOGIN = 'myapp_reader' WITH NO REVERT
END
END
但不幸的是,這是行不通的。當我嘗試連接,我得到以下錯誤:
Logon failed for login 'MyComputer\MyWindowsUsername' due to trigger execution.
Changed database context to 'master'.
Changed language setting to us_english. (Microsoft SQL Server, Error: 17892)
當我看在錯誤日誌,它說:
Error: 15590, Severity: 16, State: 1.
Can only use the 'No Revert' or 'Cookie' options with the 'Execute As' statement at the adhoc level.
Error: 17892, Severity: 20, State: 1.
Logon failed for login 'MyComputer\MyWindowsUsername' due to trigger execution. [CLIENT: xxx.xxx.xxx.xxx]
此錯誤意味着我永遠不能改變的執行上下文在登錄觸發器?
嗯,我想我會追求這種做法。謝謝! – 2010-08-20 13:10:17