AWS Redshift跨数据库对象引用:从库C访问库B视图的实现方法
跨数据库访问视图的实现方法
不同数据库系统的跨库引用逻辑差异较大,以下是主流数据库的具体实现方式:
SQL Server
直接通过「数据库名.架构名.视图名」的完整路径访问即可,前提是当前登录账号拥有数据库b的访问权限以及目标视图的SELECT权限:
-- 在数据库c中执行 SELECT * FROM b.dbo.target_view;
注意:如果视图不在默认的dbo架构下,替换成实际架构名即可。
MySQL
同一实例下直接引用「数据库名.视图名」即可,无需额外配置,确保账号有数据库b的SELECT权限:
-- 在数据库c中执行 SELECT * FROM b.target_view;
如果是不同MySQL实例,需要借助FEDERATED引擎创建外部表映射到目标视图,或者使用第三方工具实现跨实例访问。
PostgreSQL
PostgreSQL默认不支持直接跨库访问,需通过扩展实现:
方法1:使用dblink临时查询
- 先在数据库c中启用dblink扩展:
CREATE EXTENSION IF NOT EXISTS dblink;
- 通过dblink连接到数据库b并查询视图:
SELECT * FROM dblink( 'dbname=b', -- 连接字符串,可包含主机、端口、用户名密码等 'SELECT * FROM target_view' ) AS result(col1 INT, col2 VARCHAR(50), ...); -- 需指定返回列的名称和类型
方法2:使用postgres_fdw创建外部表(推荐长期使用)
- 创建外部服务器指向数据库b:
CREATE SERVER b_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (dbname 'b', host 'localhost'); -- 若为远程实例需填实际主机
- 创建用户映射,关联当前账号与数据库b的登录信息:
CREATE USER MAPPING FOR current_user SERVER b_server OPTIONS (user 'your_b_db_user', password 'your_b_db_pwd');
- 创建外部表映射到目标视图:
CREATE FOREIGN TABLE target_view ( col1 INT, col2 VARCHAR(50), -- 其他列定义需与目标视图完全一致 ) SERVER b_server OPTIONS (schema_name 'public', table_name 'target_view');
之后在数据库c中即可像访问本地表一样查询:
SELECT * FROM target_view;
Oracle
需先创建数据库链接(DB_LINK),再通过链接访问视图:
- 创建指向数据库b的链接:
CREATE DATABASE LINK b_link CONNECT TO b_db_user IDENTIFIED BY b_db_pwd USING 'b_tns_connection_string'; -- TNS名称或直接连接字符串
- 通过链接访问视图:
SELECT * FROM target_view@b_link;
通用注意事项
- 确保当前操作的账号拥有目标数据库b中该视图的
SELECT权限,以及跨库访问的相关权限(如SQL Server的CONNECT权限、PostgreSQL的USAGE权限等)。 - 跨实例访问时需确保网络连通性,且目标数据库开放了相应端口。
内容的提问来源于stack exchange,提问作者vinoth kumar
相关产品推荐
相关产品推荐

