相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  MySQL 9.0 常見問題  /  MySQL 9.0 常見問題:觸發器

A.5 MySQL 9.0 常見問題:觸發器

A.5.1. 我在哪裡可以找到 MySQL 9.0 觸發器的文件?
A.5.2. 是否有 MySQL 觸發器的討論論壇?
A.5.3. MySQL 是否有陳述式層級或資料列層級的觸發器?
A.5.4. 是否有任何預設觸發器?
A.5.5. 如何在 MySQL 中管理觸發器?
A.5.6. 是否有方法可以檢視特定資料庫中的所有觸發器?
A.5.7. 觸發器儲存在哪裡?
A.5.8. 觸發器可以呼叫預存程序嗎?
A.5.9. 觸發器可以存取表格嗎?
A.5.10. 一個表格是否可以有多個具有相同觸發事件和動作時間的觸發器?
A.5.11. 觸發器是否可以更新遠端伺服器上的表格?
A.5.12. 觸發器是否適用於複製?
A.5.13. 如何將來源上觸發器執行的動作複製到副本?

A.5.1.

我在哪裡可以找到 MySQL 9.0 觸發器的文件?

請參閱第 27.4 節,「使用觸發器」

A.5.2.

是否有 MySQL 觸發器的討論論壇?

有。它位於 https://forums.mysql.com/list.php?99

A.5.3.

MySQL 是否有陳述式層級或資料列層級的觸發器?

所有觸發器都是 FOR EACH ROW;也就是說,觸發器會在每次插入、更新或刪除資料列時啟動。MySQL 不支援使用 FOR EACH STATEMENT 的觸發器。

A.5.4.

是否有任何預設觸發器?

沒有明確的預設觸發器。MySQL 確實對某些 TIMESTAMP 資料行以及使用 AUTO_INCREMENT 定義的資料行有特定的特殊行為。

A.5.5.

如何在 MySQL 中管理觸發器?

可以使用 CREATE TRIGGER 陳述式建立觸發器,並使用 DROP TRIGGER 捨棄觸發器。請參閱第 15.1.22 節,「CREATE TRIGGER 陳述式」第 15.1.34 節,「DROP TRIGGER 陳述式」,以瞭解關於這些陳述式的更多資訊。

關於觸發器的資訊可以透過查詢 INFORMATION_SCHEMA.TRIGGERS 表格取得。請參閱第 28.3.44 節,「INFORMATION_SCHEMA.TRIGGERS 表格」

A.5.6.

是否有方法可以檢視特定資料庫中的所有觸發器?

有。您可以使用對 INFORMATION_SCHEMA.TRIGGERS 表格的查詢,取得定義在資料庫 dbname 上的所有觸發器清單,例如此處顯示的查詢

SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_STATEMENT
    FROM INFORMATION_SCHEMA.TRIGGERS
    WHERE TRIGGER_SCHEMA='dbname';

如需關於此表格的更多資訊,請參閱第 28.3.44 節,「INFORMATION_SCHEMA.TRIGGERS 表格」

您也可以使用 SHOW TRIGGERS 陳述式,這是 MySQL 特有的。請參閱第 15.7.7.39 節,「SHOW TRIGGERS 陳述式」

A.5.7.

觸發器儲存在哪裡?

觸發器儲存在 mysql.triggers 系統表格中,這是資料字典的一部分。

A.5.8.

觸發器可以呼叫預存程序嗎?

可以。

A.5.9.

觸發器可以存取表格嗎?

觸發器可以存取其自己表格中的舊資料和新資料。觸發器也可以影響其他表格,但不允許修改正在使用中 (讀取或寫入) 的表格,該表格是透過呼叫函式或觸發器的陳述式來使用。

A.5.10.

一個表格是否可以有多個具有相同觸發事件和動作時間的觸發器?

在 MySQL 9.0 中,可以為給定表格定義多個具有相同觸發事件和動作時間的觸發器。例如,您可以為一個表格設定兩個 BEFORE UPDATE 觸發器。根據預設,具有相同觸發事件和動作時間的觸發器會依建立的順序啟動。若要影響觸發器順序,請在 FOR EACH ROW 後面指定一個子句,指出 FOLLOWSPRECEDES 以及也具有相同觸發事件和動作時間的現有觸發器的名稱。使用 FOLLOWS 時,新的觸發器會在現有的觸發器之後啟動。使用 PRECEDES 時,新的觸發器會在現有的觸發器之前啟動。

A.5.11.

觸發器是否可以更新遠端伺服器上的表格?

可以。可以使用 FEDERATED 儲存引擎更新遠端伺服器上的表格。(請參閱第 18.8 節,「FEDERATED 儲存引擎」)。

A.5.12.

觸發器是否適用於複製?

是。但是,其運作方式取決於您使用的是 MySQL 的 經典陳述式式或資料列式複製格式。

使用陳述式式複製時,副本上的觸發器會由在來源上執行(並複製到副本)的陳述式執行。

使用資料列式複製時,不會因為在來源上執行然後複製到副本的陳述式而在副本上執行觸發器。相反地,使用資料列式複製時,在來源上執行觸發器所引起的變更會套用在副本上。

如需更多資訊,請參閱第 19.5.1.37 節,「複製和觸發器」

A.5.13.

如何將來源上觸發器執行的動作複製到副本?

同樣地,這取決於您使用的是陳述式式或資料列式複製。

陳述式式複製。  首先,必須在副本伺服器上重新建立來源上存在的觸發器。完成此操作後,複製流程會像任何其他參與複製的標準 DML 陳述式一樣運作。例如,假設有一個表格 EMP,其中有一個 AFTER 插入觸發器,該觸發器存在於複製來源伺服器上。相同的 EMP 表格和 AFTER 插入觸發器也存在於副本伺服器上。複製流程如下

  1. EMP 執行 INSERT 陳述式。

  2. EMP 上的 AFTER 觸發器會啟動。

  3. INSERT 陳述式會寫入二進位日誌。

  4. 副本會擷取對 EMPINSERT 陳述式並執行它。

  5. 存在於副本上的 EMPAFTER 觸發器會啟動。

以列為基礎的複寫 (Row-based replication)。 當您使用以列為基礎的複寫時,在來源端執行觸發程序所造成的變更會套用至複本。然而,觸發程序本身實際上不會在以列為基礎的複寫下於複本上執行。這是因為,如果來源端和複本都套用了來自來源端的變更,並且另外在複本上套用了造成這些變更的觸發程序,則變更實際上會在複本上套用兩次,導致來源端和複本上的資料不同。

在大多數情況下,以列為基礎的複寫和以語句為基礎的複寫的結果是相同的。但是,如果您在來源端和複本上使用不同的觸發程序,則您不能使用以列為基礎的複寫。(這是因為以列為基礎的格式會將在來源端執行的觸發程序所做的變更複寫到複本,而不是造成觸發程序執行的語句,而複本上對應的觸發程序則不會執行。)相反地,任何導致執行此類觸發程序的語句都必須使用以語句為基礎的複寫進行複寫。

如需更多資訊,請參閱第 19.5.1.37 節,「複製和觸發器」