成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQLServer 觸發(fā)器保持?jǐn)?shù)據(jù)庫(kù)完整性的實(shí)際應(yīng)用

數(shù)據(jù)庫(kù) SQL Server
觸發(fā)器是SQL Server數(shù)據(jù)庫(kù)應(yīng)用中一個(gè)重要工具,是一種特殊類型的存儲(chǔ)過(guò)程,應(yīng)用非常廣泛。一般存儲(chǔ)過(guò)程主要通過(guò)存儲(chǔ)過(guò)程名而被直接調(diào)用,觸發(fā)器則是通過(guò)事件觸發(fā)執(zhí)行。那么觸發(fā)器是如何保證SQLServer數(shù)據(jù)庫(kù)的完整性的呢?

觸發(fā)器是個(gè)特殊的存儲(chǔ)過(guò)程,觸發(fā)器的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件來(lái)觸發(fā),在SQLServer數(shù)據(jù)庫(kù)中觸發(fā)器發(fā)揮了保證數(shù)據(jù)庫(kù)完整性的重要作用,下文中就為大家解析,看SQLServer數(shù)據(jù)庫(kù)中的觸發(fā)器是如何發(fā)揮這一重大作用的。

1.觸發(fā)器概述

觸發(fā)器是SQL Server數(shù)據(jù)庫(kù)應(yīng)用中一個(gè)重要工具,是一種特殊類型的存儲(chǔ)過(guò)程,應(yīng)用非常廣泛。一般存儲(chǔ)過(guò)程主要通過(guò)存儲(chǔ)過(guò)程名而被直接調(diào)用,觸發(fā)器則是通過(guò)事件觸發(fā)執(zhí)行。觸發(fā)器基于一個(gè)表來(lái)創(chuàng)建并和一個(gè)或多個(gè)數(shù)據(jù)修改操作(插入、更新或刪除)相關(guān)聯(lián),可視作表的一部分。觸發(fā)器與數(shù)據(jù)庫(kù)中的表緊密相關(guān),比如當(dāng)對(duì)表執(zhí)行Insert、Update或Delete操作時(shí),觸發(fā)器就會(huì)自動(dòng)執(zhí)行。

 

SQL Server 包括兩大類觸發(fā)器:DML 觸發(fā)器和 DDL 觸發(fā)器。其中DDL 觸發(fā)器是 SQL Server 2005 的新增功能,當(dāng)服務(wù)器或數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)定義語(yǔ)言 (DDL) 事件時(shí)將調(diào)用該觸發(fā)器;DML 觸發(fā)器是指當(dāng)數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)操作語(yǔ)言 (DML) 事件時(shí)被調(diào)用。DML 事件包括在指定表或視圖中修改數(shù)據(jù)的 Insert、Update或 Delete 語(yǔ)句。DML 觸發(fā)器可以查詢其他表,還可以包含復(fù)雜的 Transact-SQL 語(yǔ)句。DML 觸發(fā)器用于在數(shù)據(jù)被修改時(shí)強(qiáng)制執(zhí)行業(yè)務(wù)規(guī)則,以及擴(kuò)展 Microsoft SQL Server 2005 約束、默認(rèn)值和規(guī)則的完整性檢查邏輯。本文中所講述的觸發(fā)器主要是指DML 觸發(fā)器。

 

DML觸發(fā)器包括三種類型:AFTER 觸發(fā)器、INSTEAD OF 觸發(fā)器、CLR 觸發(fā)器。在執(zhí)行了 Insert、Update 或 Delete 語(yǔ)句操作之后將會(huì)執(zhí)行 AFTER 觸發(fā)器,本文將以AFTER觸發(fā)器為例來(lái)講述觸發(fā)器在保持?jǐn)?shù)據(jù)完整性中的應(yīng)用。其創(chuàng)建語(yǔ)法如下:

 

Create TRIGGER trigger_name

 

ON table_name

 

AFTER {[Insert][,][Update][,][Delete]}}

 

AS

 

Sql_statements

 

[RETURN]

 

在觸發(fā)器的應(yīng)用中,我們通常會(huì)用到兩個(gè)特殊的表:inserted表和deleted表。它們都是針對(duì)當(dāng)前觸發(fā)器的局部表。這兩個(gè)表與觸發(fā)器所在表的結(jié)構(gòu)完全相同,而且總是存儲(chǔ)在高速緩存中。當(dāng)觸發(fā)Delete觸發(fā)器后,從受影響的表中刪除的行的副本將被放置到deleted表中。同理當(dāng)觸發(fā)Insert觸發(fā)器后,inserted表中保存的是剛被插入的數(shù)據(jù)行的一個(gè)副本。

 

