我怀疑您的问题是您的 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
并使用“tester”登录尝试以下更新语句:
UPDATE triggerTable SET id = 2
GO
UPDATE triggerTable SET id = id *2
GO
第一个执行良好并且触发器执行(将 select * from triggerTable 的结果提供给没有选择权限的用户,证明它设法进行了选择)。
第二个给我一个错误,指出我没有对 triggerTable 的选择权限(因为它需要从 triggerTable 中进行选择才能获取 id 的值来进行更新)。
这使我得出结论,触发器是问题附带的,而 UPDATE 语句是权限问题的原因。