2016-10-22 2 views
1

psqlのトリガーに問題があり、テーブルおよびifにいくつかの値(送信者、受信者、件名)が既に存在するかどうかをチェックする必要がある彼らは存在する私はその行の1つの値(件名= RE:+件名)を更新する必要がある場合、私は新しい行を挿入する必要があります。いくつかの値がテーブルのいくつかの行で等しいかどうかをチェックし、そうでなければ更新する

CREATE OR REPLACE FUNCTION check_theme() 
RETURNS TRIGGER 
AS $$ 
    DECLARE e BOOLEAN; 
    BEGIN 
     e := EXISTS(
      SELECT * 
      FROM message 
      WHERE sender = NEW.sender 
       AND reciever = NEW.reciever 
       AND subject = NEW.subject 
      ); 
     IF NOT e THEN 
      INSERT INTO message(sender, reciever, subject, text) 
      VALUES(NEW.sender, NEW.reciever, NEW.subject, NEW.text); 
     ELSE 
      UPDATE message 
      SET subject = 'Re: ' || NEW.subject 
      WHERE sender = NEW.sender 
       AND reciever = NEW.reciever 
       AND subject = NEW.subject; 
     END IF; 
     RETURN NEW; 

    END; 
$$ 
LANGUAGE plpgsql; 

CREATE TRIGGER theme_check 
BEFORE INSERT OR UPDATE 
ON message 
FOR EACH ROW EXECUTE PROCEDURE check_theme(); 

私はすでに、送信者のために同じ値を持つ新しい行を挿入したい後ので、レシーバと対象トリガーは無限ループになります。

私は間違っていますか?

+0

'INSERT' BEFOREトリガがちょうどIF THEN電子NEW.subject = '再:''言うべきbeloveある|| NEW.subject; '私はあなたが 'AFTER UPDATE'のケースで何を望んでいるのか分かりません...本当に更新がテーブルに新しい挿入を引き起こしたいのですか? –

+0

私はこの問題を解決する必要があります: トリガを実装し、適切な機能 "check_theme"をトリガします。メッセージのテーブル内の各エントリに対して、同じ送信者、受信者から同じメッセージが既に存在するかどうかをチェックしますタイトル。 接頭辞「Re:」を含むタイトルが変更された場合 例:「Hello」のタイトルは「Re:Hello」に変更されます。 それ以外の場合は、新しいメッセージを挿入する必要があります。 –

答えて

0

トリガーの仕組みに関する私の知識が間違っていると分かっています。私の間違いは、INSERT機能を追加していたのですが、同じ送信者、受信者、私はいつも無限ループに陥っていたのです。動作します ので、コードが

CREATE OR REPLACE FUNCTION provjera_teme() 
RETURNS TRIGGER 
AS $$ 
    DECLARE postoji BOOLEAN; 
    BEGIN 
     postoji := EXISTS(
      SELECT poruka 
      FROM poruka 
      WHERE posiljatelj = NEW.posiljatelj 
       AND primatelj = NEW.primatelj 
       AND (naslov = NEW.naslov OR naslov LIKE 'Re: ' || NEW.naslov) 
      );  
     IF postoji THEN 
      UPDATE poruka 
      SET naslov = 'Re: ' || naslov 
      WHERE posiljatelj = NEW.posiljatelj 
        AND primatelj = NEW.primatelj 
        AND naslov = NEW.naslov AND naslov NOT LIKE 'Re%'; 
       RETURN NULL; 
     END IF; 
     RETURN NEW; 
    END; 
$$ 
LANGUAGE plpgsql; 

CREATE TRIGGER tema_provjera 
BEFORE INSERT 
ON poruka 
FOR EACH ROW EXECUTE PROCEDURE provjera_teme(); 
関連する問題