Reputation: 10660
I have this trigger:
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
I need to grant EXECUTE
permission on this trigger to user SOME_USER
so I do:
GRANT EXECUTE
ON OBJECT::[dbo].[TRIGGER_UPDATE_MODIFIED] TO [SOME_USER]
WITH GRANT OPTION
AS [dbo];
GO
And I get following error:
Cannot find object 'TRIGGER_UPDATE_MODIFIED' because it does not exist or user does not have permission.
Why am I getting this error and how can I resolve it?
I have thought about doing this:
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
Is that correct (using WITH EXECUTE AS 'SOME_USER'
)? or maybe using WITH EXECUTE AS OWNER
?
What will be the difference?
Upvotes: 3
Views: 23587
Reputation: 82524
To sum up the comments:
You can't grant permissions on DML triggers. You can only grant permissions to execute the DML statements that will fire the trigger.
In your case, you should grant update permissions on the table to the user:
GRANT UPDATE ON [dbo].[MY_TABLE] TO [SOME_USER];
Upvotes: 1