Suche…


Einführung

Der Trigger wird der angegebenen Tabelle oder Sicht zugeordnet und führt die angegebene Funktion Funktionsname aus, wenn bestimmte Ereignisse auftreten.

Bemerkungen

Bitte benutzen Sie den untenstehenden Link für eine vollständige Übersicht über:

Grundlegende PL / pgSQL-Triggerfunktion

Dies ist eine einfache Triggerfunktion.

CREATE OR REPLACE FUNCTION my_simple_trigger_function()
RETURNS trigger AS
$BODY$

BEGIN
    -- TG_TABLE_NAME :name of the table that caused the trigger invocation
IF (TG_TABLE_NAME = 'users') THEN

    --TG_OP : operation the trigger was fired
  IF (TG_OP = 'INSERT') THEN 
    --NEW.id is holding the new database row value (in here id is the id column in users table)
    --NEW will return null for DELETE operations
    INSERT INTO log_table (date_and_time, description) VALUES (now(), 'New user inserted. User ID: '|| NEW.id);        
    RETURN NEW;        

  ELSIF (TG_OP = 'DELETE') THEN    
    --OLD.id is holding the old database row value (in here id is the id column in users table)
    --OLD will return null for INSERT operations
    INSERT INTO log_table (date_and_time, description) VALUES (now(), 'User deleted.. User ID: ' || OLD.id);
    RETURN OLD;        
    
  END IF;

RETURN null;
END IF;

END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Hinzufügen dieser Auslöserfunktion zur users

CREATE TRIGGER my_trigger
AFTER INSERT OR DELETE
ON users
FOR EACH ROW
EXECUTE PROCEDURE my_simple_trigger_function();

Art der Auslöser

Auslöser kann zum Auslösen angegeben werden:

  • BEFORE der Vorgang in einer Zeile versucht wird - Einfügen, Aktualisieren oder Löschen.
  • AFTER der Vorgang abgeschlossen ist - Einfügen, Aktualisieren oder Löschen.
  • INSTEAD OF the operation bei Einfügungen, Aktualisierungen oder Löschungen in einer Ansicht.

Auslöser, der markiert ist:

  • FOR EACH ROW heißt einmal für jede Zeile , dass die Operation modifiziert;
  • FOR EACH STATEMENT wird für jede gegebene Operation aufgerufen.

Beispiele für die Ausführung vorbereiten

CREATE TABLE company (
    id          SERIAL PRIMARY KEY NOT NULL,
    name        TEXT NOT NULL,
    created_at  TIMESTAMP,
    modified_at TIMESTAMP DEFAULT NOW()
)

CREATE TABLE log (
    id          SERIAL PRIMARY KEY NOT NULL,
    table_name  TEXT NOT NULL,
    table_id    TEXT NOT NULL,
    description TEXT NOT NULL,
    created_at  TIMESTAMP DEFAULT NOW()
)

Single-Insert-Abzug

Schritt 1: Erstellen Sie Ihre Funktion

CREATE OR REPLACE FUNCTION add_created_at_function()
  RETURNS trigger AS $BODY$
BEGIN
  NEW.created_at := NOW();
  RETURN NEW;
END $BODY$
LANGUAGE plpgsql;

Schritt 2: Erstellen Sie Ihren Abzug

CREATE TRIGGER add_created_at_trigger
BEFORE INSERT
ON company
FOR EACH ROW
EXECUTE PROCEDURE add_created_at_function();

Schritt 3: testen Sie es

INSERT INTO company (name) VALUES ('My company');
SELECT * FROM company;

Auslöser für mehrere Zwecke

Schritt 1: Erstellen Sie Ihre Funktion

CREATE OR REPLACE FUNCTION add_log_function()
  RETURNS trigger AS $BODY$
DECLARE
  vDescription TEXT;
  vId INT;
  vReturn RECORD;
BEGIN
    vDescription := TG_TABLE_NAME || ' ';
     IF (TG_OP = 'INSERT') THEN
        vId := NEW.id;
        vDescription := vDescription || 'added. Id: ' || vId;
        vReturn := NEW;
    ELSIF (TG_OP = 'UPDATE') THEN
        vId := NEW.id;
        vDescription := vDescription || 'updated. Id: ' || vId;
        vReturn := NEW;
    ELSIF (TG_OP = 'DELETE') THEN
        vId := OLD.id;
        vDescription := vDescription || 'deleted. Id: ' || vId;
        vReturn := OLD;
    END IF;

    RAISE NOTICE 'TRIGER called on % - Log: %', TG_TABLE_NAME, vDescription;

    INSERT INTO log 
        (table_name, table_id, description, created_at) 
        VALUES
        (TG_TABLE_NAME, vId, vDescription, NOW());

    RETURN vReturn;
END $BODY$
  LANGUAGE plpgsql;

Schritt 2: Erstellen Sie Ihren Abzug

CREATE TRIGGER add_log_trigger
AFTER INSERT OR UPDATE OR DELETE
ON company
FOR EACH ROW
EXECUTE PROCEDURE add_log_function();

Schritt 3: testen Sie es

INSERT INTO company (name) VALUES ('Company 1');
INSERT INTO company (name) VALUES ('Company 2');
INSERT INTO company (name) VALUES ('Company 3');
UPDATE company SET name='Company new 2' WHERE name='Company 2';
DELETE FROM company WHERE name='Company 1';
SELECT * FROM log;


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow