PER OGNI ISTRUZIONE trigger esempio

Ho cercato il la documentazione di postgresql trigger, ma sembra solo a mostrare esempi di fila a livello di trigger, ma non riesco a trovare un esempio di una dichiarazione di trigger di livello.

In particolare, non è chiaro come iterare l’aggiornamento/righe inserite in un unico prospetto, dal NEW è per un singolo record.

 

One Reply
  1. 17

    OLD e NEW è nullo o non definito in una dichiarazione a livello di trigger. Per la documentazione:

    NEW

    Tipo di dati RECORD; variabile con il nuovo database riga per INSERT/UPDATE operazioni in riga a livello di trigger. Questa variabile è
    null nella dichiarazione trigger a livello di
    e per DELETE operazioni.

    OLD

    Tipo di dati dei RECORD; variabile che tiene la vecchia riga del database per UPDATE/DELETE operazioni in riga a livello di trigger. Questa variabile è null nella dichiarazione trigger a livello di e per INSERT operazioni.

    Grassetto, sottolineatura mia.

    Fino a Postgres 10 questa lettura leggermente diversa, molto di più lo stesso effetto, però:

    … Questa variabile è nessun in istruzione a livello di trigger. …

    Mentre quelli variabili di record sono ancora di non utilizzare per la dichiarazione del livello di trigger, una nuova caratteristica molto è:

    Transizione tabelle in Postgres 10+

    Postgres 10 introdotto transizione tabelle. Queste permettono di avere accesso a tutta una serie di righe interessate. Il manuale:

    AFTER trigger può anche fare uso di transizione tabelle per ispezionare l’intero set di righe modificate dall’attivazione istruzione.
    Il CREATE TRIGGER comando assegna i nomi di uno o di entrambi transizione
    tabelle, e quindi la funzione è possibile fare riferimento a quei nomi come se fossero
    erano di sola lettura di tabelle temporanee. Esempio 43.7 mostra un esempio.

    Seguire il link al manuale per esempi di codice.

    Esempio a livello di istruzione trigger senza transizione tabelle

    Prima dell’avvento di transizione tabelle, quelli erano anche meno comuni. Un esempio utile è quello di inviare le notifiche dopo alcuni comandi DML.

    Qui è una versione di base di quello che io uso:

    -- Generic trigger function, can be used for multiple triggers:
    CREATE OR REPLACE FUNCTION trg_notify_after()
      RETURNS trigger AS
    $func$
    BEGIN
       PERFORM pg_notify(TG_TABLE_NAME, TG_OP);
       RETURN NULL;
    END
    $func$  LANGUAGE plpgsql;
    
    -- Trigger
    CREATE TRIGGER notify_after
    AFTER INSERT OR UPDATE OR DELETE ON my_tbl
    FOR EACH STATEMENT
    EXECUTE PROCEDURE trg_notify_after();
    • Speravo che l’istruzione-trigger avuto qualche equivalente di NEW e OLD per i più caso record, e in qualche modo a scorrere tali..
    • Nope. Che non è come funziona.
    • Questo è davvero troppo male, perché significa che si può fare solo RBAR operazioni di trigger.
    • Sembra che la dichiarazione di trigger viene eseguito anche se non ci sono righe interessate. Non ho bisogno di analizzare i dati all’interno, ma mi piacerebbe sapere se c’era qualche record aggiornati. Qualche modo per farlo?
    • Invece di un trigger, si può incapsulare la query in una funzione e controllare i risultati. Dettagli: stackoverflow.com/a/19393268/939860
    • Penso che questo è cambiato nelle versioni più recenti… io credo che ci sono ora NUOVE e VECCHIE tabelle accessibili all’interno del livello di istruzione trigger
    • Vero, un game-changer per questa vecchia domanda. Ho aggiornato.

Lascia un commento