Firebird после триггера вставки - вставить временную метку во вставленную строку

У меня есть поле типа «метка времени», называемое «insert_when». Как я могу обновить это поле (вставить метку времени) после вставки (чтобы оно применялось только к выбранной вставленной записи)? Конечно, с помощью триггера... изменить:

Я пробовал это, но не могу заставить работать незакомментированную часть.

SET TERM ^ ;
CREATE TRIGGER AFTER_INSERT FOR MYTABLE
ACTIVE AFTER INSERT POSITION 1
AS
BEGIN
      UPDATE MYTABLE 
      SET MYTABLE.inserted_when = current_timestamp;

   ---- where mytable.ID = Inserted.ID
END^

SET TERM ; ^

person user3927897    schedule 01.09.2014    source источник


Ответы (3)


Чтобы обновить вставляемую запись, вам нужно использовать триггер BEFORE INSERT, а не триггер AFTER INSERT. К значениям вставляемой строки можно получить доступ (и обновить) через переменную контекста NEW (существует также переменная контекста OLD, но она не имеет отношения к триггеру вставки). Обратите внимание, что Firebird запускает огонь для каждой строки.

Итак, вам нужно изменить триггер на:

CREATE TRIGGER BEFORE_INSERT_MYTABLE FOR MYTABLE
ACTIVE BEFORE INSERT
AS
BEGIN
      NEW.inserted_when = current_timestamp;
END

Обратите внимание, что переменная контекста OLD никогда не поддается изменению, а переменная контекста NEW поддается изменению только в триггере BEFORE.

person Mark Rotteveel    schedule 01.09.2014

Вы можете обновлять только те поля, которые должны быть обновлены в триггере BEFORE UPDATE.

В триггере вы можете:

new.inserted_when = current_timestamp;

Триггер вызывается для каждой обновленной записи.

Если вы делаете UPDATE MYTABLE в AFTER UPDATE, вы можете попасть в бесконечный цикл.

person Harriv    schedule 01.09.2014

или просто иметь значение по умолчанию для столбца insert_when CURRENT_TIMESTAMP

тогда триггер не нужен

person NickUpson    schedule 02.09.2014