Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

A.5 MySQL 8.0 FAQ: トリガー

A.5.1. MySQL 8.0 のトリガーについてのドキュメントはどこにありますか。
A.5.2. MySQL のトリガーについてのディスカッションフォーラムはありますか。
A.5.3. MySQL 8.0 にはステートメントレベルまたは行レベルのトリガーはありますか。
A.5.4. デフォルトのトリガーはありますか。
A.5.5. MySQL でトリガーを管理するにはどうすればよいですか。
A.5.6. 特定のデータベースのすべてのトリガーを表示する方法はありますか。
A.5.7. トリガーはどこに格納されますか。
A.5.8. トリガーはストアドプロシージャーを呼び出すことができますか。
A.5.9. トリガーはテーブルにアクセスできますか。
A.5.10. 1 つのテーブルに同じトリガーイベントおよびアクション時間のトリガーを複数定義することはできますか。
A.5.11. トリガーはリモートサーバー上のテーブルを更新できますか。
A.5.12. トリガーはレプリケーションで動作しますか。
A.5.13. ソースのトリガーを介して実行されるアクションはレプリカにどのようにレプリケートされますか。

A.5.1.

MySQL 8.0 のトリガーについてのドキュメントはどこにありますか。

セクション25.3「トリガーの使用」を参照してください。

A.5.2.

MySQL のトリガーについてのディスカッションフォーラムはありますか。

はい。 https://forums.mysql.com/list.php?99 にあります。

A.5.3.

MySQL 8.0 にはステートメントレベルまたは行レベルのトリガーはありますか。

MySQL 8.0 では、すべてのトリガーは FOR EACH ROW です。つまり、トリガーは、挿入、更新または削除される各行に対してアクティブ化されます。 MySQL 8.0 は FOR EACH STATEMENT を使用したトリガーをサポートしていません。

A.5.4.

デフォルトのトリガーはありますか。

明示的にはありません。 MySQL は、一部の TIMESTAMP カラム、および AUTO_INCREMENT を使用して定義されたカラムに特殊な動作を割り当てています。

A.5.5.

MySQL でトリガーを管理するにはどうすればよいですか。

MySQL 8.0 では、トリガーを作成する場合は CREATE TRIGGER ステートメントを使用し、削除する場合は DROP TRIGGER を使用します。 これらのステートメントについては、セクション13.1.22「CREATE TRIGGER ステートメント」およびセクション13.1.34「DROP TRIGGER ステートメント」を参照してください。

トリガーに関する情報は、INFORMATION_SCHEMA.TRIGGERS テーブルをクエリーすることによって取得できます。 セクション26.45「INFORMATION_SCHEMA TRIGGERS テーブル」を参照してください。

A.5.6.

特定のデータベースのすべてのトリガーを表示する方法はありますか。

はい。 データベース dbname に定義されているすべてのトリガーのリストを取得するには、INFORMATION_SCHEMA.TRIGGERS テーブルに対して次のようなクエリーを使用します。

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

このテーブルについては、セクション26.45「INFORMATION_SCHEMA TRIGGERS テーブル」を参照してください。

MySQL に固有の SHOW TRIGGERS ステートメントを使用することもできます。 セクション13.7.7.40「SHOW TRIGGERS ステートメント」を参照してください。

A.5.7.

トリガーはどこに格納されますか。

トリガーは、データディクショナリの一部である mysql.triggers システムテーブルに格納されます。

A.5.8.

トリガーはストアドプロシージャーを呼び出すことができますか。

はい。

A.5.9.

トリガーはテーブルにアクセスできますか。

トリガーは、それ自体が定義されているテーブルの古いデータおよび新しいデータの両方にアクセスできます。 トリガーはほかのテーブルに影響を与えることもできますが、その関数またはトリガーを呼び出したステートメントによってすでに使用されている (読み取りまたは書き込みのために) テーブルを変更することはできません。

A.5.10.

1 つのテーブルに同じトリガーイベントおよびアクション時間のトリガーを複数定義することはできますか。

