PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 16.6 » 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.104 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.104. 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();