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