供應(yīng)IC693CHS393LT模塊
供應(yīng)IC693CHS393LT模塊
觸發(fā)器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數(shù)據(jù)字典中查到。SQL3的觸發(fā)器是一個(gè)能由系統(tǒng)自動(dòng)執(zhí)行對(duì)數(shù)據(jù)庫(kù)修改的語(yǔ)句。
觸發(fā)器可以查詢其他表,而且可以包含復(fù)雜的SQL語(yǔ)句。它們主要用于強(qiáng)制服從復(fù)雜的業(yè)務(wù)規(guī)則或要求。例如:您可以根據(jù)客戶當(dāng)前的帳戶狀態(tài),控制是否允許插入新訂單。
觸發(fā)器也可用于強(qiáng)制引用完整性,以便在多個(gè)表中添加、更新或刪除行時(shí),保留在這些表之間所定義的關(guān)系。然而,強(qiáng)制引用完整性的 方法是在相關(guān)表中定義主鍵和外鍵約束。如果使用數(shù)據(jù)庫(kù)關(guān)系圖,則可以在表之間創(chuàng)建關(guān)系以自動(dòng)創(chuàng)建外鍵約束。
觸發(fā)器與存儲(chǔ)過(guò)程的 區(qū)別是觸發(fā)器不能執(zhí)行EXECUTE語(yǔ)句調(diào)用,而是在用戶執(zhí)行Transact-SQL語(yǔ)句時(shí)自動(dòng)觸發(fā)執(zhí)行。
此外觸發(fā)器是邏輯電路的基本單元電路,具有記憶功能,可用于二進(jìn)制數(shù)據(jù)儲(chǔ)存,記憶信息等。
[1] SQL Server 包括三種常規(guī)類型的觸發(fā)器:DML 觸發(fā)器、DDL 觸發(fā)器和登錄觸發(fā)器。
(在邏輯電路中根據(jù)邏輯功能不同,可分為RS觸發(fā)器,D觸發(fā)器,同步觸發(fā)器等)
DML觸發(fā)器
當(dāng)數(shù)據(jù)庫(kù)中表中的數(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命令。
DDL觸發(fā)器
它是Sql Server2005新增的觸發(fā)器,主要用于審核與規(guī)范對(duì)數(shù)據(jù)庫(kù)中表,觸發(fā)器,視圖等結(jié)構(gòu)上的操作。比如在修改表,修改列,新增表,新增列等。它在數(shù)據(jù)庫(kù)結(jié)構(gòu)發(fā)生變化時(shí)執(zhí)行,我們主要用它來(lái)記錄數(shù)據(jù)庫(kù)的修改過(guò)程,以及限制程序員對(duì)數(shù)據(jù)庫(kù)的修改,比如不允許刪除某些表等。
登錄觸發(fā)器
登錄觸發(fā)器將為響應(yīng) LOGIN 事件而激發(fā)存儲(chǔ)過(guò)程。與 SQL Server 實(shí)例建立用戶會(huì)話時(shí)將引發(fā)此事件。登錄觸發(fā)器將在登錄的身份驗(yàn)證階段完成之后且用戶會(huì)話實(shí)際建立之前激發(fā)。因此,來(lái)自觸發(fā)器內(nèi)部且通常將到達(dá)用戶的所有消息(例如錯(cuò)誤消息和來(lái)自 PRINT 語(yǔ)句的消息)會(huì)傳送到 SQL Server 錯(cuò)誤日志。如果身份驗(yàn)證失敗,將不激發(fā)登錄觸發(fā)器。編輯
觸發(fā)器可通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改,不過(guò),通過(guò)級(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è)修改語(yǔ)句。
觸發(fā)器和約束編輯
約束和觸發(fā)器在特殊情況下各有優(yōu)勢(shì)。觸發(fā)器的主要好處在于它們可以包含使用 Transact-SQL 代碼的復(fù)雜處理邏輯。因此,觸發(fā)器可以支持約束的所有功能;但它在所給出的功能上并不總是 的方法。實(shí)體完整性總應(yīng)在 級(jí)別上通過(guò)索引進(jìn)行強(qiáng)制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨(dú)立創(chuàng)建的。假設(shè)功能可以滿足應(yīng)用程序的功能需求,域完整性應(yīng)通過(guò) CHECK 約束進(jìn)行強(qiáng)制,而引用完整性(RI) 則應(yīng)通過(guò) FOREIGN KEY 約束進(jìn)行強(qiáng)制。在約束所支持的功能無(wú)法滿足應(yīng)用程序的功能要求時(shí),觸發(fā)器就極為有用。
例如:除非 REFERENCES 子句定義了級(jí)聯(lián)引用操作,否則 FOREIGN KEY 約束只能以與另一列中的值*匹配的值來(lái)驗(yàn)證列值。
CHECK 約束只能根據(jù)邏輯表達(dá)式或同一表中的另一列來(lái)驗(yàn)證列值。如果應(yīng)用程序要求根據(jù)另一個(gè)表中的列驗(yàn)證列值,則必須使用觸發(fā)器。約束只能通過(guò)標(biāo)準(zhǔn)的系統(tǒng)錯(cuò)誤信息傳遞錯(cuò)誤信息。如果應(yīng)用程序要求使用(或能從中獲益)自定義信息和較為復(fù)雜的錯(cuò)誤處理,則必須使用觸發(fā)器。
觸發(fā)器可通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改;不過(guò),通過(guò)級(jí)聯(lián)引用完整性約束可以更有效地執(zhí)行這些更改。觸發(fā)器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數(shù)據(jù)修改。當(dāng)更改外鍵且新值與主鍵不匹配時(shí),此類觸發(fā)器就可能發(fā)生作用。例如,可以在 titleauthor.title_id 上創(chuàng)建一個(gè)插入觸發(fā)器,使它在新值與 titles.title_id 中的某個(gè)值不匹配時(shí)回滾一個(gè)插入。不過(guò),通常使用 FOREIGN KEY 來(lái)達(dá)到這個(gè)目的。如果觸發(fā)器表上存在約束,則在 INSTEAD OF 觸發(fā)器執(zhí)行后但在 AFTER 觸發(fā)器執(zhí)行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發(fā)器操作并且不執(zhí)行 AFTER 觸發(fā)器。
觸發(fā)器到底可不可以在視圖上創(chuàng)建 在 SQL Server™ 聯(lián)機(jī)叢書中,是沒有說(shuō)觸發(fā)器不能在視圖上創(chuàng)建的, 并且在語(yǔ)法解釋中表明:在 CREATE TRIGGER 的 ON 之后可以是視圖。 然而,事實(shí)似乎并不是如此,很多也說(shuō)觸發(fā)器不能在視圖上創(chuàng)建。我也專門作了測(cè)試,的確如此,不管是普通視圖還是索引視圖,都無(wú)法在上面創(chuàng)建觸發(fā)器,真的是這樣嗎?
但是無(wú)可厚非的是:當(dāng)在臨時(shí)表或系統(tǒng)表上創(chuàng)建觸發(fā)器時(shí)會(huì)遭到拒絕。
深刻理解 FOR CREATE TRIGGER 語(yǔ)句的 FOR 關(guān)鍵字之后可以跟 INSERT、UPDATE、DELETE 中的一個(gè)或多個(gè),也就是說(shuō)在其它情況下是不會(huì)觸發(fā)觸發(fā)器的, 包括 SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。
相關(guān)內(nèi)容 一個(gè)有趣的應(yīng)用我們看到許多注冊(cè)系統(tǒng)在注冊(cè)后都不能更改用戶名,但這多半是由應(yīng)用程序決定的, 如果直接打開數(shù)據(jù)庫(kù)表進(jìn)行更改,同樣可以更改其用戶名, 在觸發(fā)器中利用回滾就可以巧妙地實(shí)現(xiàn)無(wú)法更改用戶名……詳細(xì)內(nèi)容 觸發(fā)器內(nèi)部語(yǔ)句出錯(cuò)時(shí)…… 這種情況下,前面對(duì)數(shù)據(jù)更改操作將會(huì)無(wú)效。舉個(gè)例子,在表中插入數(shù)據(jù)時(shí)觸發(fā)觸發(fā)器,而觸發(fā)器內(nèi)部此時(shí)發(fā)生了運(yùn)行時(shí)錯(cuò)誤,那么將返回一個(gè)錯(cuò)誤值,并且拒絕剛才的數(shù)據(jù)插入。不能在觸發(fā)器中使用的語(yǔ)句 觸發(fā)器中可以使用大多數(shù) T-SQL 語(yǔ)句,但如下一些語(yǔ)句是不能在觸發(fā)器中使用的。
CREATE 語(yǔ)句,如:CREATE DATABASE、CREATE T觸發(fā)器功能強(qiáng)大,輕松可靠地實(shí)現(xiàn)許多復(fù)雜的功能,為什么又要慎用呢。觸發(fā)器本身沒有過(guò)錯(cuò),但由于我們的濫用會(huì)造成數(shù)據(jù)庫(kù)及應(yīng)用程序的維護(hù)困難。在數(shù)據(jù)庫(kù)操作中,我們可以通過(guò)關(guān)系、觸發(fā)器、存儲(chǔ)過(guò)程、應(yīng)用程序等來(lái)實(shí)現(xiàn)數(shù)據(jù)操作…… 同時(shí)規(guī)則、約束、缺省值也是保證數(shù)據(jù)完整性的重要保障。如果我們對(duì)觸發(fā)器過(guò)分的依賴,勢(shì)必影響數(shù)據(jù)庫(kù)的結(jié)構(gòu),同時(shí)增加了維護(hù)的復(fù)雜程度。
IC693DNM200
IC693MDL644RR
IC693ALG221LT
IC693CBL306
IC693CMM321RR
IC693DNS201
IC693MDL645
IC693ALG221RR
IC693CBL307
IC693CPU311
IC693DSM302
IC693MDL645LT
IC693ALG222
IC693CBL308
IC693CPU311LT
IC693DSM302RR
IC693MDL645RR
IC693ALG222LT
IC693CBL309
IC693CPU311RR
IC693DSM314
IC693MDL646
IC693ALG222RR
IC693CBL311
IC693CPU313
IC693DSM324
IC693MDL646LT
IC693MDL646RR
IC693MDL731
IC693MDL740RR
IC693MDL750
IC693PWR331
IC693MDL648
IC693MDL731LT
IC693MDL741
IC693MDL750RR
IC693PWR331RR
IC693MDL653
IC693MDL731RR
IC693MDL741LT
IC693MDL751
IC693PWR332
IC693MDL653RR
IC693MDL732
IC693MDL741RR
IC693MDL751RR
IC693TCM302
IC693MDL654
IC693MDL732RR
IC693MDL742
IC693MDL752
IC693TCM303
IC693MDL654LT
IC693MDL733
IC693MDL742LT
IC693MDL752LT