2015-03-11 1 views
0

Я делаю простой стол с именами, сообщениями электронной почты и т. Д., Но у меня также есть ModifiedDate. Моя идея - использовать триггер после вставки и обновления и вставить текущую дату. Таким образом, если кто-либо делает что-либо (кроме удаления) в этот столбец, дата должна отражать это.Trigger on insert and update, добавляющий дату модификации

Это, однако, не работает.

CREATE TRIGGER ModDate 
    ON X 
    AFTER INSERT, UPDATE 
AS 
BEGIN 

    INSERT INTO X (ModifiedDate) 
    VALUES (GETDATE()) 

END 

Теперь у меня есть пара значений, которые не могут быть пустыми, и что это, кажется, нужно сделать, это попытаться создать новую строку. Я хотел бы, чтобы он вставлял дату в строку, на которую в настоящее время действует, я понятия не имею, как это сделать. Также, если я добавлю сразу 5 строк?

+0

Конечно, это создает новую строку, у вас есть инструкция INSERT. Если вы хотите перехватить вставку и/или обновление, чтобы изменить одно из значений, вам нужно будет использовать триггер INSTEAD. Затем для обработки операций с несколькими строками вам необходимо создать код запуска, чтобы он ссылался на вставленную виртуальную таблицу. Я бы рекомендовал использовать два триггера, а не один. Или еще лучше было бы поместить эту логику в вашу процедуру. –

+0

@SeanLange Как бы поместить эту логику в мою «процедуру»? – Kalec

+0

Я предполагал, что вы используете процедуры для обновления и вставки, но это может быть не так. :) –

ответ

7

Вам необходимо присоединиться к виртуальной таблице inserted в триггере, чтобы ограничить строки, которые обновляются до тех, которые фактически изменены. Попробуйте это:

CREATE TRIGGER ModDate 
    ON TableX 
    AFTER INSERT, UPDATE 
AS 
BEGIN 
    UPDATE X 
    SET ModifiedDate = GETDATE() 
    FROM TableX X 
    JOIN inserted i ON X.key = i.key -- change to whatever key identifies 
            -- the tuples 
END 

Как @ZoharPeled правильно указал в комментарии ниже есть на самом деле не так много смысла в триггер обновления даты на вставке - было бы лучше использовать getdate() в качестве значения по умолчанию на колонке (или даже как другой столбец InsertedDate, если вы хотите отслеживать, когда были созданы записи), и после обновления триггер только изменит столбец ModifiedDate.

Смотрите documentation для получения дополнительной информации на вставлено и удалены таблицы.

+0

Кроме того, я бы не использовал триггер для Вставки, чтобы установить значение для столбца ModifiedDate, но просто установите его значение по умолчанию для GETDATE(). –

+0

@ ZoharPeled Да, это звучит неплохо. @jpw Спасибо, я думаю, что это будет работать только с UPDATE, если я решу сделать значение GETDATE() по умолчанию? – Kalec

+0

значения по умолчанию работают только для Insert. вам все еще нужен триггер для обновления –

-1

Имя таблицы: х
имя триггера: ModDate
обновляется поле после вставки или обновления в таблице: ModifiedDate

create trigger [dbo].[ModDate] on [dbo].[x] after insert,update 
as 
begin 

UPDATE dbo.x 
    SET x.ModifiedDate = GETDATE() 
    FROM x X 
    JOIN inserted I ON X.key = I.key 

end 
+0

Пожалуйста, проверьте этот код на сервере sql! –

+0

Пожалуйста, проверьте ответ и удалите отрицательный голос, если хотите, спасибо. –

0

Если у вас нет клавиши на данные вставки и вы не входите в команду sql, чтобы добавить значение по умолчанию в столбце modifieddate, вы можете получить триггер insert, где столбец modifieddate имеет значение null:

CREATE TRIGGER ModDate 
ON TableX 
AFTER INSERT 
AS 
BEGIN 
UPDATE tableX SET ModifiedDate = GETDATE() where modifieddate is null 
END