分享
 
 
 

分析数据库的一些方法

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

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')

--更新触发器

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有