2014-09-01 3 views
2

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

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

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 ;^

ответ

4

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

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

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

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

2

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

В триггером, вы можете сделать:

new.inserted_when = current_timestamp; 

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

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

1

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

не спускового необходимости затем

+0

очень хорошо - не знал такого понятия, можно было бы сделать. – user3927897