2016-03-30 7 views
0

私は非常に簡単なトリガとトリガ機能を持っています。トリガ関数は、挿入操作後、すべての行にGUIDを挿入する必要があります。PostgreSQLトリガのmax_stack_depthを実行

SQL:

CREATE TABLE "USERS" 
(
    id integer, 
    guid uuid, 
    name text 
) 

トリガ機能:

CREATE OR REPLACE FUNCTION insertGUID() RETURNS trigger AS 
$BODY$BEGIN 
    INSERT INTO "USERS" ("guid") VALUES (md5(random()::text || clock_timestamp()::text)::uuid); 
END$BODY$ 
LANGUAGE plpgsql; 

トリガー:

CREATE TRIGGER example_trigger BEFORE INSERT ON "USERS" EXECUTE PROCEDURE insertGUID(); 

しかし後に、すべての挿入後

。同様:

INSERT INTO "USERS"(name) VALUES ('foo1'); 

私はエラーを取得しています:max_stack_depth

CONTEXT: SQL: "INSERT INTO "USERS" ("Joe") VALUES (md5(random()::text || clock_timestamp()::text)::uuid)"

UPD:私はBEFORE INSERT

答えて

1

あなたinsert火災新しい行を挿入トリガーを使用する場合でも、同じ問題を取得しています次にトリガーを起動し、トリガーを起動する新しい行を挿入します。新しい行を挿入し、新しい行を挿入するトリガーを起動します(画像を取得します)。

変更する新しい行ではなく、を挿入新しいもの。だからあなたのトリガ関数は次のようにする必要があります:トリガー自体を動作させるために、この

CREATE OR REPLACE FUNCTION insertGUID() 
    RETURNS trigger AS 
$BODY$BEGIN 
    new.guid := md5(random()::text || clock_timestamp()::text; 
    return new; 
END$BODY$ 
LANGUAGE plpgsql; 

before insertとして定義する必要があります。

CREATE TRIGGER example_trigger 
    BEFORE INSERT ON "USERS" EXECUTE PROCEDURE insertGUID();

関連のない、しかし:あなたは本当に回避引用符で囲まれた識別子("USERS")する必要があります。彼らは価値があるよりもはるかにトラブルです。

+0

「BEFORE」でも同じように見えます。http://snag.gy/hyth5.jpg –

+0

私のスクリーンショットは 'before'です。または間違っている?私は再びすべてをチェックしようとします –

+0

@ user1432751:私は、そのスクリーンショットが私に見せてくれるものではないと思います。無限回帰の問題は、それが前トリガか後トリガかに関わらず、何もしません。しかし、列の値を_changing_すると、beforeトリガーでのみ**動作します。 –

関連する問題