能否在当前schema(sch1)的存储过程中使用其他schema(sch2)的视图v1?求示例
当然可以在一个schema的存储过程里引用另一个schema下的视图,只要搞定对应的权限问题就行!核心前提是执行存储过程的用户(或存储过程的定义者,取决于数据库的权限机制)拥有访问sch2.v1的SELECT权限。
具体示例(以MySQL为例,逻辑适用于多数关系型数据库)
1. 先在sch2下准备测试视图
假设sch2下有一张基础表t_user,我们基于它创建视图v1:
USE sch2; -- 创建测试表(如果不存在) CREATE TABLE IF NOT EXISTS t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, age INT ); -- 创建视图v1:筛选成年用户的id和用户名 CREATE VIEW v1 AS SELECT id, username FROM t_user WHERE age >= 18;
2. 给sch1的用户授权访问sch2.v1
需要确保sch1的用户能读取目标视图:
GRANT SELECT ON sch2.v1 TO 'sch1_user'@'%'; -- 替换为你的sch1实际用户名
3. 在sch1下创建存储过程引用sch2.v1
直接通过schema.视图名的格式跨schema调用即可:
USE sch1; DELIMITER // CREATE PROCEDURE get_adult_users() BEGIN -- 直接引用sch2下的v1视图 SELECT * FROM sch2.v1; END // DELIMITER ;
4. 执行存储过程验证效果
CALL get_adult_users();
额外注意事项
- 如果你的数据库使用定义者权限(比如MySQL的
SQL SECURITY DEFINER),则需要存储过程的定义者拥有sch2.v1的访问权限;如果是默认的SQL SECURITY INVOKER,则执行存储过程的用户需要对应权限。 - 不同数据库(如PostgreSQL、Oracle)的语法细节会有差异(比如Oracle的存储过程结构、权限授予语句),但跨schema引用视图的核心逻辑是通用的。
内容的提问来源于stack exchange,提问作者Ganesh galla
相关产品推荐
相关产品推荐

