1
0

TRIGGERの作成時にsql_modeというものに出会った

Posted at

dev環境のDBで

mysql>CREATE TRIGGER [TRIGGER名] BEFORE UPDATE ON [テーブル名] FOR EACH ROW [条件式]

でTRIGGERを作成した時に、本番では動いてるのにdevではエラーになる現象がありました。

そこで本番とdevのTRIGGERを比較してます。

mysql>SHOW TRIGGERS LIKE [テーブル名];

結果↓

本番

sql_mode
NO_ENGINE_SUBSTITUTION

dev

sql_mode
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

STRICT_TRANS_TABLESが入っていました。
そこで、まずRDSのパラメータグループを疑いました。
しかし、パラメータグループのsql_modeはデフォルトのNO_ENGINE_SUBSTITUTIONしか入っていなかったので違いました。
調べていると、このような記事を見つけました。
記事の通り以下を実行してみると、

mysql>SELECT @@global.sql_mode;
mysql>SELECT @@session.sql_mode;

結果↓

global.sql_mode

@@global.sql_mode
NO_ENGINE_SUBSTITUTION

session.sql_mode

@@session.sql_mode
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

session.sql_modeに STRICT_TRANS_TABLES が入ってたので無効にしました。

mysql>SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

もう一度 session.sql_mode をみると NO_ENGINE_SUBSTITUTION だけになっていました。
そして、TRIGGERを再作成します。

mysql>DROP TRIGGER IF EXISTS [テーブル名]
mysql>CREATE TRIGGER [TRIGGER名] BEFORE UPDATE ON [テーブル名] FOR EACH ROW [条件式]

TRIGGERを確認↓

dev

sql_mode
NO_ENGINE_SUBSTITUTION

成功!
そして、devの操作をしたところエラーを出さずに登録できました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0