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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top