如何在 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_at
和 updated_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
如果需要,请使用类似的东西!
我的数据库有 7 个 table,每个 table 都有这些列:
created_at SMALLDATETIME NOT NULL DEFAULT GETDATE(),
updated_at SMALLDATETIME NOT NULL DEFAULT GETDATE()
如您所见,当您将数据插入 table 时,它将具有默认的 created_at
和 updated_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
如果需要,请使用类似的东西!