简体   繁体   English

SQL Server2012。触发器。 创建表时如何自动创建触发器

[英]SQL Server 2012. Trigger. How to automatically create trigger when table created

I have a trigger on SQL. 我有一个SQL触发器。 It is for auditing tables. 它用于审核表。 How can I get this trigger to be automatically assigned to a new table whenever a new table is created? 每当创建新表时,如何使该触发器自动分配给新表? Would I create an [ALL][SERVER] trigger to run a script to create a trigger? 我会创建一个[ALL] [SERVER]触发器来运行脚本来创建触发器吗? I understand that i will have to use IF EXISTS. 我知道我将不得不使用IF EXISTS。 Thank you for your assistance. 谢谢您的帮助。

You can create a DDL triggers which run at specific events, eg. 您可以创建在特定事件下运行的DDL触发器 ,例如。 when you create a table in a database. 在数据库中创建表时。 Eg: 例如:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM