天天看點

資料庫筆記(SQL之觸發器)1 觸發器概述2 觸發器觸發時機3 觸發器觸發條件4 觸發器的完整聲明

1 觸發器概述

觸發器是當資料庫内容發生修改時,資料庫系統自動執行的一系列語句。

對于資料庫的設計,主要有三點:

1. 什麼樣的事件進行會被資料庫進行觸發器的檢查。

2. 檢查後什麼樣的條件會導緻觸發器的觸發。

3. 觸發時什麼樣的行為會被執行。

注意:與存儲過程以及函數相同,該觸發器代碼是标準SQL。不同資料庫系統可能有着不同的文法,實際運用時還需要看相應資料庫的文檔。

2 觸發器觸發時機

觸發時機基本在進行insert、delete、update操作的時機。而這幾個操作都有兩個時間點,after以及before,分别表示操作進行前以及操作進行後。在聲明時,除了以上兩個因素之外,還要指定觸發器對應的表,使用on關鍵詞進行聲明。完整時機聲明示例如下:

對于update操作時機,還可以使用of關鍵詞選擇對于表的某個屬性進行觸發。示例如下:

3 觸發器觸發條件

觸發條件使用when語句來進行判斷。

使用for each row來表明對于每當有行被修改時都進行判斷。此時在該語句中可能會需要出現對目前進行操作的行進行命名,使用語句referencing old row as進行修改前的行的命名,referencing new row as進行修改後的行的命名。

如果需要讓觸發器在對某個表進行操作的SQL語句後進行觸發(譬如更新語句的觸發,當某個更新複數個行的更新語句進行操作之後),則使用for each statement。此時,被操作的對象成了表而不是行,需要使用referencing old table as以及referencing new table as來命名被操作的表,該表被稱為臨時表。

另外,使用for each statement時,若是觸發實際為before,則在觸發器中不能使用臨時表,但是after實際可以使用。

4 觸發器的完整聲明

觸發器的聲明包括觸發實際、觸發條件以及觸發器執行内容。其完整示例如下:

create trigger timeslot_check1 after insert on section
referencing new row as n_row
for each row
when (n_row.time_slot_id not in(
        select time_slot_id
        from time_slot))
begin
    rollback
end;