Estimados, Anthony.. Probé el postgres_fdw y me funcionó... pero nuevamente para el usuario postgres...
Creé las mismas dos bds, esquemas y tablas... y luego, en vez de dblink hice lo siguiente: mibd_2=> \c mibd_2 postgres Ahora esta conectado a la base de datos «mibd_2» con el usuario «postgres». mibd_2=# CREATE EXTENSION postgres_fdw; CREATE EXTENSION mibd_2=# CREATE SERVER mibd1_srv FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost',dbname 'mibd_1', port '5432'); CREATE SERVER mibd_2=# CREATE USER MAPPING FOR postgres SERVER mibd1_srv OPTIONS(user 'miuser_db1', password 'miuser_db1'); CREATE USER MAPPING mibd_2=# CREATE FOREIGN TABLE db1_mitabla1 (id integer, name varchar(20)) SERVER mibd1_srv OPTIONS(schema_name 'midb1_catalog', table_name 'mitabla1'); CREATE FOREIGN TABLE mibd_2=# select * from db1_mitabla1; id | name ----+--------------- 1 | registrodb1_1 2 | registrodb1_2 3 | registrodb1_3 (3 filas) *osea, nuevamente excelente!...funciona!... pero desde el usuario postgres.... cuando intento hacerlo desde mi usuario: miuser_db2 .. falla..* mibd_2=# \c mibd_2 miuser_db2 Ahora esta conectado a la base de datos «mibd_2» con el usuario «miuser_db2». mibd_2=> select * from db1_mitabla1; *ERROR: permiso denegado a la relacion db1_mitabla1* *...volví al usuario postgres le di un grant select para mi usuario miuser_db2*.....* volví a conectarme a mi usuario* *y probé de nuevo..* mibd_2=# \c mibd_2 miuser_db2 Ahora esta conectado a la base de datos «mibd_2» con el usuario «miuser_db2». mibd_2=> select * from db1_mitabla1; *ERROR: no se encontro un mapeo para el usuario «miuser_db2»* *Me podrían ayudar con este detallito.??..* ...en una de las pruebas también creé un user mapping adicional: CREATE USER MAPPING FOR miuser_db2 SERVER mibd1_srv OPTIONS(user 'miuser_db1', password 'miuser_db1'); pero al conectarme y probar: mibd_2=# \c mibd_2 miuser_db2 Ahora esta conectado a la base de datos «mibd_2» con el usuario «miuser_db2». mibd_2=> select * from db1_mitabla1; *ERROR: password is requiredDETALLE: Non-superuser cannot connect if the server does not request a password.SUGERENCIA: Target server's authentication method must be changed.* osea, me encuentro casi con los mismos errores que con dblink... Slds. Andrés El vie, 20 ago 2021 a las 12:51, Andrés P.P. (<solopostg...@gmail.com>) escribió: > > oh!... voy a investigar eso... > > Gracias Anthony. > > Slds. > Andrés. > > > El vie, 20 ago 2021 a las 12:47, Anthony Sotolongo (<asotolo...@gmail.com>) > escribió: > >> Hola Andres, te recomiendo que uses FDW para ese tipo de actividad en >> PostgreSQL, FDW provee una sintaxis más limpia y adem[as es compatible con >> los estándares y en la mayor[iaa de los escenarios puede ofrecer un mejor >> rendimiento >> >> para la version 9.6: >> https://www.postgresql.org/docs/9.6/postgres-fdw.html >> >> Asi podrás también simplicar el tema que preguntas del sinónimo(que en >> PostgreSQL no existe ese concepto), pues ya defines la tabla que es otro >> objeto más de tu base de datos aunque los datos estan en otra base. >> >> >> Saludos >> >> >> On 20/8/21 12:27, Andrés P.P. wrote: >> >> >> Estimados >> >> Quiero comunicar dos BDs que están en la misma máquina (motor 9.6), asi >> que antes de tocar las BDs oficiales me creé el siguiente caso-ejemplo.... >> Una bd1 con una tabla, otra bd2 con otra tabla y el objetivo es leer >> datos de la bd1 desde la bd2. >> >> Al final les hago las consultas... >> >> >> *Primero creé mi bd1, un usuario, un schema y una tabla * >> ========================================================================== >> postgres=# \c template1 postgres >> Ahora esta conectado a la base de datos «template1» con el usuario >> «postgres». >> >> template1=# create database mibd_1; >> CREATE DATABASE >> >> template1=# \c mibd_1 postgres >> Ahora esta conectado a la base de datos «mibd_1» con el usuario >> «postgres». >> >> mibd_1=# create user miuser_db1 password 'miuser_db1' nocreatedb; >> CREATE ROLE >> >> mibd_1=# create schema midb1_catalog authorization miuser_db1; >> CREATE SCHEMA >> >> mibd_1=# \c mibd_1 miuser_db1 >> Ahora esta conectado a la base de datos «mibd_1» con el usuario >> «miuser_db1». >> >> mibd_1=# create table midb1_catalog.mitabla1 (id integer, name >> varchar(20)); >> CREATE TABLE >> >> mibd_1=# insert into midb1_catalog.mitabla1 values(1,'registrodb1_1'); >> INSERT 0 1 >> mibd_1=# insert into midb1_catalog.mitabla1 values(2,'registrodb1_2'); >> INSERT 0 1 >> mibd_1=# insert into midb1_catalog.mitabla1 values(3,'registrodb1_3'); >> INSERT 0 1 >> >> mibd_1=# select * from midb1_catalog.mitabla1; >> id | name >> ----+--------------- >> 1 | registrodb1_1 >> 2 | registrodb1_2 >> 3 | registrodb1_3 >> >> ========================================================================== >> >> *Luego, en la misma máquina, creé mi bd2 , un usuario, un esquema y una >> tabla * >> postgres=# \c template1 postgres >> Ahora esta conectado a la base de datos «template1» con el usuario >> «postgres». >> >> template1=# create database mibd_2; >> CREATE DATABASE >> >> template1=# \c mibd_2 postgres >> Ahora esta conectado a la base de datos «mibd_2» con el usuario >> «postgres». >> >> mibd_2=# create user miuser_db2 password 'miuser_db2' nocreatedb; >> CREATE ROLE >> >> mibd_2=# create schema midb2_catalog authorization miuser_db2; >> CREATE SCHEMA >> >> mibd_2=# \c mibd_2 miuser_db2 >> Ahora esta conectado a la base de datos «mibd_2» con el usuario >> «miuser_db2». >> >> mibd_2=# create table midb2_catalog.mitabla2 (id integer, name >> varchar(20)); >> CREATE TABLE >> >> mibd_2=# insert into midb2_catalog.mitabla2 values(1,'registrodb2_1'); >> INSERT 0 1 >> mibd_2=# insert into midb2_catalog.mitabla2 values(2,'registrodb2_2'); >> INSERT 0 1 >> mibd_2=# insert into midb2_catalog.mitabla2 values(3,'registrodb2_3'); >> INSERT 0 1 >> mibd_2=# insert into midb2_catalog.mitabla2 values(4,'registrodb2_4'); >> INSERT 0 1 >> >> mibd_2=# select * from midb2_catalog.mitabla2; >> id | name >> ----+--------------- >> 1 | registrodb2_1 >> 2 | registrodb2_2 >> 3 | registrodb2_3 >> 4 | registrodb2_4 >> >> >> =========================================================================== >> *Hasta aquí todo sin novedades..* >> >> >> *Intento crear la extension (aún conectado a mi usuario miuser_db2) * >> mibd_2=> create extension dblink; >> ERROR: se ha denegado el permiso para crear la extension «dblink» >> SUGERENCIA: Debe ser superusuario para crear esta extension. >> >> Asi que me conecto al usuario postgres >> >> mibd_2=> \c mibd_2 postgres >> Ahora esta conectado a la base de datos «mibd_2» con el usuario >> «postgres». >> >> mibd_2=# create extension dblink; >> CREATE EXTENSION >> >> bien! >> >> =========================================================================== >> >> >> *Luego (aún conectado al usuario postgres), intenté leer desde mi db2 la >> data de la db1... de acuerdo a los ejemplos que vi.. * >> mibd_2=# *select t1.name <http://t1.name> from dblink('dbname=mibd_1 >> user=miuser_db1 password=miuser_db1','select name from >> midb1_catalog.mitabla1') AS t1(name varchar(20))*; >> name >> --------------- >> registrodb1_1 >> registrodb1_2 >> registrodb1_3 >> >> *bien! ... HASTA AQUÍ LOGRÉ EL OBJETIVO!.. (Sin embargo, necesito que >> funcione estando conectado al usuario particular que creé.. miuser_db2)* >> >> >> ================================================================================================ >> *Me cambié a mi usuario:* >> >> mibd_2=# \c mibd_2 miuser_db2 >> Ahora esta conectado a la base de datos «mibd_2» con el usuario >> «miuser_db2». >> mibd_2=> *select t1.name <http://t1.name> from dblink('dbname=mibd_1 >> user=miuser_db1 password=miuser_db1','select name from >> midb1_catalog.mitabla1') AS t1(name varchar(20));* >> >> >> *ERROR: password is required DETALLE: Non-superuser cannot connect if >> the server does not request a password. SUGERENCIA: Target server's >> authentication method must be changed.* >> >> *Leí las sugerencias, me conecté al usuario postgres y apliqué unos >> permisos para usar una función alternativa a dblink:* >> >> mibd_2=> \c mibd_2 postgres >> Ahora esta conectado a la base de datos «mibd_2» con el usuario >> «postgres». >> mibd_2=# grant execute on function *dblink_connect_u*(text) TO >> miuser_db2; >> GRANT >> mibd_2=# grant execute on function *dblink_connect_u*(text,text) TO >> miuser_db2; >> GRANT >> >> *Intento nuevamente* >> >> mibd_2=# \c mibd_2 miuser_db2 >> Ahora esta conectado a la base de datos «mibd_2» con el usuario >> «miuser_db2». >> >> mibd_2=> *select t1.name <http://t1.name> from >> dblink_connect_u('dbname=mibd_1 user=miuser_db1 >> password=miuser_db1','select name from midb1_catalog.mitabla1') AS t1(name >> varchar(20));* >> >> >> *...y me arroja el ERROR: * >> [local] mibd_2 miuser_db2 24055 0 2021-08-20 11:24:38 -04 *ERROR: solo >> se permite una lista de definicion de columnas en funciones que retornan >> «record»* en caracter 139 >> [local] mibd_2 miuser_db2 24055 0 2021-08-20 11:24:38 -04 SENTENCIA: >> select t1.name from dblink_connect_u('dbname=mibd_1 user=miuser_db1 >> password=miuser_db1','select name from midb1_catalog.mitabla1') AS t1(name >> varchar(20)); >> >> >> ============================================================================================ >> *AQUI VIENEN MIS DUDAS.*.. (perdonen lo extenso del ejemplo pero quería >> que vieran la secuencia completa...) >> >> 1.- En el primer error... de la Password... estuvo bien que le diera >> permiso a la función *dblink_connect_u *y que usara esta función para >> probar esto??.. >> Existe otra forma de evitar ese error?? (el acceso pg_hba está en >> modo trust).. >> >> 2.- En el segundo error... de la lista de definicion de columnas... >> Cómo lo soluciono?.... en todos los lados que revisé la parte del alias >> tiene la forma que estoy usando... >> >> 3.- Este es un Bonus que no tiene que ver con el error pero me sería >> útil...(una vez que resuelva lo anterior).. >> Se puede crear una especie de sinónimo para representar el dblink a >> una tabla de otra BD?? >> Por ejemplo .. algo del estilo: create synonym db1_tabla1 on >> dblink('dbname=mibd_1 user=miuser_db1 password=miuser_db1','select name >> from midb1_catalog.mitabla1') ?... >> .. para después accesarla simplemente como db1_tabla1 ... >> >> Bueno, eso... agradecido desde ya por cualquier orientación. >> >> Slds. >> Andrés. >> >>