Question

Bonjour, j'ai une table sur laquelle j'ai refusé les privilèges SELECT à un utilisateur.
Cette table a un déclencheur qui référence la table INSERTED, en faisant un

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

Cela me donne cependant une erreur en disant "SELECT PERMISSIONS DENIED", je suppose à cause de SELECT from INSERTED.

Comment puis-je conserver le refus SELECT, tout en permettant au déclencheur de sélectionner SELECT à partir du pseudotable INSERTED?

Merci d'avance!

Était-ce utile?

La solution

Envisagez d'ajouter une clause EXECUTE AS afin que le déclencheur s'exécute avec les autorisations du propriétaire du schéma.

CREATE TRIGGER [dbo].[TR_Product_Update] ON [Product]
   WITH EXECUTE AS OWNER
   AFTER UPDATE
AS
SELECT ProductId
FROM INSERTED

Autres conseils

Pourquoi avez-vous refusé la sélection? Qu'en est-il de ne pas leur accorder select? Il existe une différence subtile entre refuser de sélectionner et tout simplement ne pas le leur accorder. De même, si vous refusiez de sélectionner l'un des rôles de niveau système, cela ferait probablement également partie du problème.

- MODIFIER -

Dans les commentaires, vous avez demandé si SQL Server avait ou non des informations de contexte. 2005 est visible et vous pouvez voir comment l’utiliser ici .

  

Variable de session & # 8211; Context_Info: Session est un outil puissant dans n'importe quel langage de programmation. SQL-Server n'est pas un langage de programmation à part entière, mais il supporte les variables de session pour la session ou la connexion en cours. Il stocke la valeur de la session dans 128 octets d’informations binaires.

joindre à la table insérée à la place quelque chose comme:

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

Cela fonctionnera probablement aussi mieux qu’un sous-choix de toute façon.

Je suppose que votre problème est que votre instruction UPDATE requiert elle-même l'autorisation SELECT.

J'ai créé une base de données de test comme suit:

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

et essayé les instructions de mise à jour suivantes avec le login 'testeur':

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

GO

Le premier s'exécute correctement et le déclencheur s'exécute (en fournissant les résultats de select * from triggerTable à l'utilisateur sans les autorisations de sélection, ce qui montre qu'il a réussi à effectuer une sélection).

Le second me donne une erreur indiquant que je n'ai pas l'autorisation select sur triggerTable (car il faut sélectionner triggerTable pour obtenir la valeur de id pour la mise à jour).

Cela m'amène à conclure que le déclencheur est accessoire au problème et que l'instruction UPDATE est à l'origine du problème d'autorisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top