Sql-Server

觸發問題的權限

  • December 15, 2021

我正在使用 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;

執行上面的輸出是:

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/135793