使用 oracle_fdw 擴充功能處理 Oracle 資料庫 - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 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的外部伺服器
  1. 請注意 Oracle 資料庫執行個體的RDS下列事項:

    • 端點

    • 連線埠

    • 資料庫名稱

  2. 建立外部伺服器。

    test=> CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//endpoint:port/DB_name'); CREATE SERVER
  3. 授予使用權限給沒有 rds_superuser 權限的使用者,例如 user1

    test=> GRANT USAGE ON FOREIGN SERVER oradb TO user1; GRANT
  4. 連線為 user1 並建立一個對應至 Oracle 使用者的映射。

    test=> CREATE USER MAPPING FOR user1 SERVER oradb OPTIONS (user 'oracleuser', password 'mypassword'); CREATE USER MAPPING
  5. 建立連結至 Oracle 資料表的外部資料表。

    test=> CREATE FOREIGN TABLE mytab (a int) SERVER oradb OPTIONS (table 'MYTABLE'); CREATE FOREIGN TABLE
  6. 查詢外部資料表。

    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 文件中的關於溝通加密和完整性的值。在 Amazon RDS 上用於 oracle_fdw 的用戶端設定為ACCEPTED,這表示加密取決於 Oracle 資料庫伺服器組態。

如果您的資料庫已開啟 RDS Oracle,請參閱 Oracle 原生網路加密以設定加密。

了解 pg_user_mappings 檢視和許可權限

Postgre SQL 目錄會將 Postgre SQL Aurora SQL 使用者的對應pg_user_mapping儲存到外部資料 (遠端) 伺服器上的使用者。RDS存取目錄受到限制,但您使用 pg_user_mappings 檢視查看映射。接下來,您可找到一個範例,其顯示許可權限如何套用於範例 Oracle 資料庫,但此資訊通常適用於任何外部資料包裝函式。

在以下輸出中,您可以找到映射至三個不同範例使用者的角色和權限。使用者 rdssu1rdssu2rds_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 嘗試獲取所有使用者映射,即使有 rdssu1rds_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_mappingspg_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