2009-05-06 52 views
3

您好,我有一個表,我拒絕了SELECT權限給用戶。
這個表有一個觸發器,它引用插入表,基本上是做一個Sql服務器:如何在拒絕的SELECT表上寫入觸發器

AFTER UPDATE SET <table>.[UPDATED] = getdate() 
    WHERE ROWID IN SELECT ROWID FROM INSERTED 

這是給我一個錯誤,雖然,說:「被拒絕的SELECT權限」,我的選擇插入,因爲猜測。

如何保持SELECT拒絕,但允許觸發器從INSERTED僞指令中選擇?

在此先感謝!

回答

2

考慮添加一個EXECUTE AS子句,以便觸發器以架構所有者的權限運行。

CREATE TRIGGER [dbo].[TR_Product_Update] ON [Product] 
    WITH EXECUTE AS OWNER 
    AFTER UPDATE 
AS 
SELECT ProductId 
FROM INSERTED 
0

加入到inserted表,而不是像這樣:

update t1 
set updated = getdate() 
from table1 t1 
join inserted i 
on i.rowid = t1.rowid 

這將probaly也perfom比再選擇更好的反正。

+0

嗯...不行。只是爲了好玩,我嘗試評論觸發器體,所以它不應該選擇任何東西,但我仍然得到錯誤。 我真的不知道爲什麼,因爲我所做的全部是 UPDATE site.CONTENT SET NAME ='Contact Us',CONTENT ='你好!您可以通過212.555.1212與我們聯繫。

邪惡的乾杯!
'WHERE ROWID = 2 而且表格上只有一個觸發器。所以我不知道它在做什麼SELECT。即使SQL事件探查器也不顯示事務中發生的任何SELECT語句。 GRRR ...好吧,無論如何,我想我必須回到這個。 – eidylon 2009-05-06 17:57:08

+0

(oops,在發表評論時沒有意識到它沒有使用格式化規則) – eidylon 2009-05-06 17:57:47

1

你爲什麼拒絕選擇?只是不給予選擇他們呢?拒絕選擇和僅僅不給予他們之間存在細微的差異。此外,如果您拒絕選擇任何系統級角色,那麼這也可能是問題的一部分。

- 編輯 -

在你問SQL服務器是否具有上下文信息的評論。 2005年,你可以看到如何使用它here

會話變量 - Context_Info:Session是任何編程語言中的強大工具。 SQL-Server不是一種完整的編程語言,但它支持當前會話或連接的會話變量。它將會話的值存儲在128字節的二進制信息中。

0

我懷疑你的問題是你的UPDATE語句本身需要SELECT權限。

我創建一個測試數據庫如下:

DROP DATABASE triggerPermissionTest
CREATE DATABASE triggerPermissionTest
GO
USE triggerPermissionTest
GO
CREATE USER foo FROM LOGIN tester
GO
CREATE TABLE triggerTable (id int)
GO
DENY SELECT ON triggerTable to foo
GRANT UPDATE ON triggerTable to foo
GO
CREATE TRIGGER execAsTrigger ON triggerTable
AFTER UPDATE AS SELECT * FROM triggerTable
GO
INSERT INTO triggerTable VALUES (1)
GO

和嘗試了以下更新語句與「測試器」登錄:

UPDATE triggerTable SET id = 2
GO
UPDATE triggerTable SET id = id *2
GO

第一個執行精細和觸發器執行(將triggerTable中的select *的結果提供給用戶而沒有選擇權限,表明它設法做出選擇)。

第二個給我一個錯誤,指出我沒有對triggerTable的選擇權限(因爲它需要從triggerTable中選擇以獲取id的值來執行更新)。

這使我得出結論,觸發器是偶然的問題,並且UPDATE語句是權限問題的原因。