MySQLストアド関数の変更方法|ALTER FUNCTIONステートメントの使い方を解説
MySQLのストアド関数(ストアドファンクション)を変更するには、ALTER FUNCTIONステートメントを使用します。このステートメントを実行するには、あらかじめALTER ROUTINE権限が付与されている必要があります。
ALTER FUNCTIONの基本構文
ALTER FUNCTION function_name [characteristic ...]
characteristic:
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'function_nameには、変更対象となるストアド関数の名前を指定します。
指定できる特性(characteristic)
- CONTAINS SQL / NO SQL / READS SQL DATA / MODIFIES SQL DATA:関数がSQL文をどのように扱うかを示す分類
- SQL SECURITY:DEFINER(定義者権限)またはINVOKER(呼び出し元権限)のどちらで実行するか
- COMMENT:関数に付与するコメント文字列
ALTER FUNCTIONでできること・できないこと
ALTER FUNCTIONステートメントでは、上記のような特性(characteristic)のみを変更できます。1つのステートメント内で複数の変更を同時に指定することも可能です。
ただし、注意点としてパラメータ(引数)や関数本体(処理内容)は変更できません。これらを修正したい場合は、DROP FUNCTIONで一度削除してからCREATE FUNCTIONで再作成する必要があります。
実行例:factorial関数にコメントを追加する
ここでは、既存のストアド関数「factorial」にコメントを追加してみます。
mysql> ALTER FUNCTION factorial COMMENT 'Can accept fraction values';
Query OK, 0 rows affected (0.00 sec)
mysql> Show Create Function factorial\G
*************************** 1. row ***************************
Function: factorial
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `factorial`(n DECIMAL(3,0)) RETURNS decimal(20,0)
DETERMINISTIC
COMMENT 'Can accept fraction values'
BEGIN
DECLARE factorial DECIMAL(20,0) DEFAULT 1;
DECLARE counter DECIMAL(3,0);
SET counter = n;
factorial_loop: REPEAT
SET factorial = factorial * counter;
SET counter = counter - 1;
UNTIL counter = 1
END REPEAT;
RETURN factorial;
END
character_set_client: cp850
collation_connection: cp850_general_ci
Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)SHOW CREATE FUNCTIONの出力結果を見ると、「factorial」関数の定義に COMMENT 'Can accept fraction values' が正しく追加されていることが確認できます。
まとめ
- ストアド関数の変更にはALTER FUNCTIONを使用し、実行にはALTER ROUTINE権限が必要
- 変更できるのは特性(SQLデータアクセスの種類、SQL SECURITY、コメントなど)のみ
- パラメータや関数本体を変えたい場合は、DROP FUNCTION後に再作成する
-
MySQLストアド関数をデータベースから削除する方法
MySQLでは、ALTER ROUTINE 権限を持っているユーザーであれば、DROP FUNCTION ステートメントを使用してストアド関数をデータベースから削除できます。基本構文DROP FUNCTION [IF EXISTS] function_nameここで function_name は、データベースから削除したい関数の名前です。オプション「IF EXISTS」についてIF EXISTS を指定すると、指定した関数が存在しない場合でもエラーではなく警告が表示されるため、スクリプトの実行が中断されません。削除対象の関数が存在するかどうか不明な場合に便利です。使用例以下は、Hello1
-
MySQLのテーブルにストアドGENERATEDカラム(生成カラム)を追加する方法
MySQLのテーブルにストアド生成カラム(STORED GENERATED COLUMN)を追加する場合、通常のカラム追加と同じALTER TABLE構文を使用し、データ型の後に「AS(式)」とSTOREDキーワードを指定するだけで実現できます。生成カラムとは、他のカラムの値から式を用いて自動的に計算されるカラムのことです。STOREDを指定すると、計算結果が物理的にディスクへ保存されるため、参照時のパフォーマンスが向上します(VIRTUALの場合は読み取り時に毎回計算されます)。基本構文ALTER TABLE table_name ADD COLUMN column_name AS(expr