sql-行級觸發器與語句級trigg

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

據我了解,在創建語句級別觸發器的情況下,可以修改整個表。 行級觸發器只會允許我修改受觸發器的特定事件影響的元組。

它是否正確?有人舉兩個例子嗎?

謝謝!

asked 2020-02-21T22:25:41Z
6個解決方案
75 votes

主要區別在于觸發器無法修改的內容取決于DBMS。 觸發器(行或語句級別)也可以修改同一表或其他表的一行或多行*,并且可能具有級聯效果(觸發其他動作/觸發),但是所有這些當然取決于DBMS。

主要區別是觸發器被激活了多少次。 假設您有一個1M行表,然后運行:

UPDATE t
SET columnX = columnX + 1

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


另一個區別是順序或激活。 例如,在Oracle中,將按以下順序激活4種不同類型的觸發器:

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

附錄

*關于觸發器可以修改哪些行:不同的DBMS在此方面有不同的限制,具體取決于DBMS中的特定實現或觸發器。 例如,在某些情況下,Oracle可能會顯示“變異表”錯誤。 當從整個表中選擇行級觸發器(BEFORE)或修改其他行或整個表時,不僅是與/觸發相關的行。

當然,對于行級觸發器(在Oracle或其他系統中)修改其更改已觸發它的行,這是非常普遍的用法可以领救济金的游戏,這是完全有效的。 dbfiddle.uk中的示例。

其他DBMS對任何類型的觸發器可以執行的操作甚至提供的類型的觸發器可能都有不同的限制(例如,有些沒有BEFORE觸發器,有些根本沒有語句級觸發器,等等)。

answered 2020-02-21T22:26:36Z
19 votes

您可能希望觸發器操作在客戶端執行修改一百萬行的語句后執行一次(語句級觸發器)。 或者,您可能希望為每條被修改的行觸發一次操作(行級觸發器)。

示例:假設您有一個觸發器,可以確保所有高中畢業生畢業。 也就是說,當高年級為12,并且我們將其提高到13時,我們希望將年級設置為FOR EACH ROW

對于語句級別的觸發器,您可能會說,在運行grade-grade語句后,請檢查整個表一次以將所有級別為13的即時更新為FOR EACH ROW

對于行級觸發器,您會說,每更新一行后,如果新行的等級為13,則將其等級更新為FOR EACH ROW

語句級觸發器如下所示:

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是可選的。

answered 2020-02-21T22:27:24Z
1 votes

語句級觸發器之間的主要區別如下:

語句級別觸發器:基于名稱,如果執行了任何語句,它將起作用。不依賴于影響多少行或任何行,它僅執行一次。Exp:如果您想更新部門HR中每位員工的薪水,最后您想知道影響了多少行意味著增加了多少薪水,請使用語句級別觸發器。請注意,即使更新了零行,觸發器也會執行,因為它是語句級別的觸發器,如果執行了任何語句,則將調用該觸發器。 不管是否影響任何行都無關緊要。

行級觸發器:每次影響一行時執行。 如果受影響的行數為零,則不會執行行級別的觸發器。假設您要從emp表中刪除一個部門是HR的雇員可以领救济金的游戏,并且想要從emp表中刪除雇員后,將HR部分的dept表中的計數減少 1.然后您應該選擇行級觸發器。

answered 2020-02-21T22:27:54Z
0 votes

語句級觸發器僅對dml語句行一次,而水平觸發器僅對dml語句的每一行

answered 2020-02-21T22:28:14Z
0 votes

如果要在修改行數時執行該語句,則可以通過語句級觸發器來執行。viseversa ...當您要執行語句時,對行數進行每次修改,則需要使用行級觸發器。

例如:語句級觸發器適用于修改表的情況。然后,會影響更多數量的記錄。行級觸發器適用于每次更新或修改行時的情況。

answered 2020-02-21T22:28:39Z
0 votes

1)行級觸發器用于對行集執行操作,如插入,更新或刪除

例如:-您必須刪除一組行,同時為了審計目的,已刪除的行也必須插入新表中;

2)陳述層級觸發:-通常用于對您正在執行的事件施加限制。

示例:-限制在晚上10點至早上6點之間刪除數據;

希望這可以幫助:)

answered 2020-02-21T22:29:17Z
translate from