PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 15.9 » Langage SQL » Fonctions et opérateurs » Fonctions de trigger d'événement

9.29. Fonctions de trigger d'événement

PostgreSQL fournit des fonctions d'aide pour récupérer des informations sur les triggers d'événement.

Pour plus d'informations sur les triggers d'événement, voir Chapitre 40.

9.29.1. Capturer les modifications à la fin d'une commande

pg_event_trigger_ddl_commands () → setof record

pg_event_trigger_ddl_commands renvoie une liste de commandes DDL exécutées par chaque action utilisateur, lorsqu'elles sont appelées dans une fonction attachée à un trigger d'événement ddl_command_end. Si appelé d'un 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 phrase SQL pourraient renvoyer plus d'une ligne. Cette fonction renvoie les colonnes suivantes :

NomTypeDescription
classidoidOID du catalogue d'appartenance de l'objet
objidoidOID de l'objet lui-même
objsubidintegeridentifiant du sous-objet (par exemple, le numéro d'attribut pour une colonne)
command_tagtextBalise de commande
object_typetextType de l'objet
schema_nametext Nom du schéma d'appartenance de l'objet, s'il existe ; sinon NULL. Aucun guillemet n'est utilisé.
object_identitytext Texte indiquant l'identité de l'objet, qualifié du schéma. Chaque identifiant inclus dans l'identifié est entre guillemets si nécessaire.
in_extensionbooleanTrue si la commande fait partie d'un script d'extension
commandpg_ddl_command Une représentation complète de la commande dans le format interne. Ceci ne peut être affiché directement mais peut être passé à d'autres fonctions pour obtenir différentes pièces d'information sur la commande.

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

pg_event_trigger_dropped_objects () → setof record

pg_event_trigger_dropped_objects renvoie une liste de tous les objets supprimés par la commande pour laquelle l'événement sql_drop a été appelé. Si elle est appelée dans un autre contexte, une erreur est levée. Cette fonction renvoie les colonnes suivantes :

NomTypeDescription
classidoidOID du catalogue d'appartenance de l'objet
objidoidOID de l'objet lui-même
objsubidintegerIdentifiant du sous-objet (par exemple le numéro d'attribut d'une colonne)
originalbooleanTrue s'il s'agit d'un des objets racines de la suppression
normalboolean True s'il y avait une relation de dépendance normale dans le graphe de dépendance amenant à cet objet
is_temporaryboolean True si c'était un objet temporaire
object_typetextType de l'objet
schema_nametext Nom du schéma d'appartenance de l'objet, s'il existe ; sinon NULL. Aucun guillemet n'est utilisé.
object_nametext Nom de l'objet, si la combinaison du schéma et du nom peut être utilisée comme un identifiant unique pour l'objet ; sinon NULL. Aucun guillemet n'est utilisé, et le nom n'est jamais qualifié du schéma.
object_identitytext Texte indiquant l'identité de l'objet, qualifié du schéma. Chaque identifiant inclus dans l'identifié est entre guillemets si nécessaire.
address_namestext[] Un tableau qui, avec object_type et address_args, peut être utilisé dans la fonction pg_get_object_address pour recréer l'adresse de l'objet dans un serveur distant contenant un objet nommé de façon identique et de même type.
address_argstext[] Complément pour address_names

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

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

9.29.3. Gérer un événement de réécriture de table

Les fonctions listées dans Tableau 9.102 fournissent des informations sur une table pour laquelle l'événement table_rewrite a été justement appelé. Si appelée dans un autre contexte, une erreur est levée.

Tableau 9.102. Fonctions d'informations sur la réécriture de table

Fonction

Description

pg_event_trigger_table_rewrite_oid () → oid

Renvoie l'OID de la table à réécrire.

pg_event_trigger_table_rewrite_reason () → integer

Renvoie un code expliquant les raisons de la réécriture. La valeur est un champ de bits construit à partir des valeurs suivantes : 1 (la persistence de la table a été modifiée), 2 (la valeur par défaut d'une colonne a été modifiée), 4 (le type de données de la colonne a été modifié) et 8 (la méthode d'accès à la table a été modifiée).


Ces fonctions peuvent être utilisées dans un trigger d'événement ainsi :

CREATE FUNCTION test_event_trigger_table_rewrite_oid()
 RETURNS event_trigger
 LANGUAGE plpgsql AS
$$
BEGIN
  RAISE NOTICE 'rewriting table % for reason %',
                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();