Interazione con un database Oracle utilizzando l'estensione oracle_fdw - Amazon Relational Database Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Interazione con un database Oracle utilizzando l'estensione oracle_fdw

Per accedere a un database Oracle dall'istanza database RDS for PostgreSQL è possibile installare e utilizzare l'estensione oracle_fdw. Questa estensione è un wrapper di dati esterni per database Oracle. Per ulteriori informazioni sull'estensione, consultare la documentazione di oracle_fdw.

L'estensione oracle_fdw è supportata su RDS for PostgreSQL 12.7, 13.3 e versioni successive.

Attivazione dell'estensione oracle_fdw

Per utilizzare l'estensione oracle_fdw, eseguire la procedura riportata di seguito.

Come attivare l'estensione oracle_fdw
  • Eseguire il seguente comando utilizzando un account con le autorizzazioni rds_superuser.

    CREATE EXTENSION oracle_fdw;

Esempio: utilizzo di un server esterno collegato a un database Amazon RDS for Oracle

L'esempio seguente mostra l'utilizzo di un server esterno collegato a un database Amazon RDS for Oracle.

Come creare un server esterno collegato a un database RDS for Oracle
  1. Annotare le seguenti informazioni sull'istanza database RDS for Oracle:

    • Endpoint

    • Porta

    • Nome del database

  2. Creare un server esterno.

    test=> CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//endpoint:port/DB_name'); CREATE SERVER
  3. Concedere l'utilizzo a un utente che non dispone dei privilegi rds_superuser, ad esempiouser1.

    test=> GRANT USAGE ON FOREIGN SERVER oradb TO user1; GRANT
  4. Connettersi come user1 e creare una mappatura a un utente Oracle.

    test=> CREATE USER MAPPING FOR user1 SERVER oradb OPTIONS (user 'oracleuser', password 'mypassword'); CREATE USER MAPPING
  5. Creare una tabella esterna collegata a una tabella Oracle.

    test=> CREATE FOREIGN TABLE mytab (a int) SERVER oradb OPTIONS (table 'MYTABLE'); CREATE FOREIGN TABLE
  6. Eseguire una query sulla tabella esterna.

    test=> SELECT * FROM mytab; a --- 1 (1 row)

Se la query segnala il seguente errore, controllare il gruppo di sicurezza e la lista di controllo degli accessi (ACL) per assicurarsi che entrambe le istanze possano comunicare.

ERROR: connection for foreign table "mytab" cannot be established DETAIL: ORA-12170: TNS:Connect timeout occurred

Utilizzo della crittografia in transito

PostgreSQL-to-Oracle la crittografia in transito si basa su una combinazione di parametri di configurazione client e server. Per un esempio di utilizzo di Oracle 21c, consultare Informazioni sui valori per la negoziazione di crittografia e integrità nella documentazione Oracle. Il client utilizzato per oracle_fdw su Amazon RDS è configurato ACCEPTED con, il che significa che la crittografia dipende dalla configurazione del server di database Oracle e utilizza Oracle Security Library (libnnz) per la crittografia.

Se il database si trova su RDS for Oracle, consultare Crittografia di rete nativa Oracle per configurare la crittografia.

Informazioni sulla visualizzazione pg_user_mappings e sulle autorizzazioni

Il catalogo PostgreSQL pg_user_mapping archivia la mappatura da un utente RDS for PostgreSQL all'utente in un server remoto di dati esterni. L'accesso al catalogo è limitato, ma puoi usare la visualizzazione pg_user_mappings per vedere le mappature. Di seguito è possibile trovare un esempio che mostra come si applicano le autorizzazioni con un database Oracle, sebbene le stesse informazioni si applichino più in generale a qualsiasi wrapper di dati esterno.

Nel seguente output sono presenti ruoli e autorizzazioni mappati su tre diversi utenti di esempio. Gli utenti rdssu1 e rdssu2 sono membri del ruolo rds_superuser, mentre user1 non lo è. Nell'esempio viene utilizzato il metacomando psql \du per elencare i ruoli esistenti.

test=> \du List of roles Role name | Attributes | Member of -----------------+------------------------------------------------------------+------------------------------------------------------------- rdssu1 | | {rds_superuser} rdssu2 | | {rds_superuser} user1 | | {}

Tutti gli utenti, inclusi gli utenti che godono dei privilegi rds_superuser, sono autorizzati a visualizzare le proprie mappature utente (umoptions) nella tabella pg_user_mappings. Come mostrato nell'esempio seguente, quando rdssu1 cerca di ottenere tutte le mappature utente, viene generato un errore anche se gode dei privilegi rdssu1rds_superuser:

test=> SELECT * FROM pg_user_mapping; ERROR: permission denied for table pg_user_mapping

Di seguito vengono riportati alcuni esempi.

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)

A causa delle differenze nell'implementazione di information_schema._pg_user_mappings e pg_catalog.pg_user_mappings, un rds_superuser creato manualmente richiede autorizzazioni aggiuntive per visualizzare le password in pg_catalog.pg_user_mappings.

Non sono necessarie autorizzazioni aggiuntive per un rds_superuser che desideri visualizzare le password in information_schema._pg_user_mappings.

Gli utenti che non dispongono del ruolo rds_superuser possono visualizzare le password in pg_user_mappings solo nelle seguenti condizioni:

  • L'utente corrente è l'utente mappato e possiede il server oppure detiene il privilegio USAGE su di esso.

  • L'utente corrente è il proprietario del server e la mappatura è per PUBLIC.