2017-07-11 18 views
0

'custom_manual_edit'という名前のテーブルにカラム 'name'、 'builder'、 'flag'ユーザーがビルダー列の変更を更新したときにトリガーを作成しました。そのトリガーは、ビルダー値が変更されたレコードのフラグ列値を10に更新する関数を呼び出します。 以下は私のトリガーですテーブル内のプライマリキーカラムを持たない同じテーブル内の他のカラム変更に基づいてカラム値を更新する方法

CREATE TRIGGER builder_update_trigger_manual_custom_edits 
AFTER UPDATE 
ON edmonton.custom_manual_edit 
FOR EACH ROW 
WHEN (((old.builder)::text IS DISTINCT FROM (new.builder)::text)) 
EXECUTE PROCEDURE 
edmonton.automated_builder_update_trigger_manual_custom_edits(); 

と私の機能

CREATE OR REPLACE FUNCTION 
edmonton.automated_builder_update_trigger_manual_custom_edits() 
RETURNS trigger AS 
$BODY$ 
DECLARE 
e record; 

BEGIN 
IF NEW.builder <> OLD.builder THEN 
    EXECUTE FORMAT('UPDATE edmonton.custom_manual_edit set builder_edit_flag = 10; 
END IF; 
RETURN NEW; 

END 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

これは、テーブルのフラグ列全体を10に更新するが、ビルダーの値が変更されたレコードのフラグ値を更新する方法を知っている。

答えて

0

マニュアルを参照してください:文単位のトリガによって呼び出さ36.1. Overview of Trigger Behavior

トリガ関数は常に リターンNULLする必要があります。行単位のトリガーによって呼び出されるトリガー関数は、 が選択されている場合、呼び出し側実行プログラムに テーブル行(HeapTupleタイプの値)を返すことができます。

  • それは現在の行に対する操作をスキップするようにNULLを返すことができる:操作前に焼成行レベルのトリガーは 以下の選択肢を有します。この は、 がトリガーを呼び出す行レベルの操作(特定のテーブル行の挿入、変更、または削除)を実行しないようにエグゼキュータに指示します。行レベルのINSERTとUPDATEについて

  • のみトリガ、返される行 が挿入され又は更新さ ある行を置換する行となります。これにより、トリガー機能は が挿入または更新されている行を変更できます。

その結果として返すように注意しなければならない これらの動作のいずれかを引き起こすことを意図していないトリガーBEFORE行レベル(に渡されたのと同じ行 それは、INSERTのための新しい行でありますUPDATE トリガー、DELETEトリガーのOLDロー)。あなたが必要以上による

  1. は、UPDATE文を発射NEW行の代わりに直接
  2. UPDATE、BEFORE、ないUPDATE
  3. AFTER として変更builder_edit_flag列値をトリガを宣言

CREATE TRIGGER builder_update_trigger_manual_custom_edits 
BEFORE UPDATE 
ON edmonton.custom_manual_edit 
FOR EACH ROW 
..... 
..... 

CREATE OR REPLACE FUNCTION 
edmonton.automated_builder_update_trigger_manual_custom_edits() 
..... 
..... 

BEGIN 
IF NEW.builder <> OLD.builder THEN 
    NEW.builder_edit_flag = 10; 
END IF; 
RETURN NEW; 
..... 
..... 
+0

どうもありがとう@krokodiiko –

関連する問題