第二十章

使用觸發器強制引用完整性

•Trigger (觸發器)

•觸發器是一個給定的表上創建一個存儲過程自動執行時,表中的數據被修改

•典型的觸發應用

•通過串聯修改相關資料表

•返回違反數據完整性的變化

•執行是太複雜的規則或約束的限制

•維護重複數據

•導出數據的維護列

•執行自定義記錄

•定義一個觸發器

•觸發一個或多個數據操作語句定義一個給定的資料表

–觸發器可以被定義為insert,update或delete或它們的任意組合

•觸發觸發器

•當數據被修改,在一個表中宣告擁有觸發這項聲明觸發器“觸發”

–觸發器觸發只有一次,不管影響的行數

–觸發器觸發即使沒有行受到影響

•觸發器規則

•觸發器可以

–宣告局部變數

–引用非觸發存儲過程

•觸發器不可以

–直接調用

–使用參數

–定義在臨時表或視圖

–創建永久的資料庫物件

•minimally logged的操作(如截斷表)不會導致觸發器觸發

•建立觸發器

•語法

create trigger trigger_name

on table_name

for { insert | update | delete } [ , insert | update | delete } … ]

as

sql_statements

•刪除觸發器

•語法

drop trigger trigger_name

•禁用觸發器

•如前所述,insert,update和delete陳述的原因,觸發器定義的資料表觸發

–這樣可以降低不必要的性能當大量的數據加載到一個資料表

•你可以使用alter table命令禁用表上的觸發器,顯著提高資料庫載入的時間

–觸發器,因為經常被用來執行完整性約束,您應該謹慎禁用觸發器

–觸發器必須明確地重新啟用

•語法

alter table table name

{ enable | disable } trigger

trigger_name [ , … ]

alter table table_name

{ enable | disable } trigger

•觸發器的系統程序

•sp_depends {table_name | trigger_name}

–當給定一個資料表,列出的部份相同的數據庫引用該表的所有對象(包括觸發器)

–當給定一個觸發,列出了所有在同一個資料庫觸發器所引用的資料表

•sp_help trigger_name

–顯示指定的觸發信息

•sp_helptext trigger_name

–顯示文本用於創建指定的觸發

•sp_rename old_trigger_name, new_trigger_name

–修改觸發器的名稱

•inserted和deleted表

•在資料表中會自動創建一個觸發器,會觸發inserted和deleted

–inserted,將資料加入資料表中的任何一行

–deleted,將資行從資料表中刪除

•inserted和deleted表的規則

•這兩個資料表具有相同的列觸發器表

•觸發器可以從兩個表中選擇數據

–其他程序無法從兩個表中選擇數據

•觸發器不能修改兩個表中的數據

•每個嵌套觸發器都有自己的插入和刪除的表

–如果一個觸發器修改觸發器表中的數據,這些更改將不會反映在該觸發器的inserted和deleted表

•Triggers and Transactions

•觸發器有部分是Transactions會導致觸發

•觸發器可以返回

–整個Transactions

•返回整個事務到觸發器歸屬,執行返回而不是一個保存點名稱

•返回觸發器,聲明一個保存點,並返回到那個點

•返回非某個保存點則返回整個Transaction

–自己本身

–造成觸發本身及本聲明

•返回觸發器返回一個觸發器和陳述引發觸發程序

•語法

rollback trigger [ with raiserror error_number [ error_statement ] ]

•觸發生產實踐

•制定有效的觸發器時,應考慮以下幾個問題

–@@rowcount

•一個全域變數,返回受影響的行數透過前面的陳述

•可確定的陳述,導致觸發影響0,1,或多個行

•大多數陳述對值產生影響的@@ rowcont

–如果你需要@@rowcont值在最一開始觸發時產生,你必須聲明一個局部變量,並讓@@rowcont在該變數中存儲

–if update

•一個條件允許觸發檢查一個特定的列的變化

•它只可以使用在觸發器

•通常用於檢查,如果主鍵列中的值發生了變化

•語法

if update ( column_name ) [ { and | or } update ( column_name ) ] …

–嵌套觸發器

•一個嵌套觸發器是一個觸發器,觸發內執行觸發器修改

•嵌套的最高級別是16

–兩種基本的存儲過程和觸發器計入的最高級別

–@@nestlevel是一個全局變量,返回當前的嵌套級別

–遞回觸發器

•一個遞迴觸發器是一個觸發器時,將觸發一個觸發器修改自己的觸發器表

•默認情況下,不會造成一個觸發器,修改自己的資料表的遞迴觸發器觸發

•數據完整性方法

•回憶兩種方法對實現數據的完整性

•更新關鍵值

*主鍵的值可以更新或刪除,如果他們不引用任何鍵

•主鍵刪除或更新只能通過觸發器

•級聯的更改只能通過觸發器

•約束與觸發器

•約束的優點

–約束條件(規則)速度超過觸發器

–約束不需要額外的編碼

–他的優點是在資料進入資料庫前檢查,而不是發現存在後刪除

•觸發器的優點

–有彈性

•你可以編寫觸發器可以做任何事情

–最好業務規則也無法表達參照約束,如級聯更新或刪除

•摘要數據庫對象