-1

TO TRIGGER上で実行:SQL ServerのGRANTは、私は、このトリガーを持っているUSER

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 

私は私が行うユーザーSOME_USERにこのトリガーにEXECUTE権限を付与する必要があります。

GRANT EXECUTE 
    ON OBJECT::[dbo].[TRIGGER_UPDATE_MODIFIED] TO [SOME_USER] 
    WITH GRANT OPTION 
    AS [dbo]; 
GO 

そして、私は、次の取得しますエラー:

Cannot find object 'TRIGGER_UPDATE_MODIFIED' because it does not exist or user does not have permission.

なぜこのエラーが発生し、どのように解決できますか?

私はこのことについて考えている:

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を使用していますか?

どのような違いがありますか?

+3

私はあなたがトリガにアクセス許可を与えることができるとは思いません。代わりに、テーブルに対するアクセス許可を付与する必要があります。 –

+0

[このsocial.MSDNスレッド](https://social.msdn.microsoft.com/Forums/sqlserver/en-US/edc8acc6-d710-4c0b-bc6c-209912575557/database-trigger-permission?forum)をご覧ください。 = sqlsecurity) - 役に立つかもしれません。 – 3N1GM4

+1

トリガーの権限は、アクションが対応する基本表に対して実行されるたびに実行されるため、許可を与えません。 –

答えて

0

コメントの要約:
DMLトリガーにアクセス許可を与えることはできません。トリガーを起動するDML文を実行する権限のみを付与できます。 あなたのケースでは、ユーザーにテーブルの上に更新権限を付与する必要があります

GRANT UPDATE ON [dbo].[MY_TABLE] TO [SOME_USER]; 
関連する問題