仓酷云

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

[学习教程] MSSQL网页设计SQL触发器在坚持数据库完全性中的实践应...

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:16:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
支持AIX、FreeBSD、HP-UX、Linux、MacOS、NovellNetware、OpenBSD、OS/2Wrap、Solaris、Windows等多种操作系统触发器是SQLServer数据库使用中一个主要工具,是一种特别范例的存储历程,使用十分普遍。一样平常存储历程次要经由过程存储历程名而被间接挪用,触发器则是经由过程事务触发实行。触发器基于一个表来创立并和一个或多个数据修正操纵(拔出、更新或删除)相干联,可视作表的一部分。触发器与数据库中的表严密相干,好比当对表实行INSERT、UPDATE或DELETE操纵时,触发器就会主动实行。SQLServer包含两年夜类触发器:DML触发器和DDL触发器。个中DDL触发器是SQLServer2005的新增功效,当服务器或数据库中产生数据界说言语(DDL)事务时将挪用该触发器;DML触发器是指当数据库中产生数据操纵言语(DML)事务时被挪用。DML事务包含在指定表或视图中修正数据的INSERT、UPDATE或DELETE语句。DML触发器能够查询其他表,还能够包括庞大的Transact-SQL语句。DML触发器用于在数据被修正时强迫实行营业划定规矩,和扩大MicrosoftSQLServer2005束缚、默许值和划定规矩的完全性反省逻辑。本文中所报告的触发器次要是指DML触发器。
DML触发器包含三品种型:AFTER触发器、INSTEADOF触发器、CLR触发器。在实行了INSERT、UPDATE或DELETE语句操纵以后将会实行AFTER触发器,本文将以AFTER触发器为例来说述触发器在坚持数据完全性中的使用。其创立语法以下:
CREATETRIGGERtrigger_name
ONtable_name
AFTER{[INSERT][,][UPDATE][,][DELETE]}}
AS
Sql_statements
[RETURN]
在触发器的使用中,我们一般会用到两个特别的表:inserted表和deleted表。它们都是针对以后触发器的部分表。这两个表与触发器地点表的布局完整不异,并且老是存储在高速缓存中。当触发DELETE触发器后,从受影响的表中删除的行的正本将被安排到deleted表中。同应当触发INSERT触发器后,inserted表中保留的是刚被拔出的数据行的一个正本。
当一个触发器实行引发另外一个触发器的操纵,而另外一个触发器又引发第三个触发器,云云等等,这时候就产生了触发器的嵌套。也就是下文顶用到的嵌套触发器。DML触发器和DDL触发器最多能够嵌套32层。
2.1.触发器的使用
我们以BBS论坛数据库中多个联系关系表的操纵为例,论述触发器在坚持数据完全性、分歧性中的使用。
在BBS的程序计划中,我们常常会碰着对一个数据表操纵的同时,还要主动对别的几个相干联的数据表举行操纵,以包管各数据表之间数据的完全性与分歧性。BBS论坛中经常使用的数据表有:
BBS_User表(存储用户信息):用于存储用户信息。字段有效户名、暗码、积分、发帖数、品级ID、最初一次发帖、qq、Email、头像、注册工夫等;
BBS_Type表:用于存储年夜版块信息。字段有版块ID、版块称号等;
BBS_LanMu表:存储分论坛信息。字段有分论坛ID、称号、所属年夜版块ID、主题总数、复兴总数、版主等;
BBS_Topic表:存储帖子信息。字段有帖子ID、题目、内容、发帖人、所属分论坛ID、复兴总数、点击总数、最初一次回贴工夫、回帖人等;
BBS_Reply表:存储复兴信息。字段有复兴内容、复兴人、复兴的帖子ID、复兴工夫等。
在BBS论坛中,触发器次要使用于以下几种情形:
当用户在分论坛里宣布帖子时,对BBS_Topic表举行操纵,但同时要主动对分论坛表BBS_LanMu内里的论坛主题总数增1,还要更新BBS_User表给该用户增添响应的积分,当用户积分到达必定分数时,主动更新该用户的品级ID,暗示该用户已升了一个品级。
当用户复兴帖子时,对BBS_Reply表操纵的同时,也必要对分论坛表BBS_LanMu里的复兴总数增1、对BBS_Topic表的复兴总数增1并更新该内外的最初回帖题目和工夫,还要将BBS_User内外的该用户的发帖数增1、主动增添响应积分、更新最初发帖题目和工夫等;
在论坛的背景办理中,办理员偶然必要增加大概删除一个年夜版块。当我们要删除BBS_Type表一个年夜版块时,为了包管数据库各表中数据的完全性与分歧性,要同时对BBS_LanMu表、BBS_Topic表、BBS_Reply表中相干联的数据纪录一并删除。
上面将今后台办理中对论坛年夜版块举行删除操纵时使用触发器为例来举行详细先容。
(1)需求剖析
在一个论坛中有很多个年夜版块,每一个版块又对应多个分论坛。每一个论坛又对应多个帖子,每一个帖子又对应多个复兴信息。因而必要4个相干联的表来存储响应的信息:BBS_Type表(存储年夜版块信息)、BBS_LanMu表(存储分论坛信息)、BBS_Topic表(存储帖子信息)、BBS_Reply表(存储复兴信息)。BBS_Type与BBS_LanMu、BBS_LanMu与BBS_Topic、BBS_Topic与BBS_Reply之间都是一对多的干系。
当我们要删除BBS_Type表一个年夜版块时,为了包管数据库各表中数据的完全性与分歧性,必要同时对BBS_LanMu表、BBS_Topic表、BBS_Reply表中相干联的数据纪录一并删除。由于这内里存在3对一对多的干系,假如在程序中大概存储历程完成,明显是很坚苦也是分歧理的。依据触发器的感化和这4个表之间的干系,接纳嵌套触发器来完成这个删除功效。为BBS_Type表、BBS_LanMu表、BBS_Topic表分离创建一个AFTER触发器,该触发器由DELETE事务触发。接纳嵌套触发器能够在数据库里主动完成这多个表中相干纪录的删除,年夜年夜简化了营业逻辑。如许即包管了数据的完全性与分歧性,又包管程序计划的公道性与便利性。
(2)创立触发器
依据需求剖析,为BBS_Type表、BBS_LanMu表、BBS_Topic表分离创建AFTER触发器,该触发器由DELETE事务触发。创建在这3个表之上的触发器之间是嵌套触发的干系,即BBS_Type表上的触发器触发BBS_LanMu表上的触发器,BBS_LanMu表上的触发器再触发BBS_Topic表上的触发器。本文中利用的数据库为MicrosoftSQLServer2005。要让触发器能嵌套触发必需在数据库“属性”中,将“递回触发器已启用”设置为TRUE。
1.为BBS_Type表(存储年夜版块信息)创建触发器DelType。该触发器功效是删除BBS_LanMu表中属于刚删除的年夜版块的一切分论坛信息。
CREATEtrigger[DelType]on[dbo]。[BBS_Type]
afterdelete
as
begin
declare@typeidint
select@typeid=TypeIDfromdeleted--取得要被删除的版块ID
deletefromdbo.BBS_LanMuwhereTypeid=@typeid
end
2.为BBS_LanMu表(存储分论坛信息)创建触发器DelLanmu。该触发器功效是删除BBS_Topic表中属于刚删除分论坛的一切帖子信息。
CREATEtrigger[DelLanmu]on[dbo]。[BBS_LanMu]
AFTERDELETE
as
BEGIN
declare@lmidint
select@lmid=LMIDfromdeleted--取得要被删除的分论坛ID
deletefromdbo.BBS_TopicwhereLMID=@lmid
END
3.为BBS_Topic表(存储帖子信息)创建触发器DelTopic。该触发器功效是删除BBS_Reply表中属于刚删除帖子的一切复兴信息。
CREATEtrigger[DelTopic]on[dbo]。[BBS_Topic]
afterdelete
as
BEGIN
declare@tidint
select@tid=TIDfromdeleted--取得要被删除的帖子ID
deletefromdbo.BBS_ReplywhereTID=@tid
END
实行历程
当数据操纵层对数据表BBS_Type收回DELETE一笔记录的时分,触发器DelType被触发,此触发器将删除BBS_LanMu表中属于刚删除的年夜版块的一切分论坛信息。
当DelType触发器对数据表BBS_LanMu删除一笔记录时,又触发BBS_LanMu表上的触发器DelLanmu,此触发器将删除BBS_Topic表中属于刚删除分论坛的一切帖子信息。
当DelLanmu触发器对数据表BBS_Topic删除一笔记录时,又触发触发器DelTopic,此触发器将删除BBS_Reply表中属于刚删除帖子的一切复兴信息。
至此数据库中与BBS_Type中删除纪录相干联的一切纪录全体删除,包管了数据库各表数据的完全性与分歧性。这个历程是在数据库中主动举行的,因而速率十分快,用户只必要对BBS_Type表收回删除一笔记录的命令,其他表中相干的纪录会主动删除。
3.1.总结:
触发器能坚持数据的完全性与分歧性,它能够便利地基于一个表的修正,主动更新其他相干表的纪录,以包管数据的完全性。在数据库的使用中,触发器饰演着很主要的脚色。不管是作为供应初级参照完全性功效的路子,仍是实行主动保护非正轨化数据的义务,触发器都能匡助用户完成满意实践必要的划定规矩,简化营业逻辑,并使体系更便利更无效。
Merge将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用
柔情似水 该用户已被删除
沙发
发表于 2015-1-19 06:28:23 | 只看该作者
对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
admin 该用户已被删除
板凳
发表于 2015-1-25 14:34:36 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
不帅 该用户已被删除
地板
发表于 2015-2-2 22:30:08 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
灵魂腐蚀 该用户已被删除
5#
发表于 2015-2-8 15:58:52 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
谁可相欹 该用户已被删除
6#
发表于 2015-2-25 20:23:48 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
再见西城 该用户已被删除
7#
发表于 2015-3-8 03:10:14 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
愤怒的大鸟 该用户已被删除
8#
发表于 2015-3-15 21:00:50 | 只看该作者
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
第二个灵魂 该用户已被删除
9#
发表于 2015-3-22 04:15:31 | 只看该作者
光写几个SQL实在叫无知。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 04:59

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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