2009-09-12 6 views
1

триггер:PostgreSQL простой триггер вопрос

CREATE TRIGGER "tr_update_ts" BEFORE INSERT OR UPDATE 
ON "public"."test" FOR EACH ROW 
EXECUTE PROCEDURE "public"."update_ts"(); 

и функция:

CREATE OR REPLACE FUNCTION "public"."update_ts"() RETURNS trigger AS 
$body$ 
DECLARE 
BEGIN 
    NEW.ts := now(); 
RETURN NEW; 
END; 
$body$ 
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; 

Почему это не работает? Ошибка не была сброшена, но ts по-прежнему равен нулю ...

ответ

2

Я проверил ваш код и он работает:

Во-первых, давайте создадим таблицу:

# create table test (x int4, ts timestamptz); 
CREATE TABLE 

Теперь Давайте добавим функцию:

# CREATE OR REPLACE FUNCTION "public"."update_ts"() RETURNS trigger AS 
>> $body$ 
>> DECLARE 
>> BEGIN 
>> NEW.ts := now(); 
>> RETURN NEW; 
>> END; 
>> $body$ 
>> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; 
CREATE FUNCTION 

И, наконец, добавить триггер:

# CREATE TRIGGER "tr_update_ts" BEFORE INSERT OR UPDATE 
>> ON "public"."test" FOR EACH ROW 
>> EXECUTE PROCEDURE "public"."update_ts"(); 
CREATE TRIGGER 

Итак, теперь, давайте проверим при вставке его части:

# insert into test (x) values (1); 
INSERT 0 1 
# select * from test; 
x |    ts 
---+------------------------------- 
1 | 2009-09-12 19:54:50.812139+02 
(1 row) 

Очевидно, что он работает.

Теперь обновление:

# update test set x = 2; 
UPDATE 1 
# select * from test; 
x |    ts 
---+------------------------------- 
2 | 2009-09-12 19:54:57.463933+02 
(1 row) 

ц была изменена. Очевидно, что код, который вы показали, работает, поэтому ошибка должна быть где-то еще.

Покажите нам вывод «\ d test» из psql и \ df + функции триггера.

0

Каков полный синтаксис вашей функции создания? Вот полный синтаксис функции, которую я создал, и работает как ожидалось.

create function update_timestamp() RETURNS trigger AS $$ 
BEGIN 
    NEW.ts := now(); 
RETURN NEW; 
END; 
$$ language plpgsql; 
+0

Я добавил полную функцию выше .. но кажется, в основном то же самое – David

+0

Я скомпилировал код, который вы предоставили для своей функции, и он работал как и ожидалось для меня. –

+0

Можете ли вы сделать a \ d и опубликовать это? –

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