MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLデータベース内のすべてのトリガーを一覧表示する方法

MySQLデータベースに登録されているすべてのトリガーを確認したい場合、主に2つの方法があります。SHOW TRIGGERS コマンドを使う方法と、information_schemaTRIGGERS テーブルを参照する方法です。それぞれの手順と出力例を見ていきましょう。

方法1:SHOW TRIGGERS コマンドを使う

最もシンプルなのが SHOW TRIGGERS コマンドです。現在接続しているデータベースに定義されているトリガーの一覧を取得できます。

mysql> show triggers;

実行すると、以下のような結果が出力されます。

+----------------+--------+----------------------+--------------------------------------------------------------------+--------+------------------------+--------------------------------------------+---------+----------------------+----------------------+--------------------+
| Trigger        | Event  | Table                | Statement                                                          | Timing | Created                | sql_mode                                   | Definer | character_set_client | collation_connection | Database Collation |
+----------------+--------+----------------------+--------------------------------------------------------------------+--------+------------------------+--------------------------------------------+---------+----------------------+----------------------+--------------------+
| binsertTrigger | INSERT | functiontriggersdemo | SET new.Id = uuid()                                                | BEFORE | 2018-10-16 13:36:09.86 | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@%  | cp850                | cp850_general_ci     | utf8mb4_unicode_ci |
| Table1Trigger  | INSERT | table1               | begin
insert into Table2(id, name) values (new.id, new.name);
end | AFTER  | 2018-10-23 10:51:31.76 | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@%  | cp850                | cp850_general_ci     | utf8mb4_unicode_ci |
| insertBef      | INSERT | tblfunctiontrigger   | SET new.id = uuid()                                                | BEFORE | 2018-10-16 13:44:10.93 | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@%  | cp850                | cp850_general_ci     | utf8mb4_unicode_ci |
+----------------+--------+----------------------+--------------------------------------------------------------------+--------+------------------------+--------------------------------------------+---------+----------------------+----------------------+--------------------+
3 rows in set (0.13 sec)

このコマンドでは、各トリガーについて以下の情報が確認できます。

  • Trigger:トリガー名
  • Event:トリガーの発火イベント(INSERT、UPDATE、DELETEなど)
  • Table:トリガーが紐づいているテーブル名
  • Statement:トリガー実行時の処理内容
  • Timing:発火タイミング(BEFORE/AFTER)
  • Created:作成日時
  • sql_mode / Definer / 文字コード関連情報

方法2:information_schema.TRIGGERS テーブルを参照する

より柔軟にトリガー情報を取得したい場合は、information_schema.triggers テーブルに対してSELECT文を実行します。必要なカラムだけを選択したり、WHERE句で絞り込みを行ったりできるのが利点です。

mysql> select trigger_schema, trigger_name, action_statement
-> from information_schema.triggers;

実行結果は以下のとおりです。

+----------------+----------------------------+-------------------------------------------------------------------------------------------------------------------+
| TRIGGER_SCHEMA | TRIGGER_NAME               | ACTION_STATEMENT                                                                                                  |
+----------------+----------------------------+-------------------------------------------------------------------------------------------------------------------+
| sys            | sys_config_insert_set_user | BEGIN IF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THEN SET NEW.set_by = USER(); END IF; END |
| sys            | sys_config_update_set_user | BEGIN IF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THEN SET NEW.set_by = USER(); END IF; END |
| business       | binsertTrigger             | SET new.Id = uuid()                                                                                               |
| business       | insertBef                  | SET new.id = uuid()                                                                                               |
| business       | Table1Trigger              | begin
insert into Table2(id, name) values (new.id, new.name);end                                                                  |
+----------------+----------------------------+-------------------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

SHOW TRIGGERS との大きな違いとして、この方法では trigger_schema(データベース名) が表示されるため、サーバー全体の複数データベースにまたがるトリガーを一括で確認できます。特定のデータベースだけを対象にしたい場合は、次のようにWHERE句で条件を指定します。

SELECT trigger_name, action_timing, event_manipulation, action_statement
FROM information_schema.triggers
WHERE trigger_schema = 'business';

注意点:MySQLのバージョン要件

information_schema.triggers を利用するには、MySQL 5.0.10 以上が必要です。本記事の出力例は MySQL 8.0.12 で検証したものですが、それ以降のバージョンでも同様に動作します。

まとめ

  • 手軽に確認するなら SHOW TRIGGERS; 一覧表示はこれだけでOK。
  • 詳細な条件指定や他データベース横断の確認には information_schema.triggers へのSELECTが便利。
  • 運用・保守の場面では、トリガーの定義内容を定期的に把握しておくことで、予期しないデータ更新の原因調査がスムーズになります。
  1. MySQLで現在選択中のデータベースを確認する方法|DATABASE()関数とstatusコマンドの使い方

    MySQLに接続している際、「今どのデータベースを選択しているのか」を確認したい場面はよくあります。この記事では、DATABASE()関数やstatusコマンドを使って、現在選択中のデータベース名を簡単に確認する方法を解説します。 DATABASE()関数で選択中のデータベースを確認する MySQLでは、DUALテーブルに対してDATABASE()関数を実行することで、現在選択されているデータベース名を取得できます。 手順1:データベースを選択する まず、例として「business」というデータベースを選択してみましょう。以下のコマンドを実行します。 mysql> use busi

  2. MySQLコマンドラインでデータベースを作成する方法を初心者向けに解説

    MySQLコマンドラインでデータベースを作成する手順 この記事では、WindowsのコマンドプロンプトからMySQLに接続し、データベースを作成する一連の手順をスクリーンショット付きで解説します。初心者の方でも迷わず進められるよう、順番に見ていきましょう。 1. コマンドプロンプトを開く まず、コマンドプロンプトを起動します。キーボードのショートカット「Windows + R」キーを押すと、「ファイル名を指定して実行」ダイアログが表示されます。 2. 「CMD」と入力してOKをクリック 表示された入力欄に CMD と入力し、「OK」ボタンをクリックしてください。 3. コマンドプロンプトが