供應IC693CHS393LT模塊
供應IC693CHS393LT模塊
觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。SQL3的觸發器是一個能由系統自動執行對數據庫修改的語句。
觸發器可以查詢其他表,而且可以包含復雜的SQL語句。它們主要用于強制服從復雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。
觸發器也可用于強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的 方法是在相關表中定義主鍵和外鍵約束。如果使用數據庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。
觸發器與存儲過程的 區別是觸發器不能執行EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發執行。
此外觸發器是邏輯電路的基本單元電路,具有記憶功能,可用于二進制數據儲存,記憶信息等。
[1] SQL Server 包括三種常規類型的觸發器:DML 觸發器、DDL 觸發器和登錄觸發器。
(在邏輯電路中根據邏輯功能不同,可分為RS觸發器,D觸發器,同步觸發器等)
DML觸發器
當數據庫中表中的數據發生變化時,包括insert,update,delete任意操作,如果我們對該表寫了對應的DML觸發器,那么該觸發器自動執行。DML觸發器的主要作用在于強制執行業 務規則,以及擴展Sql Server約束,默認值等。因為我們知道約束只能約束同一個表中的數據,而觸發器中則可以執行任意Sql命令。
DDL觸發器
它是Sql Server2005新增的觸發器,主要用于審核與規范對數據庫中表,觸發器,視圖等結構上的操作。比如在修改表,修改列,新增表,新增列等。它在數據庫結構發生變化時執行,我們主要用它來記錄數據庫的修改過程,以及限制程序員對數據庫的修改,比如不允許刪除某些表等。
登錄觸發器
登錄觸發器將為響應 LOGIN 事件而激發存儲過程。與 SQL Server 實例建立用戶會話時將引發此事件。登錄觸發器將在登錄的身份驗證階段完成之后且用戶會話實際建立之前激發。因此,來自觸發器內部且通常將到達用戶的所有消息(例如錯誤消息和來自 PRINT 語句的消息)會傳送到 SQL Server 錯誤日志。如果身份驗證失敗,將不激發登錄觸發器。編輯
觸發器可通過數據庫中的相關表實現級聯更改,不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制用比CHECK約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前后的表狀態,并根據其差異采取對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許采取多個不同的對策以響應同一個修改語句。
觸發器和約束編輯
約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在于它們可以包含使用 Transact-SQL 代碼的復雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上并不總是 的方法。實體完整性總應在 級別上通過索引進行強制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程序的功能需求,域完整性應通過 CHECK 約束進行強制,而引用完整性(RI) 則應通過 FOREIGN KEY 約束進行強制。在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。
例如:除非 REFERENCES 子句定義了級聯引用操作,否則 FOREIGN KEY 約束只能以與另一列中的值*匹配的值來驗證列值。
CHECK 約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程序要求根據另一個表中的列驗證列值,則必須使用觸發器。約束只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程序要求使用(或能從中獲益)自定義信息和較為復雜的錯誤處理,則必須使用觸發器。
觸發器可通過數據庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在 titleauthor.title_id 上創建一個插入觸發器,使它在新值與 titles.title_id 中的某個值不匹配時回滾一個插入。不過,通常使用 FOREIGN KEY 來達到這個目的。如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行后但在 AFTER 觸發器執行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發器操作并且不執行 AFTER 觸發器。
觸發器到底可不可以在視圖上創建 在 SQL Server™ 聯機叢書中,是沒有說觸發器不能在視圖上創建的, 并且在語法解釋中表明:在 CREATE TRIGGER 的 ON 之后可以是視圖。 然而,事實似乎并不是如此,很多也說觸發器不能在視圖上創建。我也專門作了測試,的確如此,不管是普通視圖還是索引視圖,都無法在上面創建觸發器,真的是這樣嗎?
但是無可厚非的是:當在臨時表或系統表上創建觸發器時會遭到拒絕。
深刻理解 FOR CREATE TRIGGER 語句的 FOR 關鍵字之后可以跟 INSERT、UPDATE、DELETE 中的一個或多個,也就是說在其它情況下是不會觸發觸發器的, 包括 SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。
相關內容 一個有趣的應用我們看到許多注冊系統在注冊后都不能更改用戶名,但這多半是由應用程序決定的, 如果直接打開數據庫表進行更改,同樣可以更改其用戶名, 在觸發器中利用回滾就可以巧妙地實現無法更改用戶名……詳細內容 觸發器內部語句出錯時…… 這種情況下,前面對數據更改操作將會無效。舉個例子,在表中插入數據時觸發觸發器,而觸發器內部此時發生了運行時錯誤,那么將返回一個錯誤值,并且拒絕剛才的數據插入。不能在觸發器中使用的語句 觸發器中可以使用大多數 T-SQL 語句,但如下一些語句是不能在觸發器中使用的。
CREATE 語句,如:CREATE DATABASE、CREATE T觸發器功能強大,輕松可靠地實現許多復雜的功能,為什么又要慎用呢。觸發器本身沒有過錯,但由于我們的濫用會造成數據庫及應用程序的維護困難。在數據庫操作中,我們可以通過關系、觸發器、存儲過程、應用程序等來實現數據操作…… 同時規則、約束、缺省值也是保證數據完整性的重要保障。如果我們對觸發器過分的依賴,勢必影響數據庫的結構,同時增加了維護的復雜程度。
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