觸發器

觸發器

數據庫原理術語
觸發器(trigger)是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由個事件來觸發,比如當對一個表進行操作(insert,delete,update)時就會激活它執行。每個觸發器都包含确定觸發器激活條件的設置。[1]
    中文名:觸發器 外文名: 适用領域: 所屬學科: 屬性:特殊的存儲過程 英文名:trigger

觸發器

數據庫領域名詞觸發器(trigger)是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由個事件來觸發,比如當對一個表進行操作(insert,delete,update)時就會激活它執行。觸發器經常用于加強數據的完整性約束和業務規則等。觸發器可以從DBA_TRIGGERS,USER_TRIGGERS數據字典中查到。

觸發器可以查詢其他表,而且可以包含複雜的SQL語句。它們主要用于強制服從複雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀态,控制是否允許插入新訂單。

觸發器也可用于強制引用完整性,以便在多個表中添加、更新或删除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用數據庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。

創建觸發器的SQL語法delimiter | CREATE TRIGGER ``.`` < [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] > ON FOR EACH ROW BEGIN --do something END |

工作原理

觸發器可以查詢其他表,而且可以包含複雜的SQL語句。它們主要用于強制服從複雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀态,控制是否允許插入新訂單。

觸發器也可用于強制引用完整性,以便在多個表中添加、更新或删除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用數據庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。

SQLServer包括三種常規類型的觸發器:DML觸發器、DDL觸發器和登錄觸發器。

DML觸發器

當數據庫中表中的數據發生變化時,包括insert,update,delete任意操作,如果我們對該表寫了對應的DML觸發器,那麼該觸發器自動執行。DML觸發器的主要作用在于強制執行業務規則,以及擴展SqlServer約束,默認值等。因為我們知道約束隻能約束同一個表中的數據,而觸發器中則可以執行任意Sql命令。

DDL觸發器

它是SqlServer2005新增的觸發器,主要用于審核與規範對數據庫中表,觸發器,視圖等結構上的操作。比如在修改表,修改列,新增表,新增列等。它在數據庫結構發生變化時執行,我們主要用它來記錄數據庫的修改過程,以及限制程序員對數據庫的修改,比如不允許删除某些指定表等。

登錄觸發器

登錄觸發器将為響應LOGON事件而激發存儲過程。與SQLServer實例建立用戶會話時将引發此事件。登錄觸發器将在登錄的身份驗證階段完成之後且用戶會話實際建立之前激發。因此,來自觸發器内部且通常将到達用戶的所有消息(例如錯誤消息和來自PRINT語句的消息)會傳送到SQLServer錯誤日志。如果身份驗證失敗,将不激發登錄觸發器。

觸發器的優點

觸發器可通過數據庫中的相關表實現級聯更改,不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制比用CHECK約束定義的約束更為複雜的約束。與CHECK約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的SELECT比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前後的表狀态,并根據其差異采取對策。一個表中的多個同類觸發器(INSERT、UPDATE或DELETE)允許采取多個不同的對策以響應同一個修改語句。

觸發器的優點

觸發器可通過數據庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制比用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 TABLE、CREATE INDEX 等。

ALTER 語句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。

DROP 語句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。

DISK 語句,如:DISK INIT、DISK RESIZE。

LOAD 語句,如:LOAD DATABASE、LOAD LOG。

RESTORE 語句,如:RESTORE DATABASE、RESTORE LOG。

RECONFIGURE

Truncate Table 語句在sybase的觸發器中不可使用!

慎用觸發器,觸發器功能強大,輕松可靠地實現許多複雜的功能,為什麼又要慎用呢。觸發器本身沒有過錯,但由于我們的濫用會造成數據庫及應用程序的維護困難。在數據庫操作中,我們可以通過關系、觸發器、存儲過程、應用程序等來實現數據操作……同時規則、約束、缺省值也是保證數據完整性的重要保障。如果我們對觸發器過分的依賴,勢必影響數據庫的結構,同時增加了維護的複雜程序.

觸發器特性

有三個基本特性:

(1)有兩個穩态,可分别表示二進制數碼0和1,無外觸發時可維持穩态;

(2)外觸發下,兩個穩态可相互轉換(稱翻轉),已轉換的穩定狀态可長期保持下來,這就使得觸發器能夠記憶二進制信息,常用作二進制存儲單元。

(3)有兩個互補輸出端,分别用Q和Q-表示。

數字電路領域名詞

學名“雙穩态多諧振蕩器(Bistable Multivibrator)”。觸發器(Flip Flop)是一種可以存儲電路狀态的電子元件。最簡單的是由兩個或非門,兩個輸入端和兩個輸出端組成的RS觸發器(見圖)。複雜一些的有帶時鐘(CLK)段和D(Data)端,在CLK端為高電平時跟随D端狀态,而在CLK端變為低電平的瞬間鎖存信号的D觸發器。更常用的是兩個簡單D觸發器級聯而成的在時鐘下跳沿所存信号的邊緣D觸發器,廣泛應用于計數器、運算器、存儲器等電子部件。

觸發器的類型:

按邏輯功能不同分為:RS觸發器、D觸發器、JK觸發器、T觸發器。

按觸發方式不同分為:電平觸發器、邊沿觸發器和主從觸發器。

按電路結構不同分為:基本RS觸發器和鐘控觸發器。

按存儲數據原理不同分為:靜态觸發器和動态觸發器。

按構成觸發器的基本器件不同分為:雙極型觸發器和MOS型觸發器。

照明配件

用于高強度氣體放電燈(H.I.D)的啟動,型号繁多.由于高強度氣體放電燈啟動時需要一個高電壓來使氣體電離進入等離子态,因而需要一個高壓發生器做為啟動器。這就是觸發器早期的機械型觸發器已經淘汰。現在絕大多數觸發器都是使用可控矽或高壓觸發二極管的電子觸發器,常用的型号有:OSRAM的CD-7飛利浦的SI51 SN58愛倫的ALK400等

Sqlserver示例

insert 觸發器示例

create trigger tri_insert

on student

for insert

as

declare @student_id char(10)

select @student_id=s.student_id from

student s inner join inserted i

on s.student_id=i.student_id

if @student_id='0000000001'

begin

raierror('不能插入1的學号!',16,8)

rollback tran

end

go

update觸發器示例

create trigger tri_update

on student

for update

as

if update(student_id)

begin

raiserror('學号不能修改!',16,8)

rollback tran

end

go

delete觸發器示例

create trigger tri_delete

on student

for delete

as

declare @student_id varchar(10)

select @student_id=student_id from deleted

if @student_id='admin'

begin

raiserror('錯誤',16,8)

rollback tran

end

相關詞條

相關搜索

其它詞條