當(dāng)一個(gè)觸發(fā)器執(zhí)行激發(fā)另一個(gè)觸發(fā)器的操作,而另一個(gè)觸發(fā)器又激發(fā)第三個(gè)觸發(fā)器,如此等等,這時(shí)就發(fā)生了觸發(fā)器的嵌套。也就是下文中用到的嵌套觸發(fā)器。DML 觸發(fā)器和 DDL 觸發(fā)器最多可以嵌套 32 層。

 

2.1.觸發(fā)器的應(yīng)用

 

我們以BBS論壇數(shù)據(jù)庫(kù)中多個(gè)關(guān)聯(lián)表的操作為例,闡述觸發(fā)器在保持?jǐn)?shù)據(jù)完整性、一致性中的應(yīng)用。

 

在BBS的程序設(shè)計(jì)中,我們經(jīng)常會(huì)碰到對(duì)一個(gè)數(shù)據(jù)表操作的同時(shí),還要自動(dòng)對(duì)另外幾個(gè)相關(guān)聯(lián)的數(shù)據(jù)表進(jìn)行操作,以保證各數(shù)據(jù)表之間數(shù)據(jù)的完整性與一致性。BBS論壇中常用的數(shù)據(jù)表有:

 

BBS_User表(存儲(chǔ)用戶信息):用于存儲(chǔ)用戶信息。字段有用戶名、密碼、積分、發(fā)帖數(shù)、等級(jí)ID、最后一次發(fā)帖、qq、Email、頭像、注冊(cè)時(shí)間等;

 

BBS_Type表:用于存儲(chǔ)大版塊信息。字段有版塊ID、版塊名稱等;

 

BBS_LanMu表:存儲(chǔ)分論壇信息。字段有分論壇ID、名稱、所屬大版塊ID、主題總數(shù)、回復(fù)總數(shù)、版主等;

 

BBS_Topic表:存儲(chǔ)帖子信息。字段有帖子ID、標(biāo)題、內(nèi)容、發(fā)帖人、所屬分論壇ID、回復(fù)總數(shù)、點(diǎn)擊總數(shù)、最后一次回貼時(shí)間、回帖人等;

 

BBS_Reply表:存儲(chǔ)回復(fù)信息。字段有回復(fù)內(nèi)容、回復(fù)人、回復(fù)的帖子ID、回復(fù)時(shí)間等。

 

在BBS論壇中,觸發(fā)器主要應(yīng)用于以下幾種情況:

 

當(dāng)用戶在分論壇里發(fā)表帖子時(shí),對(duì)BBS_Topic表進(jìn)行操作,但同時(shí)要自動(dòng)對(duì)分論壇表BBS_LanMu里面的論壇主題總數(shù)增1,還要更新BBS_User表給該用戶增加相應(yīng)的積分,當(dāng)用戶積分達(dá)到一定分?jǐn)?shù)時(shí),自動(dòng)更新該用戶的等級(jí)ID,表示該用戶已經(jīng)升了一個(gè)等級(jí)。

 

當(dāng)用戶回復(fù)帖子時(shí),對(duì)BBS_Reply表操作的同時(shí),也需要對(duì)分論壇表BBS_LanMu里的回復(fù)總數(shù)增1、對(duì)BBS_Topic表的回復(fù)總數(shù)增1并更新該表里的最后回帖標(biāo)題和時(shí)間,還要將BBS_User表里的該用戶的發(fā)帖數(shù)增1、自動(dòng)增加相應(yīng)積分、更新最后發(fā)帖標(biāo)題和時(shí)間等;

 

在論壇的后臺(tái)管理中,管理員有時(shí)需要添加或者刪除一個(gè)大版塊。當(dāng)我們要?jiǎng)h除BBS_Type表一個(gè)大版塊時(shí),為了保證數(shù)據(jù)庫(kù)各表中數(shù)據(jù)的完整性與一致性,要同時(shí)對(duì)BBS_LanMu表、BBS_Topic表、BBS_Reply表中相關(guān)聯(lián)的數(shù)據(jù)記錄一并刪除。

 

下面將以后臺(tái)管理中對(duì)論壇大版塊進(jìn)行刪除操作時(shí)應(yīng)用觸發(fā)器為例來(lái)進(jìn)行具體介紹。

 

(1) 需求分析

 

在一個(gè)論壇中有許多個(gè)大版塊,每個(gè)版塊又對(duì)應(yīng)多個(gè)分論壇。每個(gè)論壇又對(duì)應(yīng)多個(gè)帖子,每個(gè)帖子又對(duì)應(yīng)多個(gè)回復(fù)信息。因此需要4個(gè)相關(guān)聯(lián)的表來(lái)存儲(chǔ)相應(yīng)的信息:BBS_Type表(存儲(chǔ)大版塊信息)、BBS_LanMu表(存儲(chǔ)分論壇信息)、BBS_Topic表(存儲(chǔ)帖子信息)、BBS_Reply表(存儲(chǔ)回復(fù)信息)。BBS_Type與BBS_LanMu、BBS_LanMu與BBS_Topic、BBS_Topic與BBS_Reply之間都是一對(duì)多的關(guān)系。

 

