使用扩展和 Amazon Aurora PostgreSQL
使用 oracle_fdw 扩展访问 Aurora PostgreSQL 中的外部数据
为了轻松高效地访问 Aurora PostgreSQL 的 Oracle 数据库,您可以使用 PostgreSQL oracle_fdw 扩展来提供外部数据包装程序。有关此扩展的完整介绍,请参阅 oracle_fdw
Amazon RDS for PostgreSQL 版本 12.7、13.3 及更高版本支持 oracle_fdw 扩展。
启用 oracle_fdw 扩展
要使用 oracle_fdw 扩展,请执行以下步骤。
启用 oracle_fdw 扩展
-
使用具有
rds_superuser
权限的账户运行以下命令。CREATE EXTENSION oracle_fdw;
使用链接到 RDS for Oracle Database 的外部服务器示例
以下示例演示如何使用链接到 RDS for Oracle 数据库的外部服务器。
创建链接到 RDS for Oracle 数据库的外部服务器
-
请注意以下 RDS for Oracle 数据库实例:
-
Endpoint
-
端口
-
数据库名称
-
-
创建外部服务器。
test=> CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//
endpoint
:port
/DB_name
'); CREATE SERVER -
将使用权授予没有
rds_superuser
权限的用户,例如user1
。test=> GRANT USAGE ON FOREIGN SERVER oradb TO user1; GRANT
-
作为
user1
连接并创建到 Oracle 用户的映射。test=> CREATE USER MAPPING FOR user1 SERVER oradb OPTIONS (user '
oracleuser'
, password 'mypassword'
); CREATE USER MAPPING -
创建链接到 Oracle 表的外部表。
test=> create foreign table
mytab
(a int) SERVER oradb OPTIONS (table 'MYTABLE'
); CREATE FOREIGN TABLE -
查询外部表。
test=> select * from mytab; a --- 1 (1 row)
如果查询报告以下错误,请检查您的安全组和访问控制列表(ACL)以确保两个实例可以通信。
ERROR: connection for foreign table "mytab" cannot be established DETAIL: ORA-12170: TNS:Connect timeout occurred
在传输过程中使用加密
PostgreSQL-to-Oracle 传输中加密基于客户端和服务器配置参数的组合。有关使用 Oracle 21c 的示例,请参阅 Oracle 文档中的关于协商加密和完整性的值ACCEPTED
,这意味着加密取决于 Oracle 数据库服务器配置。
pg_user_mapping 和 pg_user_mappings 权限
在下表中,您可以找到使用示例角色的用户映射权限说明。rdssu1
和 rdssu2
用户具有 rds_superuser
角色,而 user1
用户不具有。
您可以使用 psql 中的 \du
元命令来列出现有角色。
test=> \du List of roles Role name | Attributes | Member of -----------------+------------------------------------------------------------+------------------------------------------------------------- rdssu1 | | {rds_superuser} rdssu2 | | {rds_superuser} user1 | | {}
具有 rds_superuser
角色的用户无法查询 pg_user_mapping
表。下面的示例使用了 rdssu1
。
test=> SET SESSION AUTHORIZATION rdssu1; SET test=> select * from pg_user_mapping; ERROR: permission denied for table pg_user_mapping
在 RDS for PostgreSQL 上,所有用户(甚至是具有 rds_superuser
角色的用户)只能在 pg_user_mappings
表中看到自己的 umoptions
值。以下示例进行了展示。
test=> SET SESSION AUTHORIZATION rdssu1; SET test=> select * from pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+---------+--------+------------+---------------------------------- 16414 | 16411 | oradb | 16412 | user1 | 16423 | 16411 | oradb | 16421 | rdssu1 | {user=oracleuser,password=mypwd} 16424 | 16411 | oradb | 16422 | rdssu2 | (3 rows) test=> SET SESSION AUTHORIZATION rdssu2; SET test=> select * from pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+---------+--------+------------+---------------------------------- 16414 | 16411 | oradb | 16412 | user1 | 16423 | 16411 | oradb | 16421 | rdssu1 | 16424 | 16411 | oradb | 16422 | rdssu2 | {user=oracleuser,password=mypwd} (3 rows) test=> SET SESSION AUTHORIZATION user1; SET test=> select * from pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+---------+--------+------------+-------------------------------- 16414 | 16411 | oradb | 16412 | user1 | {user=oracleuser,password=mypwd} 16423 | 16411 | oradb | 16421 | rdssu1 | 16424 | 16411 | oradb | 16422 | rdssu2 | (3 rows)
由于 information_schema._pg_user_mappings
和 pg_catalog.pg_user_mappings
的实施不同,手动创建的 rds_superuser
需要额外的权限才能在 pg_catalog.pg_user_mappings
中查看密码。
具有 rds_superuser
角色的用户无需额外权限即可在 information_schema._pg_user_mappings
中查看密码。
没有 rds_superuser
角色的用户只能在以下条件下在 pg_user_mappings
中查看密码:
-
当前用户是被映射的用户,拥有服务器或对其具有
USAGE
权限。 -
当前用户是服务器所有者,此映射用于
PUBLIC
。