在MySQL里,CREATE ROUTINE并不是直接用来写存储过程代码的语句,而是一项系统权限。它决定了哪个数据库账号可以在某个库中创建存储过程和存储函数。真正写逻辑用的是CREATE PROCEDURE和CREATE FUNCTION,但执行这两条之前,账号必须拥有CREATE ROUTINE权限。

CREATE ROUTINE权限的授权语法
管理员通过GRANT语句把该权限授予用户,基本写法如下:
-- 授予用户dev在test库下创建例程的权限 GRANT CREATE ROUTINE ON test.* TO 'dev'@'localhost'; -- 同时授予修改和执行的权限,方便开发调试 GRANT CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON test.* TO 'dev'@'localhost';
创建存储过程示例
拥有权限后,使用CREATE PROCEDURE定义过程。注意DELIMITER用于改结束符,避免与内部分号冲突。
DELIMITER // CREATE PROCEDURE test.get_user_count(OUT cnt INT) BEGIN SELECT COUNT(*) INTO cnt FROM test.users; END // DELIMITER ;
创建存储函数示例
存储函数通过CREATE FUNCTION定义,必须声明返回类型,且函数体里不能用返回结果集的SELECT。
DELIMITER //
CREATE FUNCTION test.add_prefix(name VARCHAR(20))
RETURNS VARCHAR(30)
DETERMINISTIC
BEGIN
RETURN CONCAT('usr_', name);
END //
DELIMITER ;
相关权限的区别
容易混淆的几个权限可以这样理解:
- CREATE ROUTINE:允许新建存储过程和函数。
- ALTER ROUTINE:允许修改或删除已创建的例程。
- EXECUTE:允许调用并执行例程,但不一定能创建。
| 权限名 | 能否创建 | 能否修改 | 能否执行 |
|---|---|---|---|
| CREATE ROUTINE | 是 | 否 | 否 |
| ALTER ROUTINE | 否 | 是 | 否 |
| EXECUTE | 否 | 否 | 是 |
常见误区
有人以为在命令行敲CREATE ROUTINE就能生成过程,其实它会报语法错误。正确做法是先授权,再用CREATE PROCEDURE或CREATE FUNCTION。另外,若使用二进制日志且函数不是DETERMINISTIC,可能需要开启log_bin_trust_function_creators,否则创建函数会被拒绝。
小结:CREATE ROUTINE是MySQL权限体系里控制例程创建能力的一环,配合具体定义语句才能完成开发工作。
在排查无法创建例程的问题时,可先用SHOW GRANTS FOR 'dev'@'localhost';确认账号权限,再检查库名和语法是否正确。
MySQLCREATE_ROUTINE存储过程存储函数权限控制修改时间:2026-07-24 18:00:33