當(dāng)我們要?jiǎng)h除BBS_Type表一個(gè)大版塊時(shí),為了保證數(shù)據(jù)庫(kù)各表中數(shù)據(jù)的完整性與一致性,需要同時(shí)對(duì)BBS_LanMu表、BBS_Topic表、BBS_Reply表中相關(guān)聯(lián)的數(shù)據(jù)記錄一并刪除。因?yàn)檫@里面存在3對(duì)一對(duì)多的關(guān)系,如果在程序中或者存儲(chǔ)過(guò)程實(shí)現(xiàn),顯然是很困難也是不合理的。根據(jù)觸發(fā)器的作用以及這4個(gè)表之間的關(guān)系,采用嵌套觸發(fā)器來(lái)實(shí)現(xiàn)這個(gè)刪除功能。為BBS_Type表、BBS_LanMu表、BBS_Topic表分別建立一個(gè)AFTER觸發(fā)器,該觸發(fā)器由Delete事件觸發(fā)。采用嵌套觸發(fā)器可以在數(shù)據(jù)庫(kù)里自動(dòng)完成這多個(gè)表中相關(guān)記錄的刪除,大大簡(jiǎn)化了業(yè)務(wù)邏輯。這樣即保證了數(shù)據(jù)的完整性與一致性,又保證程序設(shè)計(jì)的合理性與方便性。

 

(2)創(chuàng)建觸發(fā)器

 

根據(jù)需求分析,為BBS_Type表、BBS_LanMu表、BBS_Topic表分別建立AFTER觸發(fā)器,該觸發(fā)器由Delete事件觸發(fā)。建立在這3個(gè)表之上的觸發(fā)器之間是嵌套觸發(fā)的關(guān)系,即BBS_Type表上的觸發(fā)器觸發(fā)BBS_LanMu表上的觸發(fā)器,BBS_LanMu表上的觸發(fā)器再觸發(fā)BBS_Topic表上的觸發(fā)器。本文中使用的數(shù)據(jù)庫(kù)為Microsoft SQL Server 2005。要讓觸發(fā)器能嵌套觸發(fā)必須在數(shù)據(jù)庫(kù)“屬性”中,將“遞歸觸發(fā)器已啟用”設(shè)置為TRUE。

 

1.為BBS_Type表(存儲(chǔ)大版塊信息)建立觸發(fā)器DelType。該觸發(fā)器功能是刪除BBS_LanMu表中屬于剛刪除的大版塊的所有分論壇信息。

 

Create trigger [DelType] on [dbo]。[BBS_Type]

 

after delete

 

as

 

begin

 

declare @typeid int

 

select @typeid=TypeID from deleted 獲得要被刪除的版塊ID

 

delete from dbo.BBS_LanMu where Typeid=@typeid

 

end

 

2.為BBS_LanMu表(存儲(chǔ)分論壇信息)建立觸發(fā)器DelLanmu。該觸發(fā)器功能是刪除BBS_Topic表中屬于剛刪除分論壇的所有帖子信息。

 

Create trigger [DelLanmu] on [dbo]。[BBS_LanMu]

 

AFTER Delete

 

as

 

BEGIN

 

declare @lmid int

 

select @lmid=LMID from deleted 獲得要被刪除的分論壇ID

 

delete from dbo.BBS_Topic where LMID=@lmid

 

END

 

3.為BBS_Topic表(存儲(chǔ)帖子信息)建立觸發(fā)器DelTopic。該觸發(fā)器功能是刪除BBS_Reply表中屬于剛刪除帖子的所有回復(fù)信息。

 

Create trigger [DelTopic] on [dbo]。[BBS_Topic]

 

after delete

 

as

 

BEGIN

 

declare @tid int

 

select @tid=TID from deleted 獲得要被刪除的帖子ID

 

delete from dbo.BBS_Reply where TID=@tid

 

END

 

執(zhí)行過(guò)程

 

當(dāng)數(shù)據(jù)操作層對(duì)數(shù)據(jù)表BBS_Type發(fā)出Delete一條記錄的時(shí)候,觸發(fā)器DelType被觸發(fā),此觸發(fā)器將刪除BBS_LanMu表中屬于剛刪除的大版塊的所有分論壇信息。

 

當(dāng)DelType觸發(fā)器對(duì)數(shù)據(jù)表BBS_LanMu刪除一條記錄時(shí),又觸發(fā)BBS_LanMu表上的觸發(fā)器DelLanmu,此觸發(fā)器將刪除BBS_Topic表中屬于剛刪除分論壇的所有帖子信息。

 

