仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 635|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL网站制作之剖析数据库的一些办法

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:33:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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等多种数据库连接路径。
乐观 该用户已被删除
沙发
发表于 2015-1-19 08:22:03 | 只看该作者
对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
兰色精灵 该用户已被删除
板凳
发表于 2015-2-1 08:35:01 | 只看该作者
呵呵,这就是偶想说的
因胸联盟 该用户已被删除
地板
发表于 2015-2-7 01:49:40 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
飘飘悠悠 该用户已被删除
5#
发表于 2015-2-19 13:53:01 | 只看该作者
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
透明 该用户已被删除
6#
发表于 2015-3-6 15:04:08 | 只看该作者
大家注意一点。如下面的例子:
只想知道 该用户已被删除
7#
发表于 2015-3-13 03:07:10 | 只看该作者
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
山那边是海 该用户已被删除
8#
发表于 2015-3-20 10:56:32 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 00:13

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表