Uso de una base de datos de Oracle con la extensión oracle_fdw
Para acceder a una base de datos de Oracle desde su instancia de base de datos de RDS for PostgreSQL puede instalar y utilizar la extensión oracle_fdw
. Esta extensión es un contenedor de datos externos para bases de datos Oracle. Para obtener más información sobre la extensión, consulte la documentación de oracle_fdw
La extensión oracle_fdw
es compatible con las versiones 12.7, 13.3 y las versiones posteriores de RDS for PostgreSQL.
Temas
Activación de la extensión oracle_fdw
Para utilizar la extensión oracle_fdw, lleve a cabo el siguiente procedimiento.
Para habilitar la extensión oracle_fdw
-
Ejecute el siguiente comando con una cuenta que tenga los permisos
rds_superuser
.CREATE EXTENSION oracle_fdw;
Ejemplo: Usar un servidor externo vinculado a una Amazon RDS for Oracle Database
El siguiente ejemplo muestra el uso de un servidor externo vinculado a una base de datos de Amazon RDS for Oracle.
Crear un servidor externo vinculado a una base de datos de RDS for Oracle
-
Tenga en cuenta lo siguiente en la instancia de base de datos de RDS for Oracle:
-
punto de enlace
-
Puerto
-
Nombre de base de datos
-
-
Cree un servidor externo.
test=>
CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//
endpoint
:port
/DB_name
');CREATE SERVER
-
Otorgue uso a un usuario que no tenga permisos
rds_superuser
, por ejemplouser1
.test=>
GRANT USAGE ON FOREIGN SERVER oradb TO user1;
GRANT
-
Conéctese como
user1
y cree una asignación a un usuario de Oracle.test=>
CREATE USER MAPPING FOR user1 SERVER oradb OPTIONS (user '
oracleuser'
, password 'mypassword'
);CREATE USER MAPPING
-
Cree una tabla externa vinculada a una tabla de Oracle.
test=>
CREATE FOREIGN TABLE
mytab
(a int) SERVER oradb OPTIONS (table 'MYTABLE'
);CREATE FOREIGN TABLE
-
Consulte la tabla externa.
test=>
SELECT * FROM mytab;
a --- 1 (1 row)
Si la consulta informa el siguiente error, verifique el grupo de seguridad y la lista de control de acceso (ACL) para asegurarse de que ambas instancias puedan comunicarse.
ERROR: connection for foreign table "mytab" cannot be established
DETAIL: ORA-12170: TNS:Connect timeout occurred
Trabajo con cifrado en tránsito
El cifrado de PostgreSQL a Oracle en tránsito se basa en una combinación de parámetros de configuración de cliente y servidor. Para obtener un ejemplo que utiliza Oracle 21c, consulte About the Values for Negotiating Encryption and IntegrityACCEPTED
, lo que significa que el cifrado depende de la configuración del servidor de base de datos de Oracle.
Si su base de datos está en RDS for Oracle, consulte Oracle Native Network Encryption para configurar el cifrado.
Comprensión y permisos de la vista pg_user_mappings
El catálogo de PostgreSQL pg_user_mapping
almacena la asignación desde un usuario RDS for PostgreSQL en el usuario de un servidor de datos externo (remoto). El acceso al catálogo está restringido, pero usted utiliza la vista pg_user_mappings
para ver las asignaciones. A continuación, se muestra un ejemplo sobre cómo se aplican los permisos en una base de datos de Oracle de ejemplo, aunque esta información es válida también en general para cualquier contenedor de datos externo.
En el siguiente resultado, puede encontrar roles y permisos asignados a tres usuarios de ejemplo diferentes. Usuarios de rdssu1
y rdssu2
son miembros del rol rds_superuser
, y el usuario user1
no lo es. En el ejemplo se usa el metacomando \du
de psql
para enumerar los roles existentes.
test=>
\du
List of roles Role name | Attributes | Member of -----------------+------------------------------------------------------------+------------------------------------------------------------- rdssu1 | | {rds_superuser} rdssu2 | | {rds_superuser} user1 | | {}
Todos los usuarios, incluidos los usuarios con privilegios rds_superuser
, pueden ver sus propias asignaciones de usuarios (umoptions
) en la tabla pg_user_mappings
. Como se muestra en el siguiente ejemplo, cuando rdssu1
intenta obtener todas las asignaciones de usuario, se genera un a pesar de los privilegios rds_superuser
de rdssu1
:
test=>
SELECT * FROM pg_user_mapping;
ERROR: permission denied for table pg_user_mapping
A continuación, se muestran algunos ejemplos:
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)
Debido a las diferencias en la implementación de information_schema._pg_user_mappings
y pg_catalog.pg_user_mappings
, un rds_superuser
que se crea manualmente requiere permisos adicionales para ver las contraseñas en pg_catalog.pg_user_mappings
.
No requieren otros permisos para un rds_superuser
para ver las contraseñas en information_schema._pg_user_mappings
.
Los usuarios que no tienen el rol rds_superuser
pueden ver contraseñas en pg_user_mappings
solo en las condiciones que se describen a continuación:
-
El usuario actual es el usuario que se está asignando y es el propietario del servidor o tiene el privilegio de
USAGE
en él. -
El usuario actual es el propietario del servidor, y la asignación es para
PUBLIC
.