web-dev-qa-db-ja.com

Postgres挿入または更新トリガーのWHEN条件(古い)

書き込み挿入または更新トリガーが必要ですが、OLD行とNEW行を比較するWHEN条件があります。

ドキュメントによると、挿入操作ではOLDはnullです。 INSERTおよびUPDATEトリガーのWHEN条件でOLDをどのように使用できますか?

トリガーの例:

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

しかし、挿入の場合、OLDはnullです。

オプションA:

条件がトリガー自体ではなくトリガー関数内になるようにコードを変更できます。このアプローチでは、OLDUPDATEでのみ使用されます。

引き金:

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

オプションB:

Thiloが提案したように、同じトリガー機能を共有する2つのトリガーを記述します。

トリガー:

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
18
Elad