【发布时间】:2017-01-13 10:12:46
【问题描述】:
我有这个触发器:
CREATE TRIGGER [dbo].[TRIGGER_UPDATE_MODIFIED]
ON [dbo].[MY_TABLE]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE [dbo].[MY_TABLE] SET [DATE_MODIFIED] = GETDATE(), [USER_MODIFIED] = CASE WHEN UPDATE ([USER_MODIFIED]) THEN i.[USER_MODIFIED] ELSE RIGHT(SUSER_NAME(), 100) END
FROM INSERTED i
WHERE [MY_TABLE].[SOME_FIELD] = i.[SOME_FIELD]
END
我需要将此触发器的EXECUTE 权限授予用户SOME_USER,所以我这样做:
GRANT EXECUTE
ON OBJECT::[dbo].[TRIGGER_UPDATE_MODIFIED] TO [SOME_USER]
WITH GRANT OPTION
AS [dbo];
GO
我收到以下错误:
找不到对象“TRIGGER_UPDATE_MODIFIED”,因为它不存在或用户没有权限。
为什么会出现此错误,我该如何解决?
我曾想过这样做:
CREATE TRIGGER [dbo].[TRIGGER_UPDATE_MODIFIED]
ON [dbo].[MY_TABLE]
WITH EXECUTE AS 'SOME_USER'
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE [dbo].[MY_TABLE] SET [DATE_MODIFIED] = GETDATE(), [USER_MODIFIED] = CASE WHEN UPDATE ([USER_MODIFIED]) THEN i.[USER_MODIFIED] ELSE RIGHT(SUSER_NAME(), 100) END
FROM INSERTED i
WHERE [MY_TABLE].[SOME_FIELD] = i.[SOME_FIELD]
END
正确吗(使用WITH EXECUTE AS 'SOME_USER')?或者也许使用WITH EXECUTE AS OWNER?
会有什么不同?
【问题讨论】:
-
我认为您不能授予触发器权限。您需要授予对表的权限。
-
看看this social.MSDN thread - 它可能会有所帮助。
-
您不授予触发器权限,因为它们的全部意义在于,只要针对相应的基表发生操作,它们就会执行。
-
@ZoharPeled 好的,我怎样才能授予表的权限以允许用户“SOME_USER”执行触发器。能否提供sql命令?
-
为什么是-1分?这是一个很好的问题,我在这里找到了答案
标签: sql-server sql-server-2008 triggers sql-server-2008-r2 database-trigger