Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


A.5 MySQL 5.6 FAQ: トリガー

A.5.1. MySQL 5.6 のトリガーについてのドキュメントはどこにありますか。
A.5.2. MySQL のトリガーについてのディスカッションフォーラムはありますか。
A.5.3. MySQL 5.6 にはステートメントレベルまたは行レベルのトリガーはありますか。
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. トリガーでは UDF を使用して外部アプリケーションを呼び出すことができますか。
A.5.12. トリガーはリモートサーバー上のテーブルを更新できますか。
A.5.13. トリガーはレプリケーションで動作しますか。
A.5.14. マスターでトリガーによって実行されたアクションはどのようにスレーブにレプリケートされますか。

A.5.1.

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

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

A.5.2.

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

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

A.5.3.

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

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

A.5.4.

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

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

A.5.5.

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

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

トリガーに関する情報は、INFORMATION_SCHEMA.TRIGGERS テーブルをクエリーすることによって取得できます。セクション21.26「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';

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

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

A.5.7.

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

テーブルのトリガーは、現在、.TRG ファイルに格納され、テーブルごとにそのようなファイルが 1 つあります。

A.5.8.

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

はい。

A.5.9.

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

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

A.5.10.

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

MySQL 5.6 では、同じトリガーイベントおよびアクション時間を持つ複数のトリガーを特定のテーブルに定義することはできません。たとえば、1 つのテーブルに対して 2 つの BEFORE UPDATE トリガーを定義することはできません。この制限は MySQL 5.7 で解除されました。

A.5.11.

トリガーでは UDF を使用して外部アプリケーションを呼び出すことができますか。

はい。たとえば、トリガーは sys_exec() という UDF を呼び出すことができます。

A.5.12.

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

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

A.5.13.

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

はい。ただし、それらが動作する仕組みは、MySQL のすべてのバージョンで使用できる標準のステートメントベースのレプリケーション、または MySQL 5.1 で導入された行ベースのレプリケーション形式のいずれを使用しているかによって異なります。

ステートメントベースのレプリケーションを使用している場合、スレーブのトリガーは、マスターで実行されてスレーブにレプリケートされたステートメントによって実行されます。

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

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

A.5.14.

マスターでトリガーによって実行されたアクションはどのようにスレーブにレプリケートされますか。

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

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

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

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

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

  4. レプリケーションのスレーブは、EMP に対するその INSERT ステートメントを取得してそれを実行します。

  5. スレーブに存在する EMPAFTER トリガーが実行されます。

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

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

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


User Comments
  Posted by Zach Welch on August 13, 2008
To work around not being able to invoke external applications directly from within triggers, the MySQL Message Queue API seeks to provide a reliable means for communicating with them.
For more information, see http://forge.mysql.com/wiki/ProjectPage_MySQL_Message_API
Sign Up Login You must be logged in to post a comment.