MySQL 8.0 では、同じトリガーイベントおよびアクション時間を持つ特定のテーブルに対して複数のトリガーを定義できます。 たとえば、1 つのテーブルに対して 2 つの BEFORE UPDATE トリガーを定義できます。 デフォルトでは、同じトリガーイベントおよびアクション時間を持つトリガーは、作成された順序で実行されます。 トリガーの順序を指定するには、FOR EACH ROW のあとに FOLLOWS または PRECEDES を示す句、および同じトリガーイベントとアクション時間を持つ既存のトリガーの名前を指定します。 FOLLOWS を指定すると、新しいトリガーは既存のトリガーのあとに実行されます。 PRECEDES を指定すると、新しいトリガーは既存のトリガーの前に実行されます。

A.5.11.

トリガーはリモートサーバー上のテーブルを更新できますか。

はい。 リモートサーバー上のテーブルは、FEDERATED ストレージエンジンを使用して更新できます。 (セクション16.8「FEDERATED ストレージエンジン」を参照してください)。

A.5.12.

トリガーはレプリケーションで動作しますか。

はい。 ただし、それらがどのように機能するかは、MySQL 「クラシック」ステートメントベースと行ベースのどちらのレプリケーション形式を使用しているかによって異なります。

ステートメントベースレプリケーションを使用する場合、レプリカ上のトリガーは、ソース上で実行される (およびレプリカにレプリケートされる) ステートメントによって実行されます。

行ベースのレプリケーションを使用している場合、ソースで実行されてレプリカにレプリケートされたステートメントのため、トリガーはレプリカで実行されません。 かわりに、行ベースのレプリケーションを使用すると、ソースでトリガーを実行したことによって発生した変更がレプリカに適用されます。

詳細は、セクション17.5.1.36「レプリケーションとトリガー」を参照してください。

A.5.13.

ソースのトリガーを介して実行されるアクションはレプリカにどのようにレプリケートされますか。

これは、ステートメントベースのレプリケーションまたは行ベースのレプリケーションのいずれを使用しているかによって異なります。

ステートメントベースのレプリケーション.  まず、ソースに存在するトリガーをレプリカサーバーに再作成する必要があります。 これが行われると、レプリケーションに関与するほかの標準の DML ステートメントと同様に、レプリケーションフローが動作します。 たとえば、レプリケーションソースサーバーに存在する AFTER 挿入トリガーを持つテーブル EMP について考えてみます。 レプリカサーバーにも同じ EMP テーブルおよび AFTER 挿入トリガーが存在します。 レプリケーションフローは次のようになります。

  1. INSERT ステートメントが EMP に発行されます。

  2. EMPAFTER トリガーが実行されます。

  3. INSERT ステートメントがバイナリログに書き込まれます。

  4. レプリカは、INSERT ステートメントを EMP に取得して実行します。

  5. レプリカに存在する EMPAFTER トリガーがアクティブ化されます。

行ベースのレプリケーション.  行ベースのレプリケーションを使用すると、ソースでトリガーを実行したことによって発生した変更がレプリカに適用されます。 ただし、トリガー自体は、実際には行ベースレプリケーションの下のレプリカでは実行されません。 これは、ソースとレプリカの両方がソースからの変更を適用し、さらにこれらの変更の原因となったトリガーがレプリカに適用された場合、変更がレプリカに 2 回適用され、ソースとレプリカのデータが異なるためです。

ほとんどの場合、行ベースのレプリケーションおよびステートメントベースのレプリケーションで結果は同じです。 ただし、ソースとレプリカで異なるトリガーを使用する場合は、行ベースのレプリケーションを使用できません。 (これは、行ベースの形式では、トリガーが実行される原因となったステートメントではなく、ソースで実行されているトリガーによって行われた変更がレプリカにレプリケートされ、レプリカ上の対応するトリガーが実行されないためです。) 代わりに、そのようなトリガーが実行されるきっかけとなったステートメントを、ステートメントベースのレプリケーションを使用してレプリケートする必要があります。

詳細は、セクション17.5.1.36「レプリケーションとトリガー」を参照してください。