PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Условие WHEN за вмъкване или актуализиране на Postgres (старо)

Вариант А:

Можете да промените кода, така че условията да бъдат във функцията на тригера, а не в самия тригер. С този подход OLD ще се използва само в UPDATE .

Тригер:

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

Задействаща функция:

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

Вариант Б:

Както Тило предложи, напишете два тригера, които споделят една и съща функция на тригер.

Тригери:

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();

Задействаща функция:

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. Използване на параметър като име на колона във функцията Postgres

  2. Как да възстановите непоследователен PostgreSQL Slave

  3. Как да прехвърля низ към цяло число и да имам 0 в случай на грешка при прехвърлянето с PostgreSQL?

  4. Намерете пропуски в последователност в SQL, без да създавате допълнителни таблици

  5. PostgreSQL където всичко е в масив