Невозможно включить триггер, когда какая-либо таблица обновляется.
Вы можете генерировать SQL Требуется динамически, следующее:
SELECT N'
CREATE TRIGGER trg_' + t.Name + '_Update ON ' + ObjectName + '
AFTER UPDATE
AS
BEGIN
UPDATE t
SET LastUpdate = GETDATE()
FROM ' + o.ObjectName + ' AS t
INNER JOIN inserted AS i
ON ' +
STUFF((SELECT ' AND t.' + QUOTENAME(c.Name) + ' = i.' + QUOTENAME(c.Name)
FROM sys.index_columns AS ic
INNER JOIN sys.columns AS c
ON c.object_id = ic.object_id
AND c.column_id = ic.column_id
WHERE ic.object_id = t.object_id
AND ic.index_id = ix.index_id
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 4, '') + ';
END;
GO'
FROM sys.tables AS t
INNER JOIN sys.indexes AS ix
ON ix.object_id = t.object_id
AND ix.is_primary_key = 1
CROSS APPLY (SELECT QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + '.' + QUOTENAME(t.name)) o (ObjectName)
WHERE EXISTS
( SELECT 1
FROM sys.columns AS c
WHERE c.Name = 'LastUpdate'
AND c.object_id = t.object_id
);
Формирует SQL для каждой таблицы с LastUpdate
колонки по линиям:
CREATE TRIGGER trg_TableName_Update ON [dbo].[TableName]
AFTER UPDATE
AS
BEGIN
UPDATE t
SET LastUpdate = GETDATE()
FROM [dbo].[TableName] AS t
INNER JOIN inserted AS i
ON t.[PrimaryKey] = i.[PrimaryKey];
END;
GO
полагается на каждый стол, имеющий первичный ключ, чтобы получить соединение от таблицы inserted
обратно к обновляемой таблице.
Вы можете скопировать и вставить результаты и выполнить их (я бы рекомендовал этот способ, чтобы вы могли хотя бы проверить созданный SQL или создать его в курсор и выполнить его с помощью sp_executesql
. Я бы рекомендовал первое, т.е. используйте это, чтобы сэкономить немного времени, но по-прежнему проверяйте каждый триггер до его фактического создания.
Я лично считаю, что последние измененные столбцы являются ошибочной концепцией, мне всегда кажется, что я храню досадно мало информации, если вы действительно заботитесь о ней изменения данных, а затем отслеживать их правильно с помощью таблицы аудита. Во-первых, зная, когда что-то было изменено, но что изменилось, или кто изменил его, вероятно, более раздражает, чем вообще не знает, во-вторых, он перезаписывает все предыдущие изменения, что делает поздно что более важно, чем все те, что были раньше.
Большое спасибо! Ты сокровище и спас мне жизнь ... – Bellash
Нет проблем. Если это решит вашу проблему, пожалуйста, отметьте ее как [принятый ответ] (http://meta.stackexchange.com/q/5234), чтобы указать другим людям, что ваша проблема решена, и им не нужно отправлять новые ответы или кто-то другой с той же проблемой, что и этот подход. Вы также можете просмотреть некоторые из ваших других вопросов, из 48 вопросов, которые были заданы только 3, были приняты. Если только 3 ответа помогли, тогда это нормально, но если они решили вашу проблему, тогда вы должны отметить их как ответ. – GarethD