【问题标题】:SQL Server GRANT EXECUTE ON TRIGGER TO USERSQL Server GRANT EXECUTE ON TRIGGER TO USER
【发布时间】: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


【解决方案1】:

总结一下cmets:
您不能授予对 DML 触发器的权限。您只能授予执行将触发触发器的 DML 语句的权限。 在您的情况下,您应该将表的更新权限授予用户:

GRANT UPDATE ON [dbo].[MY_TABLE] TO [SOME_USER];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多