Trigger di Audit di Postgres ha solo sparato da un aggiornamento a una riga
-
20-12-2019 - |
Domanda
Ciao, sto sviluppando un semplice trigger di audit per il server PostgreSQL.Secondo questo documento , ho praticamente capito come funziona.Ma voglio registrare la mia attività solo quando viene aggiornata la certa riga.Di seguito è riportato il codice dal link.E registra quando c'è un aggiornamento, non importa quale riga sia aggiornata.
IF (TG_OP = 'UPDATE') THEN
...
.
Aiutami come fornire una condizione al codice sopra.Grazie!
Soluzione
Il trigger è scritto in PL / PGSQL. Ti suggerisco vivamente di studiare il manuale PL / PGSQL se stai andando Per modificare il codice PL / PGSQL.
In Trigger, i dati di riga sono in OLD
e NEW
(per trigger UPDATE
). Quindi puoi fare test IF
su quello come qualsiasi altra cosa. Ad esempio .:
IF (TG_OP = 'UPDATE') THEN
IF NEW."name" = 'name_to_audit' OR OLD."name" = 'name_to_audit' THEN
-- do audit commands
END IF;
END IF;
.
Entrambi NEW
e OLD
sono testati nel caso in cui il nome venga modificato da / a il nome di interesse.
In questo caso potresti invece cambiarlo per utilizzare una clausola WHEN
sul CREATE TRIGGER
, in modo da non attirare mai il trigger a meno che le condizioni di controllo non siano soddisfatte. Vedi La clausola WHEN
sui trigger .
Questo è solo un problema di programmazione di base; Avrai bisogno di imparare il linguaggio di programmazione per usarlo.
Vedi anche il Trigger aggiornato per PG 9.1 .
Oh, e ricorda di pensare a NULL
; Ricorda che NULL = 'anything'
è NULL
. Usa IS DISTINCT FROM
Se vuoi dire "Queste cose sono uguali o sono entrambi NULL".
Altri suggerimenti
Da PostgreSQL Docs:
CREATE TRIGGER log_update
AFTER UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE PROCEDURE log_account_update();
.
Questo funziona solo per l'aggiornamento su quella tabella.Per inserire ed eliminare puoi usare lo stesso senza dove query.Spero che questo aiuto gli altri.