Log-Tabelle und Trigger-Funktion erstellen
In diesem Schritt erstellen Sie die notwendigen Datenbankobjekte für die Protokollierung von DDL-Ereignissen: eine Tabelle zur Speicherung der Protokolle und eine Funktion, die der Trigger ausführt.
Öffnen Sie zunächst ein Terminal und verbinden Sie sich mit der PostgreSQL-Datenbank über die interaktive Shell psql. Die nachfolgenden SQL-Operationen führen Sie innerhalb dieser Shell durch.
sudo -u postgres psql
Sie sollten nun die PostgreSQL-Eingabeaufforderung sehen, die wie postgres=# aussieht.
Erstellen Sie als Nächstes eine Tabelle namens event_log, um die Details jedes DDL-Ereignisses zu speichern. Diese Tabelle wird Spalten für die Ereigniszeit, den Ereignistyp, das Schema, den Objektnamen und den ausgeführten Befehl enthalten.
Führen Sie den folgenden SQL-Befehl in der psql-Shell aus:
CREATE TABLE event_log (
event_time timestamp with time zone,
event_type text,
schema_name text,
object_name text,
command_tag text
);
Nach erfolgreicher Ausführung antwortet PostgreSQL mit:
CREATE TABLE
Erstellen Sie nun die Funktion, die durch das DDL-Ereignis ausgelöst wird. Diese Funktion, log_ddl_event, fügt einen neuen Datensatz in die Tabelle event_log ein.
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;
Lassen Sie uns diese Funktion aufschlüsseln:
RETURNS event_trigger: Gibt an, dass es sich um eine spezielle Art von Funktion handelt, die für die Verwendung mit Event-Triggern konzipiert ist.
AS $$ ... $$ LANGUAGE plpgsql: Definiert den Funktionskörper unter Verwendung der prozeduralen Sprache plpgsql.
INSERT INTO event_log ...: Dies ist die Kernaktion, die eine neue Zeile in unsere Protokolltabelle einfügt.
now(): Eine Standardfunktion, die den aktuellen Zeitstempel zurückgibt.
tg_event, tg_tag: Spezielle Variablen, die innerhalb einer Trigger-Funktion verfügbar sind und Kontext über das Ereignis liefern, wie z. B. ddl_command_end und CREATE TABLE.
pg_event_trigger_ddl_commands(): Eine Funktion, die eine Menge von Zeilen zurückgibt, die die ausgeführten DDL-Befehle beschreiben. Wir verwenden sie, um den schema_name und die objid (Objektidentifikator) des erstellten Objekts zu erhalten.
Nachdem Sie den Befehl ausgeführt haben, sehen Sie die folgende Bestätigung:
CREATE FUNCTION
Sie haben nun die grundlegenden Komponenten für Ihren Event-Trigger erfolgreich eingerichtet.