0
我在SQL上有一个触发器。它用于审计表格。如何在创建新表时创建该触发器以自动分配给新表? 我会创建一个[ALL] [SERVER]触发器来运行脚本来创建触发器吗? 我知道我将不得不使用IF EXISTS。谢谢您的帮助。SQL Server 2012.触发器。如何在创建表时自动创建触发器
我在SQL上有一个触发器。它用于审计表格。如何在创建新表时创建该触发器以自动分配给新表? 我会创建一个[ALL] [SERVER]触发器来运行脚本来创建触发器吗? 我知道我将不得不使用IF EXISTS。谢谢您的帮助。SQL Server 2012.触发器。如何在创建表时自动创建触发器
您可以创建在特定事件下运行的DDL triggers,例如。当你在数据库中创建一个表时。例如:
create table audit(table_name sysname, data xml)
go
CREATE trigger on_create_table
on DATABASE
for CREATE_TABLE
as
begin
declare @x xml = EVENTDATA();
declare @tableName sysname, @schemaName sysname, @triggerName sysname;
set @schemaName = @x.value(N'(/EVENT_INSTANCE/SchemaName)[1]', N'sysname');
set @tableName = @x.value(N'(/EVENT_INSTANCE/ObjectName)[1]', N'sysname');
set @triggerName = @tableName + N'_trg';
declare @sql nvarchar(max);
set @sql = N'create trigger ' +quotename(@schemaName) + N'.' + quotename(@triggerName) + N'
on ' + quotename(@tableName) + N'
after INSERT
as
set nocount on;
declare @event xml;
set @event = (select * from INSERTED for xml auto, type);
insert into audit (table_name, data) values (' + quotename(@tableName, '''') +N', @event);';
-- print @sql;
execute sp_executesql @sql;
end
go
create table t (a int);
go
insert into t (a) values (1)
go
select * from audit;
go
谢谢。我试过这个触发器。在这种情况下,“在DATABASE”上是关键字吗?这是否意味着数据库中的任何更改?我不确定触发器的存储位置。谢谢。 –
阅读DDL触发器规范的链接。 –