PostgreSQL простой вопрос триггера - PullRequest
1 голос
/ 12 сентября 2009

Триггер:

 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 ]

3 голосов
/ 12 сентября 2009

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

Сначала давайте создадим таблицу:

# 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 голосов
/ 12 сентября 2009

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

create function update_timestamp() RETURNS trigger AS $$
BEGIN
  NEW.ts := now();
RETURN NEW;
END;
$$ language plpgsql;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...