LINUX.ORG.RU

[неосилятор][PostgreSQL] Триггеры.

 ,


0

1

Добрый день.

Пытаюсь сделать вот что: есть таблица actions в postgreSQL, одно из полей которой, с именем ts, имеет тип timestamp without time zone. Я хочу вставить запись, соответствующее поле в которой представлено в виде Unix time.

В Postgre реализована функция to_timestamp(num), умеющая необходимое преобразование:

select to_timestamp from to_timestamp(1291626067);
      to_timestamp      
------------------------
 2010-12-06 12:01:07+03
(1 row)
, осталось её прикрутить к моменту вставки.

Пишу примитивнейшую функцию и пытаюсь прикрутить её к триггеру:

CREATE FUNCTION trigger_epoch_to_datetime_ins() returns trigger as $$
begin
	NEW.ts= to_timestamp(NEW.ts);
	return NEW;
end
$$ language 'plpgsql';
CREATE TRIGGER fromunix before INSERT on actions 
  for each row execute PROCEDURE  trigger_epoch_to_datetime_ins();

однако, при попытке вставить запись, выскакивает ошибка:

ERROR:  invalid input syntax for type timestamp: "1291626067" at character 40
STATEMENT:  INSERT INTO public.actions(ts) VALUES ('1291626067'::timestamp without time zone)

Такое впечатление, что триггер либо не исполняется, либо сперва идёт проверка вставляемого значения, а потом только данные передаются триггеру.

Что тут неправильно и можно ли сделать то, что я хочу?

Второй вопрос: можно ли триггером организовать алиасы и, направляя запись в несуществующее поле, на самом деле вставлять данные в поле созданное с другим именем?


Ответ на: комментарий от unC0Rr

Вторая проблема решена.

Да. Спасибо.

Вы были правы: достаточно было использовать представление, например, вот так:

CREATE OR REPLACE VIEW que (id,"queue-name", exten, description,created_at, updated_at) as select * from queus;

CREATE RULE que_rule AS ON INSERT to que do instead 
  insert INTO queus VALUES (NEXTVAL('queus_id_seq'),NEW."queue-name", NEW.exten, NEW.description, now(), now());

для таблицы

CREATE TABLE queus
(
  id serial NOT NULL,
  queue_name character varying(25),
  exten character varying(12),
  description text,
  created_at timestamp without time zone,
  updated_at timestamp without time zone,
  CONSTRAINT queus_pkey PRIMARY KEY (id)
)…

Осталось понять, каким образом решить первую проблему, с преобразованием unix time.

HolyBoy
() автор топика

преобразование типа происходит на самом начальном этапе, в триггер уже попадает разобранная запись. Подмена типа поля в триггере не возможна

maxcom ★★★★★
()
Ответ на: комментарий от maxcom

Всё понял, спасибо.

Значит, буду либо на этапе укладывания в БД преобразовывать, либо, на этапе доставания из БД.

HolyBoy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.