Créer une table de journalisation et une fonction de déclenchement
Dans cette étape, vous allez créer les objets de base de données nécessaires à la journalisation des événements DDL : une table pour stocker les journaux et une fonction que le déclencheur exécutera.
Tout d'abord, ouvrez un terminal et connectez-vous à la base de données PostgreSQL en utilisant le shell interactif psql. Vous effectuerez les opérations SQL suivantes dans ce shell.
sudo -u postgres psql
Vous devriez maintenant voir l'invite PostgreSQL, qui ressemble à postgres=#.
Ensuite, créez une table nommée event_log pour stocker les détails de chaque événement DDL. Cette table aura des colonnes pour l'heure de l'événement, le type, le schéma, le nom de l'objet et la commande qui a été exécutée.
Exécutez la commande SQL suivante dans le shell psql :
CREATE TABLE event_log (
event_time timestamp with time zone,
event_type text,
schema_name text,
object_name text,
command_tag text
);
Après une exécution réussie, PostgreSQL répondra par :
CREATE TABLE
Maintenant, créez la fonction qui sera déclenchée par l'événement DDL. Cette fonction, log_ddl_event, insérera un nouvel enregistrement dans la table event_log.
CREATE OR REPLACE FUNCTION log_ddl_event()
RETURNS event_trigger
AS $$
BEGIN
INSERT INTO event_log (event_time, event_type, schema_name, object_name, command_tag)
SELECT now(), tg_event, ddl_command.schema_name, ddl_command.objid::regclass, tg_tag
FROM pg_event_trigger_ddl_commands() AS ddl_command;
END;
$$ LANGUAGE plpgsql;
Décomposons cette fonction :
RETURNS event_trigger : Spécifie qu'il s'agit d'un type spécial de fonction conçu pour être utilisé avec des déclencheurs d'événements.
AS $$ ... $$ LANGUAGE plpgsql : Définit le corps de la fonction en utilisant le langage procédural plpgsql.
INSERT INTO event_log ... : C'est l'action principale, qui insère une nouvelle ligne dans notre table de journalisation.
now() : Une fonction standard qui renvoie l'horodatage actuel.
tg_event, tg_tag : Variables spéciales disponibles à l'intérieur d'une fonction de déclenchement qui fournissent le contexte de l'événement, comme ddl_command_end et CREATE TABLE.
pg_event_trigger_ddl_commands() : Une fonction qui renvoie un ensemble de lignes décrivant les commandes DDL qui ont été exécutées. Nous l'utilisons pour obtenir le schema_name et l'objid (identifiant de l'objet) de l'objet en cours de création.
Après avoir exécuté la commande, vous verrez la confirmation suivante :
CREATE FUNCTION
Vous avez maintenant configuré avec succès les composants fondamentaux de votre déclencheur d'événements.