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の操作をしたところエラーを出さずに登録できました。