Question

I have a trigger on 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? I understand that i will have to use IF EXISTS. Thank you for your assistance.

Was it helpful?

Solution

You can create a DDL triggers which run at specific events, eg. 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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top