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. > >