debe revisar los permisos de usuario a las dos DB a las Db permiso de conect y a los esquemas de cada base de datos permisos de usage
El vie, 20 de ago. de 2021 a la(s) 15:05, Anthony Sotolongo ( asotolo...@gmail.com) escribió: > Hola nuevamente Andres, me parece que es un tema de los permisos... y > accesos > > > ¿Puedes mostrar tu archivo pg_hba.conf? > > Saludos > On 20/8/21 15:41, Andrés P.P. wrote: > > > 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 required DETALLE: 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. >>> >>> -- -