本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 oracle_fdw 擴充功能處理 Oracle 資料庫
若要從行個體的 Aurora Postgre 資料SQL庫叢集存取 Oracle 資料庫,您可以安裝並使用擴充功能。SQL oracle_fdw
此擴充功能是 Oracle 資料庫的外部資料包裝函式。若要進一步了解此擴充功能,請參閱 oracle_fdw
該oracle_fdw
擴展是支持 Aurora 郵政 SQL 12.7 (Amazon Aurora 版本 4.2) 和更高版本.
開啟 oracle_fdw 擴充功能
如要使用 oracle_fdw 擴充功能,請執行下列程序。
如要開啟 oracle_fdw 擴充功能
-
使用具有
rds_superuser
許可的帳戶執行下列命令。CREATE EXTENSION oracle_fdw;
範例:使用連結至適用RDS於 Oracle 資料庫的 Amazon 的外部伺服器
下列範例顯示連結至 Amazon RDS 適用於 Oracle 資料庫的外部伺服器的使用方式。
若要建立連結至 Oracle 資料庫RDS的外部伺服器
-
請注意 Oracle 資料庫執行個體的RDS下列事項:
-
端點
-
連線埠
-
資料庫名稱
-
-
建立外部伺服器。
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
在傳輸中使用加密
傳輸過程中 Postgre SQL 到 Oracle 的加密是以用戶端和伺服器組態參數的組合為基礎。如需使用 Oracle 21c 的範例,請參閱 Oracle 文件中的關於溝通加密和完整性的值ACCEPTED
,這表示加密取決於 Oracle 資料庫伺服器組態。
如果您的資料庫已開啟 RDS Oracle,請參閱 Oracle 原生網路加密以設定加密。
了解 pg_user_mappings 檢視和許可權限
Postgre SQL 目錄會將 Postgre SQL Aurora SQL 使用者的對應pg_user_mapping
儲存到外部資料 (遠端) 伺服器上的使用者。RDS存取目錄受到限制,但您使用 pg_user_mappings
檢視查看映射。接下來,您可找到一個範例,其顯示許可權限如何套用於範例 Oracle 資料庫,但此資訊通常適用於任何外部資料包裝函式。
在以下輸出中,您可以找到映射至三個不同範例使用者的角色和權限。使用者 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_mappings
資料表中查看自己的使用者映射 (umoptions
)。如以下範例所示,當 rdssu1
嘗試獲取所有使用者映射,即使有 rdssu1
rds_superuser
權限,仍會引起錯誤:
test=>
SELECT * FROM pg_user_mapping;
ERROR: permission denied for table pg_user_mapping
下列是一些範例。
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
。