sql中的觸發器

2021-07-14 17:30:49 字數 4046 閱讀 7123

本文結合某位大神寫的  《資料庫觸發器的分類與區別》所寫,有些例子等,均摘至此文!!!

一.觸發器是什麼

觸發器(trigger)是sql server 提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發,比如當對乙個表進行操作( insert,delete, update)時就會啟用它執行,查詢是沒有觸發器的。觸發器經常用於加強資料的完整性約束和業務規則等。 當然我們要知道儲存過程是沒有返回值(return)的,而觸發器是有(return)的,

二.觸發器能幹什麼

三,觸發器的分類

ddl觸發器

它是sql server2005新增的觸發器,主要用於審核與規範對資料庫中表,觸發器,檢視等結構上的操作。比如在修改表,修改列,新增表,新增列等。它在資料庫結構發生變化時執行,我們主要用它來記錄資料庫的修改過程,以及限制程式設計師對資料庫的修改,比如不允許刪除某些指定表等。

dml觸發器

當資料庫中表中的資料發生變化時,包括insert,update,delete任意操作,如果我們對該錶寫了對應的dml觸發器,那麼該觸發器自動執行。dml觸發器的主要作用在於強制運行業 務規則,以及擴充套件sql server約束,預設值等。因為我們知道約束只能約束同乙個表中的資料,而觸發器中則可以執行任意sql命令。      

例:建立乙個觸發器,當職工表執行刪除一條記錄的時候,把被刪除的記錄新增刪除日誌表裡

替代觸發器

instead of 觸發器又稱為替代觸發器,用於執行乙個替代操作來代替觸發事件的操

作。例如:針對 insert事件的 instead of 觸發器,它由 insert語句觸發,當出現 insert

語句時,該語句不會被執行,而是執行 instead of 觸發器中定義的語句。

建立 instead of 觸發器需要注意以下幾點:

只能被建立在檢視上,並且該檢視沒有指定 with check option 選項。

不能指定 before 或 after 選項。  for each row 子可是可選的,即                                  instead of 觸發器只能在行級上觸發、或只能是行級觸發器,沒有必要指定。

沒有必要在針對乙個表的檢視上建立 instead of 觸發器,只要建立 dml 觸發器就                  可以了。

系統事件觸發器:

登入觸發器:

例: 建立登陸,退出觸發器

四,觸發器的究極作用

可在寫入資料表前,強制檢驗或轉換資料。

觸發器發生錯誤時,異動的結果會被撤銷。

部份資料庫管理系統可以針對資料定義語言(ddl)使用觸發器,稱為ddl觸發器。

可依照特定的情況,替換異動的指令 (instead of)。

五.觸發器的應用

1.確保資料庫的安全性

可以基於時間限制使用者的操作,例如不允許下班後和節假日修改資料庫資料。

可以基於資料庫中的資料限制使用者的操作,例如不允許**的公升幅一次超過 10%。

2.實施複雜的安全性授權

利用觸發器控制實體的安全性,可以將許可權藉於各種資料庫的值。

3.提供複雜的審計功能

審計使用者運算元據庫的語句。

把使用者對資料庫的更新寫入審計表。

4.維護不同資料庫之間同步表

在不同的資料庫之間可以利用快照來實現資料的複製,但有些系統要求兩個資料庫資料

實時同步,就必須利用觸發器從乙個資料庫中向另乙個資料庫複製資料。

5.實現複雜的資料完整性規則

實現非標準的資料完整性檢查和約束。觸發器可產生比規則更為複雜的限制。與規則不

同,觸發器可以引用列或資料庫物件。

提供可變的預設值。

6.實現複雜的非標準的資料庫相關完整性規則

觸發器可以對資料庫中相關的表進行連環更新。例如,在 auths 表 author_code 列上的

刪除觸發器可導致相應刪除在其它表中的與之匹配的行。

觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試圖進行資料更新的事務。當

插入乙個與其主健不匹配的外部鍵時,這種觸發器會起作用。

六.觸發器的組成

觸發器是由

觸發事件(如增刪改查).

觸發時間(即增刪改查發生之前還是之後).

觸發操作(該trigger 被觸發之後的目的和意圖),

觸發物件(包括表、檢視、模式、資料庫。只有在這些物件上發生了符合觸發條件的觸發事件,才會執行觸發操作。).

觸發條件(由 when 子句指定乙個邏輯表示式。只有當該表示式的值為 true 時,遇到觸發事件才會自動執行觸發器,使其執行觸發操作。).

觸發頻率(說明觸發器內定義的動作被執行的次數。即語句級(statement)觸發

器和行級(row)觸發器。)

七.觸發器的觸發次序

1. 執行 before 語句級觸發器;

2對與受語句影響的每一行

2.1  執行 before 行級觸發器

2.2 執行 dml 語句

2.3 執行 after 行級觸發器

3. 執行 after 語句級觸發器

八.觸發器的優點

優: 觸發器可通過資料庫中的相關表實現級聯更改,不過,通過級聯引用完整性約

束可以更有效地執行這些更改。觸發器可以強制比用 check 約束定義的約束更為複雜的

約束。與 check 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一

個表中的 select 比較插入或更新的資料,以及執行其它操作,如修改資料或顯示使用者定

義錯誤資訊。觸發器也可以評估資料修改前後的表狀態,並根據其差異採取對策。乙個表中

的多個同類觸發器(insert、update 或 delete)允許採取多個不同的對策以響應同一

個修改語句.

缺: 觸發器功能強大,輕鬆可靠地實現許多複雜的功能,但是它也具有一些缺點那

就是由於我們的濫用會造成資料庫及應用程式的維護困難。在資料庫操作中,我們可以通過

關係、觸發器、儲存過程、應用程式等來實現資料操作。同時規則、約束、預設值也是保證

資料完整性的重要保障。如果我們對觸發器過分的依賴,勢必影響資料庫的結構,同時增加

了維護的複雜程式.

九.編寫觸發器的注意事項

首先觸發器是不接受引數的,

其次乙個表上最多是可以有12個觸發器的,但是同一時間,同一事件,同一型別的觸發器只能有乙個,並且觸發器之間不能有矛盾,

當然乙個表中的觸發器越多,對該錶的dml操作的效能影響就越大,觸發器最大為32kb,

若是確是需要,可以先建立過程,然後在觸發器中用call語句進行呼叫,

在觸發的執行部分只能用dml語句,不能使用ddl語句

觸發器中不能包含事務控制語句,因為觸發器是觸發語句中的一部分,觸發語句被提交,回滾時觸發器也被提交或是回滾了,

在觸發器主體中呼叫的任何過程,函式,都不能使用事務控制語句.

在觸發器主體中不能申明任何 long的 blob變數,新值new 和舊值oid也不能向表中的任何long和blob列

不同型別的觸發器的語法 格式和作用有較大區別

觸發器宣告變數附值方式的dephi類似,使用:=符號來賦值,新值new,舊值old前面不要忘記:引號符號.

sql中的觸發器

本文結合某位大神寫的 資料庫觸發器的分類與區別 所寫,有些例子等,均摘至此文 一.觸發器是什麼 觸發器 trigger 是sql server 提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發,比如當對...

SQL的觸發器

觸發器的概念 觸發器 trigger 是sql server 提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發,比如當對乙個表進行操作 insert,delete,update 時就會啟用它執行。個人理...

sql 觸發器 直接遞迴觸發器

create trigger dbo loving20000 on dbo s for delete asdeclare age int select age sage from deleted delete s where sage age delete from s where sname xq...