|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、root帐户设置密码数据|数据库
在事情中,我们偶然必要剖析一个现有软件的数据库布局,复杂的说,就是想晓得两点
1、各类数据保留在哪一个表
2、在甚么情形下,表中的数据会产生更新
上面我把本人的办法写出来,假如您有更好的办法,请与我会商。
1、为数据库中的每个营业表创建对应的更新表
当响应营业表的数据被更新时,触发器会把更新的范例和纪录写进响应的更新表
更新表的字段除包含响应营业表的一切字段,还增加了三个字段
(1)一个自增的ID
(2)更新范例(I拔出;D删除;U更新)
(3)更新工夫
2、在数据库中创建一个总更新表
当任何一个营业表的数据被更新时,触发器会把更新的范例和表名写进总更新表,感化是疾速找到以后产生数据更新的表
总更新表有四个字段
(1)一个自增的ID
(2)更新范例(I拔出;D删除;U更新)
(3)更新的表名
(4)更新工夫
3、为每个营业表创建三个触发器,分离对应拔出、删除、修正三种操纵
当营业表产生更新时,会把更新前的纪录、更新后的纪录、删除的纪录、拔出的纪录写进响应更新表
为此我专门写了两个存储历程,合用于SQLServer2000,假如您的数据库不是SQLServer2000,也可供您参考
为了新创建的表和触发器和数据库华夏有的表和触发器同名,接纳了加后缀办法,好比
表名为Users的表,响应的更新表为Users+后缀,当后缀为_1234567时,更新表的表名为Users_1234567
上面是存储历程P_Analysis和P_ClearUp的剧本
/*=========================================================================
存储历程P_Analysis
感化
为剖析创建一个总的更新表UPDATE+后缀+后缀
为每一个表创建一个更新表原表名+后缀
为每一个表创建三个触发器TR_表名_+触发器范例(I:拔出D:删除U:更新)+后缀
输出参数@postfix,以避免剖析用表和营业表称号反复,剖析用触发器和缘由触发重视复
利用举例EXECP_Analysis_1234567
============================================================================*/
CREATEPROCEDUREP_Analysis
@postfixchar(8)
AS
--测试是不是会和数据库原本的工具名(字段名)反复
ifexists(SELECT*fromsysobjectswhereright(name,8)=@postfix)ORexists(SELECT*fromsyscolumnswhere
right(name,8)=@postfix)
print工具名反复,请利用分歧的后缀平易近名
else
begin
--为每一个表创建更新纪录表
declare@TableNamenvarchar(128)
declare@columnsvarchar(8000)
declarecurINSENSITIVEcursor
FOR
SELECTnamefromsysobjectswherextype=Uandstatus>0
OPENcur
FETCHNEXTFROMcurINTO@TableName
while(@@fetch_status=0)
BEGIN
set@columns=
--创建更新表
EXEC(SELECT*into+@TableName+@postfix+FROM+@TableName+WHERE1=0)
--为更新表增添三个字段
EXEC(altertable+@TableName+@postfix+addID+@postfix+INTIDENTITY(1,1),OprType+@postfix+
char(2),OprTime+@postfix+datetimedefaultgetdate())
--为每一个营业表创建三个触发器
SELECT@columns=@columns+,+namefromsyscolumnswhereID=object_id(@TableName)
--拔出触发器
EXEC(CREATETRIGGERTR_+@TableName+_I+@postfix+ON+@TableName+FORINSERTAS+
INSERTUPDATE+@postfix+@postfix+(TableName,OprType)+
VALUES(+@TableName+,I)+
INSERT+@TableName+@postfix+(OprType+@postfix+@columns+)+
SELECTI+@columns+FROMINSERTED)
--删除触发器
EXEC(CREATETRIGGERTR_+@TableName+_D+@postfix+ON+@TableName+FORDELETEAS+
INSERTUPDATE+@postfix+@postfix+(TableName,OprType)+
VALUES(+@TableName+,D)+
INSERT+@TableName+@postfix+(OprType+@postfix+@columns+)+
SELECTD+@columns+FROMDELETED)
--更新触发器
EXEC(CREATETRIGGERTR_+@TableName+_U+@postfix+ON+@TableName+FORUPDATEAS+
INSERTUPDATE+@postfix+@postfix+(TableName,OprType)+
VALUES(+@TableName+,U)+
INSERT+@TableName+@postfix+(OprType+@postfix+@columns+)+
SELECTBU+@columns+FROMDELETED+
INSERT+@TableName+@postfix+(OprType+@postfix+@columns+)+
SELECTAU+@columns+FROMINSERTED)
fetchnextfromcurinto@TableName
END
CLOSEcur
DEALLOCATEcur
--创建总纪录更新表
EXEC(CREATETABLEUPDATE+@postfix+@postfix+(IDnumeric(18,0)IDENTITY(1,1),TableNamevarchar(256),OprType
char(1),OprTimedatetimedefaultGETDATE()))
END
GO
/*==================================================================
存储历程P_ClearUp
感化:扫除新建的表触发器
输出参数:@postfix默许值_1234567
利用例子:利用举例EXECP_ClearUp_1234567
====================================================================*/
CREATEPROCEDUREP_ClearUp
@postfixchar(8)=_1234567
AS
--删除总更新表
EXEC(ifexists(select*fromsysobjectswherename=UPDATE+@postfix+@postfix+ANDtype=U)+
DROPTABLEUPDATE+@postfix+@postfix)
declare@TableNamenvarchar(128)
declarecurcursor
FOR
SELECTnamefromsysobjectswherextype=Uandstatus>0
OPENcur
FETCHNEXTFROMcurINTO@TableName
while(@@fetch_status=0)
BEGIN
--删除更新表
EXEC(ifexists(select*fromsysobjectswherename=+@TableName+@postfix+ANDtype=U)+
DROPTABLE+@TableName+@postfix)
--删除拔出触发器
EXEC(ifexists(select*fromsysobjectswherename=TR_+@TableName+_I+@postfix+ANDtype=TR)+
DROPTRIGGERTR_+@TableName+_I+@postfix)
--删除删除触发器
EXEC(ifexists(select*fromsysobjectswherename=TR_+@TableName+_D+@postfix+ANDtype=TR)+
DROPTRIGGERTR_+@TableName+_D+@postfix)
--删除更新触发器
EXEC(ifexists(select*fromsysobjectswherename=TR_+@TableName+_U+@postfix+ANDtype=TR)+
DROPTRIGGERTR_+@TableName+_U+@postfix)
fetchnextfromcurinto@TableName
END
CLOSEcur
DEALLOCATEcur
GO
提供TCP/IP、ODBC和JDBC等多种数据库连接路径。 |
|