如何在 SQL 服务器中为整个数据库创建触发器?

How to create trigger for whole database in SQL Server?

我的数据库有 7 个 table,每个 table 都有这些列:

created_at SMALLDATETIME NOT NULL DEFAULT GETDATE(),
updated_at SMALLDATETIME NOT NULL DEFAULT GETDATE()

如您所见,当您将数据插入 table 时,它将具有默认的 created_atupdated_at 列。

据我所知,在 SQL 服务器中不可能像在 MySQL:

中那样创建自动更新的列
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

我需要投影我的数据库,因此,当插入记录时,updated_at 将被更新。

当然,我可以只创建 7 个触发器,就像那样:

CREATE TRIGGER E_U_CTD
ON Cities
FOR UPDATE
AS
    UPDATE T
    SET updated_at = SYSDATETIME()
    FROM CitiesTest AS T
    JOIN inserted AS i ON T.id = i.id;

但是有没有更方便的解决方案(如果我有 100 tables 呢)?

这里是答案。我只是从我的数据库中取出所有 tables,迭代它们并在每次迭代时为每个 table:

创建触发器
DECLARE @Itr INT, @tableName nvarchar(259), @triggerName sysname, @execTrigger nvarchar(max); SET @Itr = 0;
WHILE (SELECT COUNT(*) FROM SYS.TABLES) > @Itr
BEGIN
    SELECT @tableName = QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name),
           @triggerName = 'TRIGGER_' + LEFT(name);
            FROM sys.Tables
            ORDER BY name
            OFFSET @Itr ROWS
            FETCH NEXT 1 ROWS ONLY;
        PRINT @tableName;

    SET @execTrigger = 'CREATE TRIGGER ' + @triggerName + ' ON ' + @tableName +
                       ' FOR UPDATE as SET NOCOUNT ON; UPDATE T SET updated_at = GETDATE() ' + ' FROM ' +
                       @tableName + ' AS T JOIN inserted AS i ON T.id = i.id;';
    PRINT @execTrigger
    EXEC(@execTrigger)
    SET @Itr = @Itr + 1;
end

如果需要,请使用类似的东西!