PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Existe-t-il un moyen de désactiver les mises à jour/suppressions tout en permettant aux déclencheurs de les effectuer ?

Oui, c'est possible.

Les déclencheurs sont exécutés avec les privilèges de la fonction de déclencheur, par défaut sur SECURITY INVOKER ce qui signifie que la fonction de déclenchement est effectivement exécutée avec les privilèges de current_user , dans votre cas celui qui insère des lignes.

Si l'utilisateur actuel ne dispose pas des privilèges requis pour les tables sur lesquelles votre fonction de déclencheur fonctionne, votre opération d'origine dans la table sous-jacente aboutira à une erreur.

Cependant , vous pouvez utiliser SECURITY DEFINER pour que la fonction déclencheur exécute cette fonction avec les privilèges du OWNER de la fonction.

Si vous avez un superutilisateur propriétaire la fonction déclencheur, elle peut tout faire - ce qui constituerait un risque potentiel pour la sécurité. Considérez les instructions du manuel sur l'écriture de SECURITY DEFINER Fonctionne en toute sécurité.

Mais il est plus sage de créer un rôle clair avec juste les privilèges nécessaires OWNER de la fonction de déclenchement. Vous pouvez même simplement créer un rôle "démon" sans connexion, agissant comme un ensemble de privilèges pour de telles opérations. Vous n'accorderez alors que les privilèges nécessaires (sur les schémas, les tables, les séquences...) à ce rôle de démon. Pour des conceptions plus sophistiquées, vous devez regrouper les privilèges dans les "rôles de groupe" (encore une fois, pas de connexion) et accorder ces rôles de groupe aux rôles qui en ont besoin (au rôle de démon dans cet exemple), les rendant ainsi "membres du groupe". Je le fais souvent.

Considérez cette réponse connexe sur dba.SE concernant les privilèges sur la fonction elle-même :

  • Quels sont les privilèges requis pour exécuter une fonction déclencheur dans PostgreSQL 8.4 ?