3

您好,我有一张表,我拒绝向用户提供 SELECT privs。
该表有一个引用 INSERTED 表的触发器,基本上是在执行

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

它给了我一个错误,说“SELECT PERMISSIONS DENIED”,我猜是因为 SELECT FROM INSERTED。

如何保持 SELECT 拒绝,但允许触发器从 INSERTED 伪表中选择?

提前致谢!

4

4 回答 4

2

考虑添加一个EXECUTE AS子句,以便触发器以架构所有者的权限运行。

CREATE TRIGGER [dbo].[TR_Product_Update] ON [Product]
   WITH EXECUTE AS OWNER
   AFTER UPDATE
AS
SELECT ProductId
FROM INSERTED
于 2009-05-22T14:02:57.823 回答
1

为什么拒绝选择?只是不授予他们选择权怎么办?拒绝选择和不授予选择之间存在细微差别。此外,如果您拒绝选择任何系统级角色,那么这也可能是问题的一部分。

- 编辑 -

在您询问 SQL Server 是否具有上下文信息的评论中。2005 可以,您可以在此处查看如何使用它。

会话变量 – Context_Info:会话是任何编程语言中的强大工具。SQL-Server 不是一种完整的编程语言,但它确实支持当前会话或连接的会话变量。它将会话的值存储在 128 字节的二进制信息中。

于 2009-05-06T17:55:03.903 回答
0

加入插入的表,而不是像:

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

无论如何,这也可能比子选择更好。

于 2009-05-06T17:28:45.260 回答
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

并使用“tester”登录尝试以下更新语句:

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

第一个执行良好并且触发器执行(将 select * from triggerTable 的结果提供给没有选择权限的用户,证明它设法进行了选择)。

第二个给我一个错误,指出我没有对 triggerTable 的选择权限(因为它需要从 triggerTable 中进行选择才能获取 id 的值来进行更新)。

这使我得出结论,触发器是问题附带的,而 UPDATE 语句是权限问题的原因。

于 2009-05-22T13:01:11.567 回答