觸發問題的權限
我正在使用 MS-SQL 2008 R2 中的數據庫,但遇到了問題。
基本設置如下: 有兩個感興趣的表:dbo.Assesments 和 audit.Assesments。dbo.Assesments 是工作數據表,並具有數據更改觸發器(插入、更新、刪除)以更新 audit.Assesments 以及更改日誌。據我所知,這已經工作了多年,到目前為止一切都很好。
我們的 L2 支持有一個名為 SupportRole 的角色,他們使用 WinAuth 進入該角色,該角色具有一些選擇權限和儲存過程的執行權限。其中一個儲存過程對 dbo.Assesments 進行了更新。這就是問題所在:更新進入,儲存過程觸發以插入審計行以進行審計。評估,然後他們立即得到“插入被拒絕,插入權限不足”,事務角色返回等。
這讓我很困惑:我曾認為觸發器更像是儲存過程,如果它們被製造出來,它們就有權做他們正在做的任何事情,但這讓我三思而後行。我不想為審計表/模式的支持角色授予插入權限。我該怎麼辦?
預設情況下,觸發器在觸發觸發器的主體的安全上下文下執行。
為了更改此行為,您需要使用該
WITH EXECUTE AS OWNER
子句創建觸發器。下面是一個例子,它展示了它是如何工作的。
WITH EXECUTE AS OWNER
允許觸發器在觸發器所有者的安全上下文中執行,而不是在更新表的主體中執行。從文件:OWNER
指定模組內的語句在模組目前所有者的上下文中執行。如果模組沒有指定的所有者,則使用模組模式的所有者。不能為 DDL 或登錄觸發器指定 OWNER。
首先,我們創建一個測試表:
USE tempdb; IF OBJECT_ID('dbo.t') IS NOT NULL BEGIN DROP TRIGGER t_trig; DROP TABLE dbo.t; END GO CREATE TABLE dbo.t ( ID INT NOT NULL , ID2 INT NULL ); GO
這是觸發程式碼,其中
EXECUTE AS OWNER
:CREATE TRIGGER t_trig ON dbo.t WITH EXECUTE AS OWNER AFTER INSERT AS BEGIN UPDATE dbo.t SET ID2 = ID WHERE EXISTS (SELECT 1 FROM inserted i WHERE i.ID = dbo.t.ID); END GO
現在,我們將創建一個具有低權限的測試登錄,可用於測試
EXECUTE AS OWNER
允許權限不足的主體訪問他們原本沒有的功能的假設:CREATE LOGIN tLogin WITH PASSWORD = 'QWERFsdf23454%'; CREATE USER tLogin FROM LOGIN tLogin WITH DEFAULT_SCHEMA = dbo;
我們將賦予他們向 中插入行的能力
dbo.T
,但阻止他們執行UPDATE
語句:GRANT INSERT ON dbo.t TO tLogin; DENY UPDATE ON dbo.t TO tLogin;
我們在這裡進行測試:
EXECUTE AS USER = 'tLogin'; /* Output here shows we're running under the tLogin security context */ SELECT SUSER_SNAME(); /* This will fail, with insufficient privileges since we've DENY'd the UPDATE privilege to tLogin. */ UPDATE dbo.t SET ID2 = ID; /* this will run the INSERT since the trigger has EXECUTE AS OWNER */ INSERT INTO dbo.t(ID) VALUES (1); /* This takes us out of the tLogin security context */ REVERT
在這裡,我們可以看到
dbo.T
觸發器所做的更改:SELECT * FROM dbo.t;
在這裡,我們清理低權限使用者:
DROP USER tLogin; DROP LOGIN tLogin;
執行上面的輸出是: