SQL:游标生成触发脚本

发布时间 2023-07-21 07:40:10作者: samrv

为了跟踪当前操作界面会写入哪个表,对系统表做一个写表的日志,

快速生成所有表的触发器脚本

declare c_tbl cursor for 
 SELECT OBJ.NAME AS [TABLE_NAME],obj.object_id as table_object_id    
FROM SYS.ALL_OBJECTS OBJ
where 1=1 
 and obj.type='U'
 AND OBJ.object_id>0 ;
 declare @fetch_status_tbl int,
    @table_name nvarchar(128),
	@table_object_id bigint;
begin
/**
-- 写表的日志表
  create table Write_Table_Log(
   log_id int identity(1,1) primary key,
   table_name nvarchar(128),
   primary_field nvarchar(128),
   [event] nvarchar(128),
   creation_date datetime,
   [value] nvarchar(128)
   ); 
*/
   open c_tbl ;
   fetch next from c_tbl into @table_name, @table_object_id 
   set @fetch_status_tbl = @@FETCH_STATUS
   while @fetch_status_tbl = 0
   begin
     
	 print 'if object_id(''' +@table_name +'_rv_tr'',''TR'') IS NOT NULL ';
	 print '  drop trigger [' +@table_name +'_rv_tr];';
	 print 'GO ';
	 print 'Create Trigger [' +@table_name +'_rv_tr] on [' +@table_name +'] ';
	 print ' for insert, update '
	 print 'as '
	 print 'begin '
	 print '  declare @AutoID nvarchar(120) ';
	 print '  select @AutoID = null from inserted';
	 print ' insert into dbo.Write_Table_Log([table_name],primary_field,[event],creation_date,[value]) ';
	 print ' values( '''+@table_name+''',null,''update'',getdate(),@AutoID);';
	 print 'end;';
	 print 'GO'
	 print ' ';
     fetch next from c_tbl into @table_name, @table_object_id 
     set @fetch_status_tbl = @@FETCH_STATUS
   end;
   close c_tbl;
   deallocate c_tbl;
end;

  待解决问题:

1、确定表主键

2、主键对应的值。