2009-05-07 21 views
0

比方說,我有一個SQL Server 2000表,任何名稱都可以做,這與這個主題無關。在這張桌子上,我有一個觸發器,在更新或插入後運行。是否可以強制觸發器在與SQL Server 2000中的用戶不同的上下文中運行?

用戶可以插入並更新觸發器所附的表格,但不能觸發觸發器所針對的其他表格。

如果用戶修改原始表中的數據,我會收到一個異常,抱怨用戶沒有權限修改觸發器的目標表中的數據。

我認爲這是由於觸發器在用戶的上下文中運行的事實造成的。有沒有辦法讓觸發器在自己的上下文中運行,還是我沒有正確解釋這種異常的原因?

編輯:我應該指出我正在使用SQL Server 2000,所以使用EXECUTE AS將不起作用。

回答

0

觸發器通常以進行初始更改的用戶的權限運行。解決方法是讓觸發器將數據寫入臨時表,然後讓一個單獨的進程(以更高級別用戶身份登錄)每隔一段時間檢查臨時表中的數據並將其移入目標表。

+0

嗯,好吧,我想這會工作。因此,我想,單獨的過程需要是一項預定的工作。不是我真正想要的。 – BenAlabaster 2009-05-07 18:00:03

3

MSDN resource

EXECUTE AS指定安全 上下文下,扳機可被執行 。使您能夠控制哪個 用戶帳戶SQL的實例 服務器用於驗證 上的任何數據庫對象的權限,該數據庫對象是由觸發器引用的 。

+0

謝謝,我已經碰到這個文件來之前,我想我錯過了WITH EXECUTE AS功能。值得注意的是:ddart文件甚至沒有包含這些信息。 http://doc.ddart.net/mssql/sql70/create_8.htm – BenAlabaster 2009-05-07 18:05:37

+0

另外,我注意到這僅僅是SQL Server 2005中 – BenAlabaster 2009-05-07 18:14:08

0

您正在使用哪個版本的SQL Server?我只是能夠做到這一點,而不在SQL Server 2005中的任何問題:

CREATE TABLE dbo.Test_Trigger_1 
(
    my_string VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_Test_Trigger_1 PRIMARY KEY CLUSTERED (my_string) 
) 
GO 

CREATE TABLE dbo.Test_Trigger_2 
(
    my_string VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_Test_Trigger_2 PRIMARY KEY CLUSTERED (my_string) 
) 
GO 
CREATE TRIGGER dbo.tri_Test_Trigger_1 
ON dbo.Test_Trigger_1 
FOR INSERT 
AS 
BEGIN 
    INSERT INTO dbo.Test_Trigger_2 
    (
     my_string 
    ) 
    SELECT 
     my_string 
    FROM 
     INSERTED 
END 
GO 

然後創建一個登錄,它只有進入Test_Trigger_1,我證實,它無法訪問Test_Trigger_2,我插入一行到Test_Trigger_1並在Test_Trigger_2中出現一行。

+0

觸發實際上是劃去到另一個數據庫,用戶甚至沒有權限訪問。我認爲這可能是導致問題的原因。這很有幫助,因爲它強調了至少在同一個數據庫中應該有效的事實。 – BenAlabaster 2009-05-07 18:02:02

+0

稀釋是,那麼在這種情況下,EXECUTE AS應該做的伎倆,雖然我沒有測試它。 – 2009-05-07 18:38:46

相關問題