當(dāng)DelLanmu觸發(fā)器對(duì)數(shù)據(jù)表BBS_Topic刪除一條記錄時(shí),又觸發(fā)觸發(fā)器DelTopic,此觸發(fā)器將刪除BBS_Reply表中屬于剛刪除帖子的所有回復(fù)信息。

 

至此數(shù)據(jù)庫(kù)中與BBS_Type中刪除記錄相關(guān)聯(lián)的所有記錄全部刪除,保證了數(shù)據(jù)庫(kù)各表數(shù)據(jù)的完整性與一致性。這個(gè)過(guò)程是在數(shù)據(jù)庫(kù)中自動(dòng)進(jìn)行的,因此速度非常快,用戶只需要對(duì)BBS_Type表發(fā)出刪除一條記錄的命令,其他表中相關(guān)的記錄會(huì)自動(dòng)刪除。

 

3.1.總結(jié):

 

觸發(fā)器能保持?jǐn)?shù)據(jù)的完整性與一致性,它可以方便地基于一個(gè)表的修改,自動(dòng)更新其他相關(guān)表的記錄,以保證數(shù)據(jù)的完整性。在數(shù)據(jù)庫(kù)的應(yīng)用中,觸發(fā)器扮演著很重要的角色。無(wú)論是作為提供高級(jí)參照完整性功能的途徑,還是執(zhí)行自動(dòng)維護(hù)非正規(guī)化數(shù)據(jù)的任務(wù),觸發(fā)器都能幫助用戶實(shí)現(xiàn)滿足實(shí)際需要的規(guī)則,簡(jiǎn)化業(yè)務(wù)邏輯,并使系統(tǒng)更方便更有效。

 

責(zé)任編輯:迎迎 來(lái)源: 中國(guó)IT實(shí)驗(yàn)室
相關(guān)推薦

2015-06-08 13:48:15

數(shù)據(jù)庫(kù)數(shù)據(jù)完整性約束表現(xiàn)

2018-07-19 06:17:09

數(shù)據(jù)完整性數(shù)據(jù)安全網(wǎng)絡(luò)安全

2015-03-12 15:44:59

2011-03-03 14:04:48

Oracle數(shù)據(jù)庫(kù)觸發(fā)器

2010-05-19 11:25:46

MySQL觸發(fā)器

2019-10-22 07:50:45

SqlServer數(shù)據(jù)庫(kù)觸發(fā)器

2022-01-27 09:00:00

數(shù)據(jù)庫(kù)工具安全

2010-04-26 14:12:23

Oracle使用游標(biāo)觸

2010-05-18 14:35:06

MySQL觸發(fā)器

2010-06-30 09:36:25

SQL Server

2011-04-01 16:35:09

SQL Server數(shù)觸發(fā)器

2011-08-10 16:46:01

DB2數(shù)據(jù)庫(kù)觸發(fā)器

2022-03-22 12:56:53

垃圾數(shù)據(jù)數(shù)據(jù)完整性

2023-09-08 08:44:09

Oracle數(shù)據(jù)庫(kù)

2010-02-26 15:41:16

WCF分布事務(wù)

2010-05-13 13:49:09

MySQL數(shù)據(jù)庫(kù)

2010-04-29 10:48:10

Oracle序列

2009-09-25 11:03:35

PCI DSS數(shù)據(jù)完整數(shù)據(jù)安全

2011-08-04 11:00:35

Oracle數(shù)據(jù)庫(kù)虛擬列復(fù)合觸發(fā)器

2011-04-02 15:05:23

觸發(fā)器數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品久久免费 | 亚洲视频免费在线播放 | a级在线观看 | 久久久久久国产精品免费免费 | 91久久国产综合久久 | 一本色道久久综合亚洲精品高清 | 日本福利视频免费观看 | 三级成人片 | 久国产 | www.久久精品| 婷婷91| 国产成人精品综合 | 亚州成人 | 九九九久久国产免费 | 99免费视频 | 国产欧美精品在线观看 | 日韩国产一区二区三区 | 精品国产青草久久久久96 | av网站免费 | 久久成人18免费网站 | 国产成人99久久亚洲综合精品 | 久久久久国产精品午夜一区 | 免费黄网站在线观看 | 国产精品美女www爽爽爽视频 | 国产亚洲精品精品国产亚洲综合 | 亚洲一区 中文字幕 | 激情毛片 | 久久只有精品 | 国产在线一区二区 | 一区二区亚洲 | 精品国产成人 | 黄色大片免费播放 | 国产精品影视在线观看 | 中文字幕一区二区三区精彩视频 | 午夜精品一区二区三区在线视频 | a精品视频 | 久久久久久综合 | 国产精品毛片 | 欧美激情一区二区三区 | 网站国产| 91精品一区 |