PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres wstawia lub aktualizuje wyzwalacz WHEN (stary)

Opcja A:

Możesz zmienić kod, aby warunki znajdowały się w funkcji wyzwalacza, a nie w samym wyzwalaczu. Przy takim podejściu OLD będzie używany tylko w UPDATE .

Wyzwalacz:

CREATE TRIGGER mytrigger
    BEFORE INSERT OR UPDATE ON "mytable"
    FOR EACH ROW 
    EXECUTE PROCEDURE mytrigger();

Funkcja wyzwalania:

CREATE OR REPLACE FUNCTION mytrigger()
  RETURNS trigger AS
$BODY$
begin
if NEW.score > 0 then
     --code for Insert
     if  (TG_OP = 'INSERT') then
           YOUR CODE
     end if;

     --code for update
     if  (TG_OP = 'UPDATE') then
           if OLD.score <> NEW.score then  -- (if score can be null see @voytech comment to this post)
              YOUR CODE
           end if;
     end if;
end if;
return new;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE

Opcja B:

Zgodnie z sugestią Thilo napisz dwa wyzwalacze, które mają tę samą funkcję wyzwalacza.

Wyzwalacze:

CREATE TRIGGER mytrigger1
    BEFORE INSERT ON "mytable"
    FOR EACH ROW 
    WHEN NEW.score > 0
    EXECUTE PROCEDURE mytrigger();


CREATE TRIGGER mytrigger2
    BEFORE UPDATE ON "mytable"
    FOR EACH ROW 
    WHEN (NEW.score > 0 AND OLD.score <> NEW.score)
    EXECUTE PROCEDURE mytrigger();

Funkcja wyzwalania:

CREATE OR REPLACE FUNCTION mytrigger()
  RETURNS trigger AS
$BODY$
begin
      YOUR CODE
return new;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wybrać rekordy z ostatnich 24 godzin za pomocą PostgreSQL

  2. Jak filtrować wiersze według wartości zagnieżdżonych w kolumnie json?

  3. Dołącz do danych wyjściowych tablicy unnest bez tworzenia tabeli tymczasowej

  4. PostgreSQL - relacja [tabela] nie istnieje

  5. Narzędzie do tłumaczenia Oracle PL/SQL na Postgresql PL/pgSQL