2014-09-16 2 views
1

У меня есть столбец LastUpdate во всех таблицах моей базе данных, и я хочу сказать, что «на вставке обновления LastUpdate = getdate()»Как создать триггер для всех таблиц в базе данных SQL Server

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

ответ

6

Невозможно включить триггер, когда какая-либо таблица обновляется.

Вы можете генерировать 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. Я бы рекомендовал первое, т.е. используйте это, чтобы сэкономить немного времени, но по-прежнему проверяйте каждый триггер до его фактического создания.

Я лично считаю, что последние измененные столбцы являются ошибочной концепцией, мне всегда кажется, что я храню досадно мало информации, если вы действительно заботитесь о ней изменения данных, а затем отслеживать их правильно с помощью таблицы аудита. Во-первых, зная, когда что-то было изменено, но что изменилось, или кто изменил его, вероятно, более раздражает, чем вообще не знает, во-вторых, он перезаписывает все предыдущие изменения, что делает поздно что более важно, чем все те, что были раньше.

+0

Большое спасибо! Ты сокровище и спас мне жизнь ... – Bellash

+2

Нет проблем. Если это решит вашу проблему, пожалуйста, отметьте ее как [принятый ответ] (http://meta.stackexchange.com/q/5234), чтобы указать другим людям, что ваша проблема решена, и им не нужно отправлять новые ответы или кто-то другой с той же проблемой, что и этот подход. Вы также можете просмотреть некоторые из ваших других вопросов, из 48 вопросов, которые были заданы только 3, были приняты. Если только 3 ответа помогли, тогда это нормально, но если они решили вашу проблему, тогда вы должны отметить их как ответ. – GarethD

Смежные вопросы