首页 > 开发 > 综合 > 正文

分析数据库的一些方法

2024-07-21 02:07:55
字体:
来源:转载
供稿:网友

在工作中,我们有时需要分析一个现有软件的数据库结构,简单的说,就是想知道两点

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)[email protected]) or exists(select * from syscolumns where

right(name,8)[email protected])
  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 '[email protected][email protected]+' from '[email protected]+' where 1=0')
 --为更新表增加三个字段
        exec('alter table '[email protected][email protected] + ' add id'[email protected]+' int identity(1,1),oprtype'[email protected]+'

char(2),oprtime'[email protected]+' datetime default getdate()')
        --为每个业务表建立三个触发器
        select @[email protected]+','+name from syscolumns where id=object_id(@tablename)

 --插入触发器
 exec('create trigger tr_'[email protected]+'_i'[email protected]+' on '[email protected]+' for insert as'+
        ' insert update'[email protected][email protected]+'(tablename,oprtype)'+
        ' values('''[email protected]+''',''i'')'+
        ' insert '[email protected][email protected]+'(oprtype'[email protected][email protected]+')'+
        ' select ''i'''[email protected]+' from inserted')

        --删除触发器
 exec('create trigger tr_'[email protected]+'_d'[email protected]+' on '[email protected]+' for delete as'+
        ' insert update'[email protected][email protected]+'(tablename,oprtype)'+
        ' values('''[email protected]+''',''d'')'+
        ' insert '[email protected][email protected]+'(oprtype'[email protected][email protected]+')'+
        ' select ''d'''[email protected]+' from deleted')

        --更新触发器
        exec('create trigger tr_'[email protected]+'_u'[email protected]+' on '[email protected]+' for update as'+
        ' insert update'[email protected][email protected]+'(tablename,oprtype)'+
        ' values('''[email protected]+''',''u'')'+
        ' insert '[email protected][email protected]+'(oprtype'[email protected][email protected]+')'+
        ' select ''bu'''[email protected]+' from deleted'+
        ' insert '[email protected][email protected]+'(oprtype'[email protected][email protected]+')'+
        ' select ''au'''[email protected]+' from inserted')

  fetch next from cur into @tablename
   end
   close cur
   deallocate cur
   --建立总记录更新表
   exec('create table update'[email protected][email protected]+'(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'[email protected][email protected]+''' and type=''u'')'+
        'drop table update'[email protected][email protected])
   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 ='''[email protected][email protected]+''' and type=''u'')'+
             'drop table '[email protected][email protected])
 --删除插入触发器
        exec('if exists (select * from sysobjects where name =''tr_'[email protected]+'_i'[email protected]+''' and type=''tr'')'+
     'drop trigger tr_'[email protected]+'_i'[email protected])
 --删除删除触发器
        exec('if exists (select * from sysobjects where name =''tr_'[email protected]+'_d'[email protected]+''' and type=''tr'')'+
      'drop trigger tr_'[email protected]+'_d'[email protected])
 --删除更新触发器
        exec('if exists (select * from sysobjects where name =''tr_'[email protected]+'_u'[email protected]+''' and type=''tr'')'+
     'drop trigger tr_'[email protected]+'_u'[email protected])
  fetch next from cur into @tablename
   end
   close cur
   deallocate cur
go

商业源码热门下载www.html.org.cn

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表