2014-01-14 127 views

回答

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 
+0

谢谢。我试过这个触发器。在这种情况下,“在DATABASE”上是关键字吗?这是否意味着数据库中的任何更改?我不确定触发器的存储位置。谢谢。 –

+0

阅读DDL触发器规范的链接。 –