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


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

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

A.5.1. 我在哪裡可以找到 MySQL 8.4 觸發器的文件?
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 8.4 觸發器的文件?

請參閱章節 27.3,「使用觸發器」

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

A.5.11.

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

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

A.5.12.

觸發器是否適用於複寫?

是。但是,它們的工作方式取決於您使用的是 MySQL 的經典陳述式型複寫格式還是資料列型複寫格式。

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

當使用資料列型複寫時,由於在來源上執行然後複寫到複本的陳述式,觸發器不會在複本上執行。相反地,當使用資料列型複寫時,會在複本上套用在來源上執行觸發器所造成的變更。

如需更多資訊,請參閱章節 19.5.1.36,「複寫與觸發器」

A.5.13.

如何將在來源上透過觸發器執行的動作複寫到複本?

同樣地,這取決於您使用的是基於語句的複製還是基於列的複製。

基於語句的複製。首先,必須在副本伺服器上重新建立來源伺服器上存在的觸發器。完成此操作後,複製流程的工作方式與任何其他參與複製的標準 DML 語句相同。例如,考慮一個名為 EMP 的表,它在複製來源伺服器上具有一個 AFTER 插入觸發器。副本伺服器上也有相同的 EMP 表和 AFTER 插入觸發器。複製流程如下:

  1. EMP 發出 INSERT 語句。

  2. EMP 上的 AFTER 觸發器被啟用。

  3. INSERT 語句被寫入二進制日誌。

  4. 副本取得對 EMPINSERT 語句並執行它。

  5. 副本上存在的 EMPAFTER 觸發器被啟用。

基於列的複製。當您使用基於列的複製時,在來源伺服器上執行觸發器所引起的變更會應用到副本上。但是,在基於列的複製下,觸發器本身實際上不會在副本上執行。這是因為,如果來源和副本都應用了來源的變更,而且觸發這些變更的觸發器也在副本上應用,那麼變更實際上會在副本上應用兩次,導致來源和副本上的資料不同。

在大多數情況下,基於列的複製和基於語句的複製的結果是相同的。但是,如果您在來源和副本上使用不同的觸發器,則不能使用基於列的複製。(這是因為基於列的格式會將在來源上執行的觸發器所做的變更複製到副本,而不是導致觸發器執行的語句,並且副本上的相應觸發器不會執行。)相反,任何導致此類觸發器執行的語句都必須使用基於語句的複製來複製。

如需更多資訊,請參閱章節 19.5.1.36,「複寫與觸發器」