2016-03-30 5 views
0

У меня очень простая функция триггера и триггера. Функция триггера должна вставлять GUID в каждую строку после операции вставки.max_stack_depth на запуске триггера PostgreSQL

SQL:

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

Trigger функция:

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; 

Trigger:

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

Unrelated, но: вы должны действительно остерегайтесь цитируемый идентификаторы ("USERS"). Они намного больше проблем, чем их стоит

+0

Странно, но похоже, что он работает так же, как и с 'BEFORE' http://snag.gy/hyth5.jpg –

+0

, но на моем скриншоте' before'. Или я ошибаюсь? Я попробую снова проверить все –

+0

@ user1432751: Я понятия не имею, что должен показать этот снимок экрана. Проблема с бесконечной рекурсией не имеет ничего общего с ней до или после триггера. Но _changing_ значение столбца будет ** только ** работать в перед триггером. –

Смежные вопросы