如何通过GRANT EXECUTE授权有效解决存储过程执行权限不足问题?
- 内容介绍
- 相关推荐
本文共计1136个文字,预计阅读时间需要5分钟。
执行存储过程时出现错误:
常见误区是只给了表的 SELECT 权限,却忘了对存储过程对象单独授权。尤其在 MySQL 和 SQL Server 中,GRANT EXECUTE ON PROCEDURE db_name.proc_name TO 'user'@'host' 是不可跳过的一步。
- MySQL:必须指定
PROCEDURE关键字,不能写成GRANT EXECUTE ON db_name.*(那是授整个库的存储过程权限) - SQL Server:语法为
GRANT EXECUTE ON OBJECT::dbo.proc_name TO [user],漏掉OBJECT::前缀会报错 - Oracle:用
GRANT EXECUTE ON proc_name TO username,注意不加 schema 前缀时默认是当前用户 schema;跨 schema 调用必须写全GRANT EXECUTE ON other_schema.proc_name TO username
为什么加了 GRANT EXECUTE 还报错?检查 SQL SECURITY 或 AUTHID
即使已执行 GRANT EXECUTE,调用仍失败,大概率是存储过程定义时用了 SQL SECURITY DEFINER(MySQL)或默认的 DEFINER 模式(Oracle/SQL Server),导致权限校验绕过了调用者,转而检查创建者(DEFINER)是否还存在、是否有底层对象权限。
本文共计1136个文字,预计阅读时间需要5分钟。
执行存储过程时出现错误:
常见误区是只给了表的 SELECT 权限,却忘了对存储过程对象单独授权。尤其在 MySQL 和 SQL Server 中,GRANT EXECUTE ON PROCEDURE db_name.proc_name TO 'user'@'host' 是不可跳过的一步。
- MySQL:必须指定
PROCEDURE关键字,不能写成GRANT EXECUTE ON db_name.*(那是授整个库的存储过程权限) - SQL Server:语法为
GRANT EXECUTE ON OBJECT::dbo.proc_name TO [user],漏掉OBJECT::前缀会报错 - Oracle:用
GRANT EXECUTE ON proc_name TO username,注意不加 schema 前缀时默认是当前用户 schema;跨 schema 调用必须写全GRANT EXECUTE ON other_schema.proc_name TO username
为什么加了 GRANT EXECUTE 还报错?检查 SQL SECURITY 或 AUTHID
即使已执行 GRANT EXECUTE,调用仍失败,大概率是存储过程定义时用了 SQL SECURITY DEFINER(MySQL)或默认的 DEFINER 模式(Oracle/SQL Server),导致权限校验绕过了调用者,转而检查创建者(DEFINER)是否还存在、是否有底层对象权限。

