您好,登錄后才能下訂單哦!
這篇文章主要為大家分析了如何分析sql中的觸發(fā)器的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì)易懂,操作細(xì)節(jié)合理,具有一定參考價(jià)值。如果感興趣的話,不妨跟著跟隨小編一起來看看,下面跟著小編一起深入學(xué)習(xí)“如何分析sql中的觸發(fā)器”的知識(shí)吧。
一.觸發(fā)器是什么
觸發(fā)器(trigger)是SQL server 提供給程序員和數(shù)據(jù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲(chǔ)過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件來觸發(fā),比如當(dāng)對(duì)一個(gè)表進(jìn)行操作( insert,delete, update)時(shí)就會(huì)激活它執(zhí)行,查詢是沒有觸發(fā)器的。觸發(fā)器經(jīng)常用于加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等。 當(dāng)然我們要知道存儲(chǔ)過程是沒有返回值(return)的,而觸發(fā)器是有(return)的,
二.觸發(fā)器能干什么
觸發(fā)器可以查詢其他表,而且可以包含復(fù)雜的SQL語句。它們主要用于強(qiáng)制服從復(fù)雜的業(yè)務(wù)規(guī)則或要求。例如:您可以根據(jù)客戶當(dāng)前的帳戶狀態(tài),控制是否允許插入新訂單。這是百度百科的答案,看到不懂,那我覺得觸發(fā)器就像javaScript中的事件,點(diǎn)擊事件也好,鼠標(biāo)移入移出事件也罷,也就是說不需要我們手動(dòng)的去啟動(dòng)它,只是將事件設(shè)好,當(dāng)他根據(jù)某一行為執(zhí)行這些事件的開始(這兒也就是觸發(fā)器),有了觸發(fā)器我們完全可以在執(zhí)行第一條sql語句的時(shí)候,觸發(fā)也去執(zhí)行第二條語句(當(dāng)然這兒涉及到了觸發(fā)器的分類)
三,觸發(fā)器的分類
DDL觸發(fā)器
它是Sql Server2005新增的觸發(fā)器,主要用于審核與規(guī)范對(duì)數(shù)據(jù)庫中表,觸發(fā)器,視圖等結(jié)構(gòu)上的操作。比如在修改表,修改列,新增表,新增列等。它在數(shù)據(jù)庫結(jié)構(gòu)發(fā)生變化時(shí)執(zhí)行,我們主要用它來記錄數(shù)據(jù)庫的修改過程,以及限制程序員對(duì)數(shù)據(jù)庫的修改,比如不允許刪除某些指定表等。
DML觸發(fā)器
當(dāng)數(shù)據(jù)庫中表中的數(shù)據(jù)發(fā)生變化時(shí),包括insert,update,delete任意操作,如果我們對(duì)該表寫了對(duì)應(yīng)的DML觸發(fā)器,那么該觸發(fā)器自動(dòng)執(zhí)行。DML觸發(fā)器的主要作用在于強(qiáng)制執(zhí)行業(yè) 務(wù)規(guī)則,以及擴(kuò)展Sql Server約束,默認(rèn)值等。因?yàn)槲覀冎兰s束只能約束同一個(gè)表中的數(shù)據(jù),而觸發(fā)器中則可以執(zhí)行任意Sql命令。
例:建立一個(gè)觸發(fā)器,當(dāng)職工表執(zhí)行刪除一條記錄的時(shí)候,把被刪除的記錄添加刪除日志表里
替代觸發(fā)器
INSTEAD OF 觸發(fā)器又稱為替代觸發(fā)器,用于執(zhí)行一個(gè)替代操作來代替觸發(fā)事件的操
作。例如:針對(duì) INSERT事件的 INSTEAD OF 觸發(fā)器,它由 INSERT語句觸發(fā),當(dāng)出現(xiàn) INSERT
語句時(shí),該語句不會(huì)被執(zhí)行,而是執(zhí)行 INSTEAD OF 觸發(fā)器中定義的語句。
創(chuàng)建 INSTEAD OF 觸發(fā)器需要注意以下幾點(diǎn):
只能被創(chuàng)建在視圖上,并且該視圖沒有指定 WITH CHECK OPTION 選項(xiàng)。
不能指定 BEFORE 或 AFTER 選項(xiàng)。 FOR EACH ROW 子可是可選的,即 INSTEAD OF 觸發(fā)器只能在行級(jí)上觸發(fā)、或只能是行級(jí)觸發(fā)器,沒有必要指定。
沒有必要在針對(duì)一個(gè)表的視圖上創(chuàng)建 INSTEAD OF 觸發(fā)器,只要?jiǎng)?chuàng)建 DML 觸發(fā)器就 可以了。
系統(tǒng)事件觸發(fā)器:
登錄觸發(fā)器:
例: 創(chuàng)建登陸,退出觸發(fā)器
四,觸發(fā)器的究極作用
可在寫入數(shù)據(jù)表前,強(qiáng)制檢驗(yàn)或轉(zhuǎn)換數(shù)據(jù)。
觸發(fā)器發(fā)生錯(cuò)誤時(shí),異動(dòng)的結(jié)果會(huì)被撤銷。
部份數(shù)據(jù)庫管理系統(tǒng)可以針對(duì)數(shù)據(jù)定義語言(DDL)使用觸發(fā)器,稱為DDL觸發(fā)器。
可依照特定的情況,替換異動(dòng)的指令 (INSTEAD OF)。
五.觸發(fā)器的應(yīng)用
1.確保數(shù)據(jù)庫的安全性
可以基于時(shí)間限制用戶的操作,例如不允許下班后和節(jié)假日修改數(shù)據(jù)庫數(shù)據(jù)。
可以基于數(shù)據(jù)庫中的數(shù)據(jù)限制用戶的操作,例如不允許價(jià)格的升幅一次超過 10%。
2.實(shí)施復(fù)雜的安全性授權(quán)
利用觸發(fā)器控制實(shí)體的安全性,可以將權(quán)限藉于各種數(shù)據(jù)庫的值。
3.提供復(fù)雜的審計(jì)功能
審計(jì)用戶操作數(shù)據(jù)庫的語句。
把用戶對(duì)數(shù)據(jù)庫的更新寫入審計(jì)表。
4.維護(hù)不同數(shù)據(jù)庫之間同步表
在不同的數(shù)據(jù)庫之間可以利用快照來實(shí)現(xiàn)數(shù)據(jù)的復(fù)制,但有些系統(tǒng)要求兩個(gè)數(shù)據(jù)庫數(shù)據(jù)
實(shí)時(shí)同步,就必須利用觸發(fā)器從一個(gè)數(shù)據(jù)庫中向另一個(gè)數(shù)據(jù)庫復(fù)制數(shù)據(jù)。
5.實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)完整性規(guī)則
實(shí)現(xiàn)非標(biāo)準(zhǔn)的數(shù)據(jù)完整性檢查和約束。觸發(fā)器可產(chǎn)生比規(guī)則更為復(fù)雜的限制。與規(guī)則不
同,觸發(fā)器可以引用列或數(shù)據(jù)庫對(duì)象。
提供可變的缺省值。
6.實(shí)現(xiàn)復(fù)雜的非標(biāo)準(zhǔn)的數(shù)據(jù)庫相關(guān)完整性規(guī)則
觸發(fā)器可以對(duì)數(shù)據(jù)庫中相關(guān)的表進(jìn)行連環(huán)更新。例如,在 auths 表 author_code 列上的
刪除觸發(fā)器可導(dǎo)致相應(yīng)刪除在其它表中的與之匹配的行。
觸發(fā)器能夠拒絕或回退那些破壞相關(guān)完整性的變化,取消試圖進(jìn)行數(shù)據(jù)更新的事務(wù)。當(dāng)
插入一個(gè)與其主健不匹配的外部鍵時(shí),這種觸發(fā)器會(huì)起作用。
六.觸發(fā)器的組成
觸發(fā)器是由
觸發(fā)事件(如增刪改查).
觸發(fā)時(shí)間(即增刪改查發(fā)生之前還是之后).
觸發(fā)操作(該TRIGGER 被觸發(fā)之后的目的和意圖),
觸發(fā)對(duì)象(包括表、視圖、模式、數(shù)據(jù)庫。只有在這些對(duì)象上發(fā)生了符合觸發(fā)條件的觸發(fā)事件,才會(huì)執(zhí)行觸發(fā)操作。).
觸發(fā)條件(由 WHEN 子句指定一個(gè)邏輯表達(dá)式。只有當(dāng)該表達(dá)式的值為 TRUE 時(shí),遇到觸發(fā)事件才會(huì)自動(dòng)執(zhí)行觸發(fā)器,使其執(zhí)行觸發(fā)操作。).
觸發(fā)頻率(說明觸發(fā)器內(nèi)定義的動(dòng)作被執(zhí)行的次數(shù)。即語句級(jí)(STATEMENT)觸發(fā)
器和行級(jí)(ROW)觸發(fā)器。)
七.觸發(fā)器的觸發(fā)次序
1. 執(zhí)行 BEFORE 語句級(jí)觸發(fā)器;
2對(duì)與受語句影響的每一行
2.1 執(zhí)行 BEFORE 行級(jí)觸發(fā)器
2.2 執(zhí)行 DML 語句
2.3 執(zhí)行 AFTER 行級(jí)觸發(fā)器
3. 執(zhí)行 AFTER 語句級(jí)觸發(fā)器
八.觸發(fā)器的優(yōu)點(diǎn)
優(yōu): 觸發(fā)器可通過數(shù)據(jù)庫中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改,不過,通過級(jí)聯(lián)引用完整性約
束可以更有效地執(zhí)行這些更改。觸發(fā)器可以強(qiáng)制比用 CHECK 約束定義的約束更為復(fù)雜的
約束。與 CHECK 約束不同,觸發(fā)器可以引用其它表中的列。例如,觸發(fā)器可以使用另一
個(gè)表中的 SELECT 比較插入或更新的數(shù)據(jù),以及執(zhí)行其它操作,如修改數(shù)據(jù)或顯示用戶定
義錯(cuò)誤信息。觸發(fā)器也可以評(píng)估數(shù)據(jù)修改前后的表狀態(tài),并根據(jù)其差異采取對(duì)策。一個(gè)表中
的多個(gè)同類觸發(fā)器(INSERT、UPDATE 或 DELETE)允許采取多個(gè)不同的對(duì)策以響應(yīng)同一
個(gè)修改語句.
缺: 觸發(fā)器功能強(qiáng)大,輕松可靠地實(shí)現(xiàn)許多復(fù)雜的功能,但是它也具有一些缺點(diǎn)那
就是由于我們的濫用會(huì)造成數(shù)據(jù)庫及應(yīng)用程序的維護(hù)困難。在數(shù)據(jù)庫操作中,我們可以通過
關(guān)系、觸發(fā)器、存儲(chǔ)過程、應(yīng)用程序等來實(shí)現(xiàn)數(shù)據(jù)操作。同時(shí)規(guī)則、約束、缺省值也是保證
數(shù)據(jù)完整性的重要保障。如果我們對(duì)觸發(fā)器過分的依賴,勢必影響數(shù)據(jù)庫的結(jié)構(gòu),同時(shí)增加
了維護(hù)的復(fù)雜程序.
九.編寫觸發(fā)器的注意事項(xiàng)
首先觸發(fā)器是不接受參數(shù)的,
其次一個(gè)表上最多是可以有12個(gè)觸發(fā)器的,但是同一時(shí)間,同一事件,同一類型的觸發(fā)器只能有一個(gè),并且觸發(fā)器之間不能有矛盾,
當(dāng)然一個(gè)表中的觸發(fā)器越多,對(duì)該表的DML操作的性能影響就越大,觸發(fā)器最大為32kb,
若是確是需要,可以先建立過程,然后在觸發(fā)器中用call語句進(jìn)行調(diào)用,
在觸發(fā)的執(zhí)行部分只能用DML語句,不能使用DDL語句
觸發(fā)器中不能包含事務(wù)控制語句,因?yàn)橛|發(fā)器是觸發(fā)語句中的一部分,觸發(fā)語句被提交,回滾時(shí)觸發(fā)器也被提交或是回滾了,
在觸發(fā)器主體中調(diào)用的任何過程,函數(shù),都不能使用事務(wù)控制語句.
在觸發(fā)器主體中不能申明任何 long的 blob變量,新值new 和舊值oid也不能向表中的任何long和blob列
不同類型的觸發(fā)器的語法 格式和作用有較大區(qū)別
觸發(fā)器聲明變量附值方式的dephi類似,使用:=符號(hào)來賦值,新值new,舊值old前面不要忘記:引號(hào)符號(hào).
關(guān)于“如何分析sql中的觸發(fā)器”就介紹到這了,更多相關(guān)內(nèi)容可以搜索億速云以前的文章,希望能夠幫助大家答疑解惑,請(qǐng)多多支持億速云網(wǎng)站!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。