MySQLのストアドプロシージャは作成時点の環境を保持するのか?
実は、MySQLではストアドプロシージャが作成された時点の環境(設定)を保持しています。つまり、プロシージャを作成した時点でのSQLモードなどの設定が、その後変更されても、すでに作成済みのプロシージャには影響しないという仕組みです。
この動作は、文字列を連結するために「||」(2本の縦棒)を使用する例で確認できます。「||」による文字列連結は、SQLモードが「ansi」の場合にのみ有効な記法です。しかし、その後SQLモードを非ANSIモードに変更しても、既存のプロシージャはあたかも元の設定が有効であるかのように動作し続けます。
具体例で確認してみよう
まず、SQLモードを「ansi」に設定してから、文字列を連結するストアドプロシージャを作成します。
mysql> Set sql_mode = 'ansi'//
Query OK, 0 rows affected, 1 warning (0.14 sec)
mysql> Create Procedure Con_string()
-> SELECT 'a'||'b'//
Query OK, 0 rows affected (0.12 sec)
mysql> Call Con_string();
+----------+
| 'a'||'b' |
+----------+
| ab |
+----------+
1 row in set (0.05 sec)
Query OK, 0 rows affected (0.05 sec)この時点では、SQLモードが「ansi」なので、「||」による文字列連結が正しく機能し、「ab」という結果が返されています。
SQLモードを変更しても既存のプロシージャは影響を受けない
次に、SQLモードを空(非ANSIモード)に変更してから、同じプロシージャを再度呼び出してみます。
mysql> Set sql_mode = ''; Query OK, 0 rows affected (0.00 sec) mysql> Call Con_string(); +----------+ | 'a'||'b' | +----------+ | ab | +----------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)
上記の結果セットを見ると、SQLモードを非ANSIモードに変更した後でも、プロシージャ「Con_string()」は依然として同じ結果(「ab」)を返していることがわかります。これは、プロシージャが作成された時点の環境(SQLモードがansiだった状態)を保持しているためです。
新しく作成するプロシージャには新しい設定が適用される
一方、現在の(非ANSIの)SQLモードで新しくプロシージャを作成するとどうなるでしょうか。新しいプロシージャでは「||」による文字列連結は受け付けられません。これは、SQLモードが非ANSIに変更されているためです。
mysql> create procedure Con_string1()
-> Select 'a'||'b'//
Query OK, 0 rows affected (0.02 sec)
mysql> Call Con_string1()//
+----------+
| 'a'||'b' |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected, 2 warnings (0.00 sec)ご覧のとおり、新しく作成したプロシージャ「Con_string1()」では、「||」が論理OR演算子として解釈され、結果として「0」が返されています。警告(warnings)も発生しており、文字列連結として機能していないことがわかります。
まとめ
- ストアドプロシージャは作成時点の環境(SQLモードなど)を保持します。
- その後SQLモードを変更しても、既存のプロシージャの動作は変わりません。
- ただし、新しく作成するプロシージャには変更後の設定が適用されます。
この特性を理解しておくと、SQLモードの変更が既存のストアドプロシージャに与える影響を正しく予測できるようになり、意図しない動作を防ぐことができます。
-
MySQLストアドプロシージャで条件分岐を設定する方法(IF...ELSE構文の使い方)
MySQLのストアドプロシージャ内で条件分岐を実装したい場合は、IF...ELSE構文を使用します。この構文を使うことで、条件に応じて異なる処理を実行できるようになります。IF...ELSE構文の基本形MySQLにおけるIF...ELSE文の基本的な書式は以下のとおりです。IF yourCondition THEN yourStatement1;ELSE yourStatement2;END IF;yourCondition:評価される条件式(例:変数が10より大きいかどうか)yourStatement
-
MySQLで*.*に権限を付与した場合、付与後に作成されたデータベースにも適用されるのか?
結論:はい、グローバル権限なので適用されます *.* を指定した権限付与はグローバル権限(サーバー全体に対する権限)であるため、付与後に新しく作成されたデータベースにも自動的に適用されます。実際にMySQLで動作を確認してみましょう。 手順1:テスト用ユーザーを作成する まず、検証用のユーザーを作成します。 mysql> CREATE USER Jace@localhost IDENTIFIED BY Jace123; Query OK, 0 rows affected (0.67 sec) この CREATE USER 文により、localhostから接続可能な「Jace」というユーザ