时间: 2021-08-13 作者:daque
处事中,咱们偶尔须要领会一个现有软硬件的数据库构造,大略的说,即是想领会零点 1 、百般数据生存在哪个表 2 、在什么情景下,表中的数据会爆发革新 底下我把本人的本领写出来,即使您有更好的本领,请与我计划。 1、为数据库中的每一个交易表创造对应的革新表 当相映交易表的数据被革新时,触发器会把革新的典型和记载写进相映的革新表 革新表的字段除去囊括相映交易表的一切字段,还增添了三个字段 (1) 一个自增的id (2) 革新典型(i 插入;d 简略;u 革新) (3) 革新功夫 2、在数据库中创造一个总革新表 当任何一个交易表的数据被革新时,触发器会把革新的典型和表名写进总革新表,效率是赶快找到暂时爆发数据革新的表 总革新表有四个字段 (1) 一个自增的id (2) 革新典型(i 插入;d 简略;u 革新) (3) 革新的表名 (4) 革新功夫 3、为每一个交易表创造三个触发器,辨别对应插入、简略、窜改三种操纵 当交易表爆发革新时,会把革新前的记载、革新后的记载、简略的记载、插入的记载写入相映革新表 为此我特意写了两个保存进程,实用于sql server 2000,即使您的数据库不是sql server 2000,也可供您参考 为了新创造的表和触发器和数据库华夏有的表和触发器同名,沿用了加后缀本领,比方 表名为 users的表,相映的革新表为users+后缀,当后缀为_1234567时,革新表的表名为users_1234567 底下是保存进程p_analysis和p_clearup的剧本 /*========================================================================= 保存进程 p_analysis 效率 为领会创造一个总的革新表 update+后缀+后缀 为每个表创造一个革新表 原表名+后缀 为每个表创造三个触发器 tr_表名_+触发器典型(i:插入 d:简略 u:革新)+后缀 输出参数 @postfix,免得领会用表和交易表称呼反复,领会用触发器和原由触发珍视复 运用举例 exec p_analysis ’_1234567’ ============================================================================*/ create procedure p_analysis @postfix char(8) as --尝试能否会和数据库原有的东西名(字段名)反复 if exists(select * from sysobjects where right(name,8)=@postfix) or exists(select * from syscolumns where right(name,8)=@postfix) print ’东西名反复,请运用各别的后缀民名’ else begin --为每个表创造革新记载表 declare @tablename nvarchar(128) declare @columns varchar(8000) declare cur insensitive cursor for select name from sysobjects where xtype=’u’ and status>0 open cur fetch next from cur into @tablename while(@@fetch_status=0) begin set @columns=’’ --创造革新表 exec(’select * into ’+@tablename+@postfix+’ from ’+@tablename+’ where 1=0’) --为革新表减少三个字段 exec(’alter table ’+@tablename+@postfix + ’ add id’+@postfix+’ int identity(1,1),oprtype’+@postfix+’ char(2),oprtime’+@postfix+’ datetime default getdate()’) --为每个交易表创造三个触发器 select @columns=@columns+’,’+name from syscolumns where id=object_id(@tablename) --插入触发器 exec(’create trigger tr_’+@tablename+’_i’+@postfix+’ on ’+@tablename+’ for insert as’+ ’ insert update’+@postfix+@postfix+’(tablename,oprtype)’+ ’ values(’’’+@tablename+’’’,’’i’’)’+ ’ insert ’+@tablename+@postfix+’(oprtype’+@postfix+@columns+’)’+ ’ select ’’i’’’+@columns+’ from inserted’) --简略触发器 exec(’create trigger tr_’+@tablename+’_d’+@postfix+’ on ’+@tablename+’ for delete as’+ ’ insert update’+@postfix+@postfix+’(tablename,oprtype)’+ ’ values(’’’+@tablename+’’’,’’d’’)’+ ’ insert ’+@tablename+@postfix+’(oprtype’+@postfix+@columns+’)’+ ’ select ’’d’’’+@columns+’ from deleted’)[page_break] --革新触发器 exec(’create trigger tr_’+@tablename+’_u’+@postfix+’ on ’+@tablename+’ for update as’+ ’ insert update’+@postfix+@postfix+’(tablename,oprtype)’+ ’ values(’’’+@tablename+’’’,’’u’’)’+ ’ insert ’+@tablename+@postfix+’(oprtype’+@postfix+@columns+’)’+ ’ select ’’bu’’’+@columns+’ from deleted’+ ’ insert ’+@tablename+@postfix+’(oprtype’+@postfix+@columns+’)’+ ’ select ’’au’’’+@columns+’ from inserted’) fetch next from cur into @tablename end close cur deallocate cur --创造总记载革新表 exec(’create table update’+@postfix+@postfix+’(id numeric(18,0) identity(1,1),tablename varchar(256),oprtype char(1),oprtime datetime default getdate())’) end go /*================================================================== 保存进程 p_clearup 效率:废除兴建的表\触发器 输出参数: @postfix 默许值 _1234567 运用例子: 运用举例 exec p_clearup ’_1234567’ ====================================================================*/ create procedure p_clearup @postfix char(8)=’_1234567’ as --简略总革新表 exec(’if exists (select * from sysobjects where name =’’update’+@postfix+@postfix+’’’ and type=’’u’’)’+ ’drop table update’+@postfix+@postfix) declare @tablename nvarchar(128) declare cur cursor for select name from sysobjects where xtype=’u’ and status>0 open cur fetch next from cur into @tablename while(@@fetch_status=0) begin --简略革新表 exec(’if exists (select * from sysobjects where name =’’’+@tablename+@postfix+’’’ and type=’’u’’)’+ ’drop table ’+@tablename+@postfix) --简略插入触发器 exec(’if exists (select * from sysobjects where name =’’tr_’+@tablename+’_i’+@postfix+’’’ and type=’’tr’’)’+ ’drop trigger tr_’+@tablename+’_i’+@postfix) --简略简略触发器 exec(’if exists (select * from sysobjects where name =’’tr_’+@tablename+’_d’+@postfix+’’’ and type=’’tr’’)’+ ’drop trigger tr_’+@tablename+’_d’+@postfix) --简略革新触发器 exec(’if exists (select * from sysobjects where name =’’tr_’+@tablename+’_u’+@postfix+’’’ and type=’’tr’’)’+ ’drop trigger tr_’+@tablename+’_u’+@postfix) fetch next from cur into @tablename end close cur deallocate cur go