2012-04-16 150 views
42

我很難理解'行級觸發器'和'語句級觸發器'之間的區別。行級觸發器與語句級觸發器

從我的理解來看,在這個場景中,語句級觸發器是create,整個表都可以被修改。行級觸發器只允許我修改由觸發器的特定事件影響的元組。

這是正確的嗎? 有沒有人有這兩個的例子?

謝謝!

回答

67

主要的區別不是觸發器可以修改哪些,這取決於DBMS。觸發器(行或語句級別)可能會修改同一表或其他表中的一行或多行,也可能具有級聯效應(觸發其他操作/觸發器),但所有這些取決於DBMS當然。

主要區別在於激活觸發器的次數。想象一下,你有一個100萬行的表,並且在運行:

UPDATE t 
SET columnX = columnX + 1 

語句級觸發器將被激活一次(即使沒有行被更新)。行級觸發器將被激活一百萬次,每更新一次行


另一個區別是命令或激活。

Before the triggering statement executes 
Before each row that the triggering statement affects 
After each row that the triggering statement affects 
After the triggering statement executes 

在前面的例子中,我們會碰到這樣的:

Before statement-level trigger executes 

    Before row-level trigger executes 
    One row is updated 
    After row-level trigger executes 

    Before row-level trigger executes 
    Second row is updated 
    After row-level trigger executes 

    ... 

    Before row-level trigger executes 
    Millionth row is updated 
    After row-level trigger executes 

After statement-level trigger executes 
+0

因此,語句級觸發器將能夠修改一行,而行級將能夠修改表中的每一行? – 2012-04-16 00:31:11

+2

不,行級觸發器也可用於更新/刪除/插入多行。或其他表中的行。 – 2012-04-16 00:35:46

+1

還有一個語句級觸發器。 – 2012-04-16 00:36:13

17

您可能需要觸發操作。例如Oracle中的4種不同類型的觸發器將按照下面的順序被激活在客戶端執行一條修改一百萬行的語句(語句級觸發器)後執行一次。或者,您可能需要爲每個修改過的行(行級觸發)觸發一次操作。

示例:假設您有一個觸發器,可以確保所有高中畢業生畢業。也就是說,當一個高年級的成績是12,而我們增加到13時,我們想要將成績設置爲NULL

對於語句級別的觸發器,您會說在升級語句運行後,檢查整個表格一次,以更新13級至NULL之間的任何n行。

對於行級觸發器,你會說,每一個被更新的行後,更新的新行的檔次NULL如果是13

語句級觸發器是這樣的:

create trigger stmt_level_trigger 
after update on Highschooler 
begin 
    update Highschooler 
    set grade = NULL 
    where grade = 13; 
end; 

和行級觸發器是這樣的:

create trigger row_level_trigger 
after update on Highschooler 
for each row 
when New.grade = 13 
begin 
    update Highschooler 
    set grade = NULL 
    where New.ID = Highschooler.ID; 
end; 

注意,SQLite不支持的語句級觸發器,所以在SQLite的,該FOR EACH ROW是可選的。

0

語句級觸發器是隻有一次的DML語句行LEVAL觸發器爲每個行的DML語句

如果要在行數被修改那麼就可以通過語句級觸發器可以執行該語句
0

。 。 viseversa ...當你想執行你的語句每行修改你的行數,那麼你需要去行級觸發器..

例如:語句級觸發器適用於表修改時..然後更多的記錄受到影響。 和行級觸發器將各行更新用或修改..

1

語句級觸發器之間的主要區別是下面的工作:

語句級觸發器:基於名稱,如果執行任何聲明它的工作原理。 不取決於有多少行或任何行影響。它只執行一次。 Exp:如果您想更新部門HR的每位員工的薪水,並且最終想知道有多少行受到影響意味着有多少薪水增加,然後使用語句級別觸發器。 請注意,即使零行被更新,觸發器也會執行,因爲如果任何語句已被執行,則會觸發語句級觸發器。無論它是否影響任何行都不重要。

行級觸發:每次行受到影響時執行。如果零行受到影響,則不執行行級別觸發器。如果要從部門爲HR的emp表中刪除一個僱員僱員,並且希望僱員從emp表中刪除,HR部門的部門表中的人數應該減少1.然後你應該選擇行級觸發器。