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「レプリケーションとトリガー」を参照してください。