Я проверил ваш код и он работает:
Во-первых, давайте создадим таблицу:
# 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 + функции триггера.
Я добавил полную функцию выше .. но кажется, в основном то же самое – David
Я скомпилировал код, который вы предоставили для своей функции, и он работал как и ожидалось для меня. –
Можете ли вы сделать a \ d и опубликовать это? –