【问题标题】:SQL Server 2012. Trigger. How to automatically create trigger when table createdSQL Server 2012。触发器。创建表时如何自动创建触发器
【发布时间】:2014-02-02 12:27:13
【问题描述】:

我有一个 SQL 触发器。它用于审计表。每当创建新表时,如何将此触发器自动分配给新表? 我会创建一个 [ALL][SERVER] 触发器来运行脚本来创建触发器吗? 我知道我将不得不使用 IF EXISTS。谢谢您的帮助。

【问题讨论】:

    标签: sql stored-procedures triggers ddl audit


    【解决方案1】:

    您可以创建一个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
    

    【讨论】:

    • 谢谢。我试过那个触发器。在这种情况下,“on DATABASE”是关键字吗?这是否意味着数据库中的任何更改?我不确定触发器的存储位置。谢谢。
    • 阅读 DDL 触发器规范的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多