sql >> Databáze >  >> RDS >> PostgreSQL

Spustit spouštěč při aktualizaci sloupce A nebo ColumnB nebo ColumnC

To je nedorozumění. WHEN klauzule definice spouštěče očekává boolean výraz a můžete použít OR operátory v něm. To by mělo fungovat (vzhledem k tomu, že v tabulce account_details skutečně existují všechny sloupce ). Sám používám podobné spouštěče:

CREATE TRIGGER trigger_update_account_details
AFTER UPDATE ON account_details
FOR EACH ROW
WHEN (OLD.email    IS DISTINCT FROM NEW.email
   OR OLD.username IS DISTINCT FROM NEW.username
   OR OLD.password IS DISTINCT FROM NEW.password) 
EXECUTE PROCEDURE notify_insert_account_details();

Vyhodnocení výrazu stojí nepatrně, ale pravděpodobně je to spolehlivější než alternativa:

CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...

Protože podle dokumentace:

Spouštěč specifický pro sloupec (definovaný pomocí UPDATE OF column_name syntaxe) se spustí, když je některý z jeho sloupců uveden jako cíle v UPDATE příkazu SET seznam. Je možné, že se hodnota sloupce změní, i když se pravidlo nespustí, protože změny provedené v obsahu řádku BEFORE UPDATE spouštěče se neberou v úvahu. Naopak příkaz jako UPDATE ... SET x = x ... spustí spouštěč ve sloupci x, i když se hodnota sloupce nezměnila.

ROW syntaxe typu je kratší pro kontrolu mnoha sloupců (totéž):

CREATE TRIGGER trigger_update_account_details
AFTER UPDATE ON account_details
FOR EACH ROW
WHEN ((OLD.email, OLD.username, OLD.password, ...)
       IS DISTINCT FROM
      (NEW.email, NEW.username, NEW.password, ...))
EXECUTE PROCEDURE notify_insert_account_details();

Nebo pro kontrolu každého viditelný uživatelský sloupec v řádku:

...
WHEN (OLD IS DISTINCT FROM NEW)
...


  1. co je oracle EBS R12

  2. Chování GROUP BY, když v klauzuli SELECT nejsou přítomny žádné agregační funkce

  3. Jak používat REPLACE v SQL

  4. ORA-01652:nelze rozšířit dočasný segment o 128 v tabulkovém prostoru SYSTÉM:Jak rozšířit?