




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第9 9章章 觸發(fā)器的操作與管理觸發(fā)器的操作與管理 觸發(fā)器概述觸發(fā)器是一種特殊的存儲(chǔ)過程,它在執(zhí)行語言事件時(shí)自動(dòng)生效。sql server2005 包括兩大類觸發(fā)器:dml 觸發(fā)器和 ddl 觸發(fā)器。 (1)dml 觸發(fā)器在數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)操作語言 (dml) 事件時(shí)將啟用。dml 事件包括在指定表或視圖中修改數(shù)據(jù)的 insert 語句、update 語句或 delete 語句。dml 觸發(fā)器可以查詢其他表,還可以包含復(fù)雜的 transact-sql 語句。將觸發(fā)器和觸發(fā)它的語句作為可在觸發(fā)器內(nèi)回滾的單個(gè)事務(wù)對(duì)待。如果檢測(cè)到錯(cuò)誤(例如,磁盤空間不足),則整個(gè)事務(wù)即自動(dòng)回滾。 (2)ddl 觸
2、發(fā)器是 sql server 2005 的新增功能。當(dāng)服務(wù)器或數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)定義語言 (ddl) 事件時(shí)將調(diào)用這些觸發(fā)器。 9.1 dml觸發(fā)器的創(chuàng)建和應(yīng)用 當(dāng)數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)操作語言 (dml) 事件時(shí)將調(diào)用 dml 觸發(fā)器。從而確保對(duì)數(shù)據(jù)的處理必須符合由這些sql語句所定義的規(guī)則。 dml 觸發(fā)器的主要優(yōu)點(diǎn)如下:(1)dml 觸發(fā)器可通過數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改。例如,可以在 titles 表的 title_id 列上寫入一個(gè)刪除觸發(fā)器,以使其他表中的各匹配行采取刪除操作。該觸發(fā)器用 title_id 列作為惟一鍵,在 titleauthor、sales 及 roysched 表中對(duì)
3、各匹配行進(jìn)行定位。(2)dml 觸發(fā)器可以防止惡意或錯(cuò)誤的 insert、update 以及 delete 操作,并強(qiáng)制執(zhí)行比 check 約束定義的限制更為復(fù)雜的其他限制。與 check 約束不同,dml 觸發(fā)器可以引用其他表中的列。(3)dml 觸發(fā)器可以評(píng)估數(shù)據(jù)修改前后表的狀態(tài),并根據(jù)該差異采取措施。 9.1.1 dml觸發(fā)器創(chuàng)建 當(dāng)創(chuàng)建一個(gè)觸發(fā)器時(shí)必須指定如下選項(xiàng): (1)名稱;(2)在其上定義觸發(fā)器的表;(3)觸發(fā)器將何時(shí)激發(fā);(4)激活觸發(fā)器的數(shù)據(jù)修改語句,有效選項(xiàng)為 insert、update 或 delete,多個(gè)數(shù)據(jù)修改語句可激活同一個(gè)觸發(fā)器;(5)執(zhí)行觸發(fā)操作的編程語句。
4、9.1.1 dml觸發(fā)器創(chuàng)建 dml 觸發(fā)器使用 deleted 和 inserted 邏輯表。它們?cè)诮Y(jié)構(gòu)上和觸發(fā)器所在的表的結(jié)構(gòu)相同,sql server會(huì)自動(dòng)創(chuàng)建和管理這些表。可以使用這兩個(gè)臨時(shí)的駐留內(nèi)存的表測(cè)試某些數(shù)據(jù)修改的效果及設(shè)置觸發(fā)器操作的條件。 deleted表用于存儲(chǔ)delete,update語句所影響的行的副本。在執(zhí)行delete或update語句時(shí),行從觸發(fā)器表中刪除,并傳輸?shù)絛eleted表中。 inserted表用于存儲(chǔ)insert或update語句所影響的行的副本,在一個(gè)插入或更新事務(wù)處理中,新建的行被同時(shí)添加到inserted表和觸發(fā)器表中。inserted表中的行
5、是觸發(fā)器表中新行的副本。 9.1.1 dml觸發(fā)器創(chuàng)建使用使用sql server管理平臺(tái)創(chuàng)建觸發(fā)器的過程如下:管理平臺(tái)創(chuàng)建觸發(fā)器的過程如下:在sql server管理平臺(tái)中,展開指定的服務(wù)器和數(shù)據(jù)庫(kù)項(xiàng),然后展開表,選擇并展開要在其上創(chuàng)建觸發(fā)器的表,如圖9-1所示,右擊觸發(fā)器選項(xiàng),從彈出的快捷菜單中選擇“新建觸發(fā)器”選項(xiàng),則會(huì)出現(xiàn)觸發(fā)器創(chuàng)建窗口,如圖9-2所示。最后,單擊“執(zhí)行”按鈕,即可成功創(chuàng)建觸發(fā)器。 圖9-1 新建觸發(fā)器對(duì)話框 圖9-2 新建觸發(fā)器窗口 9.1.1 dml觸發(fā)器創(chuàng)建使用使用create trigger命令創(chuàng)建命令創(chuàng)建dml觸發(fā)器的語法形式如觸發(fā)器的語法形式如下:下: cr
6、eate trigger schema_name.trigger_name on table|view with encryption execute as clause,.n for|after|instead of insert , update , delete with append not for replication as sql_statement ; .n|external name := assembly_name.class_name.method_name 9.1.1 dml觸發(fā)器創(chuàng)建例例9-1示例說明示例說明inserted,deleted表表的作用。執(zhí)行結(jié)果如右圖。
7、的作用。執(zhí)行結(jié)果如右圖。程序清單如下:程序清單如下:create table sc (sno char(10), cno char(2), score real)gocreate trigger tr1on scfor insert, update, delete as print inserted表:表:select * from insertedprint deleted表:表:select * from deletedgo圖9-3 觸發(fā)器的執(zhí)行結(jié)果 9.1.1 dml觸發(fā)器創(chuàng)建例例9-2創(chuàng)建一個(gè)觸發(fā)器,在創(chuàng)建一個(gè)觸發(fā)器,在 s 表上創(chuàng)建一個(gè)插入、表上創(chuàng)建一個(gè)插入、更新類型的觸發(fā)器。更新類
8、型的觸發(fā)器。程序清單如下:程序清單如下:create trigger tr_son sfor insert, update as begindeclare bh varchar(6)select bh =inserted.sno from inserted /*獲取獲取插入或更新操作時(shí)的新值(學(xué)號(hào))插入或更新操作時(shí)的新值(學(xué)號(hào))*/end 9.1.2 dml觸發(fā)器的應(yīng)用 1. 使用使用insert觸發(fā)器觸發(fā)器insert觸發(fā)器通常被用來更新時(shí)間標(biāo)記字段,或者驗(yàn)證被觸發(fā)器監(jiān)控的字觸發(fā)器通常被用來更新時(shí)間標(biāo)記字段,或者驗(yàn)證被觸發(fā)器監(jiān)控的字段中數(shù)據(jù)滿足要求的標(biāo)準(zhǔn),以確保數(shù)據(jù)的完整性。段中數(shù)據(jù)滿足要求
9、的標(biāo)準(zhǔn),以確保數(shù)據(jù)的完整性。例例9-3建立一個(gè)觸發(fā)器,當(dāng)向建立一個(gè)觸發(fā)器,當(dāng)向sc表中添加數(shù)據(jù)時(shí),如果添加的數(shù)據(jù)與表中添加數(shù)據(jù)時(shí),如果添加的數(shù)據(jù)與s表中的表中的數(shù)據(jù)不匹配(沒有對(duì)應(yīng)的學(xué)號(hào)),則將此數(shù)據(jù)刪除。數(shù)據(jù)不匹配(沒有對(duì)應(yīng)的學(xué)號(hào)),則將此數(shù)據(jù)刪除。程序清單如下:程序清單如下:create trigger sc_ins on sc for insert asbegindeclare bh char(5)select bh=inserted.sno from insertedif not exists(select sno from s where s.sno=bh)delete sc whe
10、re sno=bhend 9.1.2 dml觸發(fā)器的應(yīng)用 1. 使用使用insert觸發(fā)器觸發(fā)器例例9-4創(chuàng)建一個(gè)觸發(fā)器,當(dāng)插入或更新成績(jī)列時(shí),該觸發(fā)器檢查插入的創(chuàng)建一個(gè)觸發(fā)器,當(dāng)插入或更新成績(jī)列時(shí),該觸發(fā)器檢查插入的數(shù)據(jù)是否處于設(shè)定的范圍內(nèi)。數(shù)據(jù)是否處于設(shè)定的范圍內(nèi)。程序清單如下:程序清單如下:create trigger sc_insupdon scfor insert, updateasdeclare cj int,select cj=inserted.score from insertedif (cj 100) begin raiserror (成績(jī)的取值必須在成績(jī)的取值必須在0到到1
11、00之間之間, 16, 1) rollback transactionend 9.1.2 dml觸發(fā)器的應(yīng)用 2. 使用使用update觸發(fā)器觸發(fā)器 當(dāng)在一個(gè)有當(dāng)在一個(gè)有update觸發(fā)器的表中修改記錄時(shí),表中原來的記錄被移動(dòng)到觸發(fā)器的表中修改記錄時(shí),表中原來的記錄被移動(dòng)到刪除表中,修改過的記錄插入到了插入表中,觸發(fā)器可以參考刪除表和插入刪除表中,修改過的記錄插入到了插入表中,觸發(fā)器可以參考刪除表和插入表以及被修改的表,以確定如何完成數(shù)據(jù)庫(kù)操作。表以及被修改的表,以確定如何完成數(shù)據(jù)庫(kù)操作。例例9-5創(chuàng)建一個(gè)修改觸發(fā)器,該觸發(fā)器防止用戶修改表創(chuàng)建一個(gè)修改觸發(fā)器,該觸發(fā)器防止用戶修改表s的入學(xué)成績(jī)
12、。的入學(xué)成績(jī)。程序清單如下:程序清單如下:create trigger tri_s_updon sfor updateasif update(escore)beginraiserror(不能修改入學(xué)成績(jī)不能修改入學(xué)成績(jī),16,10)rollback transactionend go 9.1.2 dml觸發(fā)器的應(yīng)用 2.使用使用update觸發(fā)觸發(fā)例9-6 das數(shù)據(jù)庫(kù)由存放實(shí)時(shí)數(shù)據(jù)的數(shù)據(jù)表以及存放歷史數(shù)據(jù)的歷史表組成。由于存放實(shí)時(shí)數(shù)據(jù)的數(shù)據(jù)表不斷更新,為了保存更新過的數(shù)據(jù),在實(shí)時(shí)表和歷史表之間建立了觸發(fā)器。程序清單如下:create trigger dasd_utrigger on dasd
13、 for update as beginif update(tv) /*數(shù)據(jù)更新*/begin update dasd set ut=getdate() /*更新時(shí)間*/ from dasd,inserted where dasd.id=inserted.id insert dasdhis(id,tv,ut) select inserted.id,inserted.tv,dasd.ut from dasd,inserted where dasd.id=inserted.id /*將更新過的數(shù)據(jù)送入歷史庫(kù)*/endend 9.1.2 dml觸發(fā)器的應(yīng)用 3. 使用使用delete觸發(fā)器觸發(fā)器 d
14、elete觸發(fā)器通常用于兩種情況,第一種情況是為了防止那些確實(shí)需要?jiǎng)h除但會(huì)引起數(shù)據(jù)一致性問題的記錄的刪除,第二種情況是執(zhí)行可刪除主記錄的子記錄的級(jí)聯(lián)刪除操作。例9-8 建立一個(gè)與s表結(jié)構(gòu)一樣的表s1,當(dāng)刪除表s中的記錄時(shí),自動(dòng)將刪除掉的記錄存放到s1表中。程序清單如下:create trigger tr_del on s /*建立觸發(fā)器for delete/*對(duì)表刪除操作as insert s1 select * from deleted /*將刪除掉的數(shù)據(jù)送入表s1中*/go9.1.2 dml觸發(fā)器的應(yīng)用 3. 使用使用delete觸發(fā)器觸發(fā)器 例9-9當(dāng)刪除表s中的記錄時(shí),自動(dòng)刪除表sc中
15、對(duì)應(yīng)學(xué)號(hào)的記錄。程序清單如下:create trigger tr_del_s on s for deletebegindeclare bh char(5)select bh=deleted.sno from deleteddelete sc where sno=bhend 9.2 ddl觸發(fā)器的創(chuàng)建和應(yīng)用 ddl 觸發(fā)器會(huì)為響應(yīng)多種數(shù)據(jù)定義語言觸發(fā)器會(huì)為響應(yīng)多種數(shù)據(jù)定義語言 (ddl) 語句語句而激發(fā)。這些語句主要是以而激發(fā)。這些語句主要是以 create、alter 和和 drop 開頭的語句。開頭的語句。ddl 觸發(fā)器可用于管理任務(wù),例觸發(fā)器可用于管理任務(wù),例如審核和控制數(shù)據(jù)庫(kù)操作。如審核
16、和控制數(shù)據(jù)庫(kù)操作。ddl 觸發(fā)器一般用于以下目的:觸發(fā)器一般用于以下目的: (1)防止對(duì)數(shù)據(jù)庫(kù)架構(gòu)進(jìn)行某些更改;)防止對(duì)數(shù)據(jù)庫(kù)架構(gòu)進(jìn)行某些更改;(2)希望數(shù)據(jù)庫(kù)中發(fā)生某種情況以響應(yīng)數(shù)據(jù)庫(kù)架構(gòu)中)希望數(shù)據(jù)庫(kù)中發(fā)生某種情況以響應(yīng)數(shù)據(jù)庫(kù)架構(gòu)中的更改;的更改; (3)要記錄數(shù)據(jù)庫(kù)架構(gòu)中的更改或事件。)要記錄數(shù)據(jù)庫(kù)架構(gòu)中的更改或事件。僅在運(yùn)行觸發(fā)僅在運(yùn)行觸發(fā) ddl 觸發(fā)器的觸發(fā)器的 ddl 語句后,語句后,ddl 觸觸發(fā)器才會(huì)激發(fā)。發(fā)器才會(huì)激發(fā)。ddl 觸發(fā)器無法作為觸發(fā)器無法作為 instead of 觸發(fā)器使用。觸發(fā)器使用。 9.2.1 創(chuàng)建ddl觸發(fā)器 使用create trigger命令創(chuàng)建d
17、dl觸發(fā)器的語法形式如下: create trigger trigger_name on all server|databasewith ,.n for|after event_type|event_group,.n as sql_statement; .n|external name ; 其中: :=encryption execute as clause := assembly_name.class_name.method_name 9.2.2 ddl觸發(fā)器的應(yīng)用 在響應(yīng)當(dāng)前數(shù)據(jù)庫(kù)或服務(wù)器中處理的 transact-sql 事件時(shí),可以激發(fā) ddl 觸發(fā)器。觸發(fā)器的作用域取決于事件。 例9
18、-11 使用 ddl 觸發(fā)器來防止數(shù)據(jù)庫(kù)中的任一表被修改或刪除。 程序清單如下: create trigger safety on database for drop_table, alter_table as print you must disable trigger safety to drop or alter tables! rollback 9.2.2 ddl觸發(fā)器的應(yīng)用例9-12 使用 ddl 觸發(fā)器來防止在數(shù)據(jù)庫(kù)中創(chuàng)建表。 程序清單如下: create trigger safety on database for create_table as print create tab
19、le issued. select eventdata().value(/event_instance/tsqlcommand/commandtext)1,nvarchar(max) raiserror (new tables cannot be created in this database., 16, 1) rollback 9.3 ddl查看、修改和刪除觸發(fā)器9.3.1 查看觸發(fā)器 9.3.2 修改觸發(fā)器 9.3.3 刪除觸發(fā)器 9.3.1 查看觸發(fā)器 如果要顯示作用于表上的觸發(fā)器究竟對(duì)表有哪些操作,必須查看觸發(fā)器信息。在sql server中,有多種方法可以查看觸發(fā)器信息,其中最常用
20、的有如下兩種:(1)使用sql server管理平臺(tái)查看觸發(fā)器信息; (2)使用系統(tǒng)存儲(chǔ)過程查看觸發(fā)器。 9.3.1 查看觸發(fā)器(1)使用sql server管理平臺(tái)查看觸發(fā)器信息。在sql server管理平臺(tái)中,展開服務(wù)器和數(shù)據(jù)庫(kù),選擇并展開表,然后展開觸發(fā)器選項(xiàng),右擊需要查看的觸發(fā)器名稱,如圖9-4所示,從彈出的快捷菜單中,選擇“編寫觸發(fā)器腳本為create到新查詢編輯器窗口”,則可以看到觸發(fā)器的源代碼。 圖9-4 查看觸發(fā)器 9.3.1 查看觸發(fā)器(2)使用系統(tǒng)存儲(chǔ)過程查看觸發(fā)器。系統(tǒng)存儲(chǔ)過程sp_help、sp_helptext和sp_depends分別提供有關(guān)觸發(fā)器的不同信息。其具
21、體用途和語法形式如下。sp_help:用于查看觸發(fā)器的一般信息,如觸發(fā)器的名稱、屬性、類型和創(chuàng)建時(shí)間。sp_help 觸發(fā)器名稱sp_helptext:用于查看觸發(fā)器的正文信息。sp_helptext 觸發(fā)器名稱sp_depends:用于查看指定觸發(fā)器所引用的表或者指定的表涉及到的所有觸發(fā)器。sp_depends 觸發(fā)器名稱sp_depends 表名 9.3.2 修改觸發(fā)器通過sql server管理平臺(tái)、存儲(chǔ)過程,可以修改觸發(fā)器的正文和名稱。1使用sql server管理平臺(tái)修改觸發(fā)器正文。 在管理平臺(tái)中,展開指定的表,右擊要修改的觸發(fā)器,從彈出的快捷菜單中選擇“修改”選項(xiàng),則會(huì)出現(xiàn)觸發(fā)器修
22、改窗口,如圖9-5所示。在文本框中修改觸發(fā)器的sql語句,單擊“語法檢查”按鈕,可以檢查語法是否正確,單擊“執(zhí)行”按鈕,可以成功修改此觸發(fā)器。 圖9-5 觸發(fā)器修改窗口 9.3.2 修改觸發(fā)器修改修改dml觸發(fā)器的語法形式如下:觸發(fā)器的語法形式如下: alter trigger schema_name.trigger_name on (table|view) with ,.n (for|after|instead of) delete,insert,update not for replication as sql_statement;.n|external name ; :=encrypti
23、on&lexecute as clause :=assembly_name.class_name.method_name修改修改ddl觸發(fā)器的語法形式如下:觸發(fā)器的語法形式如下: alter trigger trigger_name on database|all serverwith ,.n for|afterevent_type,.n|event_group as sql_statement;|external name ; :=encryption&lexecute as clause :=assembly_name.class_name.method_name 9.3.2 修改觸發(fā)器例例9-13 修改觸發(fā)器。修改觸發(fā)器。 程序清單如下:程序清單如下: create trigger s_reminder on s with encryption afte
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年貴金屬?gòu)?fù)合材料(含微型、異型)資金需求報(bào)告代可行性研究報(bào)告
- 如何看待公民抗命的政治合法性試題及答案
- 2025年環(huán)保產(chǎn)業(yè)技術(shù)升級(jí)路徑規(guī)劃:技術(shù)創(chuàng)新與產(chǎn)業(yè)變革報(bào)告
- 100萬千瓦風(fēng)電項(xiàng)目投資估算
- 福建南平水務(wù)集團(tuán)有限公司招聘臺(tái)青考試真題2024
- 2025年金融行業(yè)數(shù)據(jù)治理與數(shù)據(jù)資產(chǎn)化在金融行業(yè)金融科技風(fēng)險(xiǎn)管理人才中的應(yīng)用報(bào)告
- 城市污水處理廠擴(kuò)建項(xiàng)目2025年社會(huì)穩(wěn)定風(fēng)險(xiǎn)評(píng)估與公眾參與評(píng)估報(bào)告
- 2025年教育行業(yè)質(zhì)量評(píng)估與認(rèn)證體系教育質(zhì)量評(píng)價(jià)體系教育質(zhì)量改進(jìn)策略研究報(bào)告
- 民間文化保護(hù)與傳承的創(chuàng)新模式
- 覆蓋端到端設(shè)計(jì)流程的試題與答案
- 文言文18個(gè)虛詞及文言文120個(gè)實(shí)詞的解釋
- 江蘇省淮陰區(qū)2025屆高三下第一次測(cè)試數(shù)學(xué)試題含解析
- 人工智能賦能教師數(shù)字素養(yǎng)提升
- C919機(jī)組培訓(xùn)-導(dǎo)航系統(tǒng)
- 藥理學(xué)知到智慧樹章節(jié)測(cè)試課后答案2024年秋哈爾濱商業(yè)大學(xué)
- 智能病歷質(zhì)控系統(tǒng)需求說明
- 山東省煙臺(tái)市萊州市一中2025屆高考數(shù)學(xué)押題試卷含解析
- 2023年高考真題-生物(遼寧卷) 含答案
- 叉車出租行業(yè)市場(chǎng)調(diào)研分析報(bào)告
- 專題02代數(shù)推理題(真題2個(gè)考點(diǎn)模擬16個(gè)考點(diǎn))(原卷版+解析)
- 變壓器維修投標(biāo)方案
評(píng)論
0/150
提交評(píng)論