欧美日韩精品在线,国内精品久久久久久久久,一级毛片恃级毛片直播,清纯唯美亚洲综合欧美色

解析SQL觸發(fā)器在保持?jǐn)?shù)據(jù)庫完整性中的實(shí)際應(yīng)用_Mssql數(shù)據(jù)庫教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:解讀為SQL Server數(shù)據(jù)庫傳數(shù)組參數(shù)的變通辦法
最近一直在做Dnn模塊的開發(fā),過程中碰到這么一個問題,需要同時插入N條數(shù)據(jù),不想在程序里控制,但是SQL Sever又不支持?jǐn)?shù)組參數(shù).所以只能用變通的辦法了.利用SQL Server強(qiáng)大的字符串處理傳把數(shù)組格式化為類似1,2,3,4,5,6。 然后在存儲過程中用SubString配合CharI

1.觸發(fā)器概述

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

SQL Server 包括兩大類觸發(fā)器:DML 觸發(fā)器和 DDL 觸發(fā)器。其中DDL 觸發(fā)器是 SQL Server 2005 的新增功能,當(dāng)服務(wù)器或數(shù)據(jù)庫中發(fā)生數(shù)據(jù)定義語言 (DDL) 事件時將調(diào)用該觸發(fā)器;DML 觸發(fā)器是指當(dāng)數(shù)據(jù)庫中發(fā)生數(shù)據(jù)操作語言 (DML) 事件時被調(diào)用。DML 事件包括在指定表或視圖中修改數(shù)據(jù)的 INSERT、UPDATE或 DELETE 語句。DML 觸發(fā)器可以查詢其他表,還可以包含復(fù)雜的 Transact-SQL 語句。DML 觸發(fā)器用于在數(shù)據(jù)被修改時強(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 語句操作之后將會執(zhí)行 AFTER 觸發(fā)器,本文將以AFTER觸發(fā)器為例來講述觸發(fā)器在保持?jǐn)?shù)據(jù)完整性中的應(yīng)用。其創(chuàng)建語法如下:

CREATE TRIGGER trigger_name

ON table_name

AFTER {[INSERT][,][UPDATE][,][DELETE]}}

AS

Sql_statements

[RETURN]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(1) 需求分析

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

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

 

 

 

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

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

1.為BBS_Type表(存儲大版塊信息)建立觸發(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表(存儲分論壇信息)建立觸發(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表(存儲帖子信息)建立觸發(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í)行過程

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

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

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

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

3.1.總結(jié):

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

 

分享:詳解MSSQL的安全設(shè)置問題
目前SQL INJECTION的攻擊測試愈演愈烈,很多大型的網(wǎng)站和論壇都相繼被注入。這些網(wǎng)站一般使用的多為SQL SERVER數(shù)據(jù)庫,正因?yàn)槿绱耍芏嗳碎_始懷疑SQL SERVER的安全性。其實(shí)SQL SERVER 2000已經(jīng)通過了美國政府的C2級安全認(rèn)證-這是該行業(yè)所能擁有的最高認(rèn)證級

來源:模板無憂//所屬分類:Mssql數(shù)據(jù)庫教程/更新時間:2009-11-16
相關(guān)Mssql數(shù)據(jù)庫教程