PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 12.20 » Langage SQL » Fonctions et opérateurs » Fonctions des triggers sur les événements

9.28. Fonctions des triggers sur les événements

PostgreSQL fournit ces fonctions utilitaires pour retrouver des informations à partir des triggers sur événements.

Pour plus d'informations sur les triggers sur événements, voir Chapitre 39.

9.28.1. Récupérer les modifications à la fin de la commande

pg_event_trigger_ddl_commands renvoie une liste des commandes DDL exécutées par chaque action de l'utilisateur lorsqu'elle est appelée à partir d'une fonction attachée à un trigger sur événement ddl_command_end. Si elle est appelée dans tout autre contexte, une erreur est levée. pg_event_trigger_ddl_commands renvoie une ligne pour chaque commande de base exécutée ; certaines commandes qui sont une simple instruction SQL peuvent retourner plus d'une ligne. Cette fonction renvoie les colonnes suivantes :

NomTypeDescription
classidoidOID du catalogue auquel appartient l'objet
objidoidOID de l'objet lui-même
objsubidintegerID du sous-objet (exemple le numéro d'attribut pour les colonnes)
command_tagtextLa marque (tag) de la commande
object_typetextType de l'objet
schema_nametext Nom du schéma auquel appartient l'objet, si applicable ; sinon NULL. Aucun guillemet n'est utilisé.
object_identitytext Version textuelle de l'identité de l'objet, qualifié du schéma. Tous les identifiants présents dans l'identité sont placés entre guillemets si nécessaire.
in_extensionboolIndique si la commande est incluse dans un script d'une extension
commandpg_ddl_command Une représentation complète de la commande, dans un format interne. Elle ne peut être envoyée en sortie directement, mais elle peut être communiquée à d'autres fonctions pour obtenir différentes informations à propos de la commande.

9.28.2. Traitement des objets supprimés par une commande DDL

pg_event_trigger_dropped_objects renvoie une liste de tous les objets supprimés par la commande qui a déclenché l'appel à l'événement sql_drop. Si elle est appelée dans un autre contexte, pg_event_trigger_dropped_objects lève une erreur. pg_event_trigger_dropped_objects renvoie les colonnes suivantes :

NomTypeDescription
classidoidOID du catalogue auquel appartient l'objet
objidoidOID de l'objet lui-même
objsubidint32Sous-identifiant de l'objet (par exemple, numéro d'attribut pour une colonne)
originalboolUtilisé pour identifier l'objet détruit à l'origine
normalbool Indique qu'il existe une relation de dépendance normale dans le graphe des dépendances menant à cet objet
is_temporarybool Indique que l'objet était un objet temporaire.
object_typetextType de l'objet
schema_nametext Nom du schéma auquel appartient l'objet. NULL dans le cas contraire. Aucun guillemet n'est utilisé.
object_nametext Nom de l'objet si la combinaison nom du schéma et nom de l'objet peut être utilisée comme identifiant unique pour l'objet, NULL dans les autres cas. Aucun guillemet n'est utilisé et le nom n'est jamais qualifié du nom du schéma.
object_identitytext Version textuelle de l'identité de l'objet, qualifié du schéma. Tous les identifiants présents dans l'identité sont placés entre guillemets si nécessaire.
address_namestext[] Un tableau qui, avec object_type et address_args, peut être utilisé par la fonction pg_get_object_address() pour recréer l'adresse de l'objet dans un serveur distant qui contient un objet de même type nommé à l'identique.
address_argstext[] Complément pour address_names ci-dessus.

La fonction pg_event_trigger_dropped_objects peut être utilisée dans un trigger d'événement comme ici :

CREATE FUNCTION test_trigger_evenement_pour_suppression()
        RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLARE
    obj record;
BEGIN
    FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects()
    LOOP
        RAISE NOTICE '% objet supprimé : % %.% %',
                     tg_tag,
                     obj.object_type,
                     obj.schema_name,
                     obj.object_name,
                     obj.object_identity;
    END LOOP;
END
$$;
CREATE EVENT TRIGGER test_trigger_evenement_pour_suppression
   ON sql_drop
   EXECUTE FUNCTION test_trigger_evenement_pour_suppression();
       

9.28.3. Gérer un événement de modification de table

Les fonctions décrites à Tableau 9.96 fournissent des informations sur une table pour laquelle un événement table_rewrite vient juste d'être lancé. Si elles sont appelées dans un autre contexte, une erreur est levée.

Tableau 9.96. Table Rewrite information

NomType en retourDescription
pg_event_trigger_table_rewrite_oid() OidL'OID de la table sur le point d'être modifiée.
pg_event_trigger_table_rewrite_reason() int Le(s) code(s) expliquant la raison de la modification. La signification exacte de ces codes dépend de la version (release).

La fonction pg_event_trigger_table_rewrite_oid peut être utilisée dans un trigger sur événement comme suit :

CREATE FUNCTION test_event_trigger_table_rewrite_oid()
 RETURNS event_trigger
 LANGUAGE plpgsql AS
$$
BEGIN
  RAISE NOTICE 'modification de table % pour la raison %',
                pg_event_trigger_table_rewrite_oid()::regclass,
                pg_event_trigger_table_rewrite_reason();
END;
$$;

CREATE EVENT TRIGGER test_table_rewrite_oid
                  ON table_rewrite
   EXECUTE FUNCTION test_event_trigger_table_rewrite_oid();