Re: Dudas DBLink

From: Anthony Sotolongo <asotolongo(at)gmail(dot)com>
To: Andrés P(dot)P(dot) <solopostgres(at)gmail(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Dudas DBLink
Date: 2021-08-20 20:23:05
Message-ID: 0ad7bfd5-995e-ec53-c75a-5ffdc26bc04e@gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

En la documentacion se puede ver:

-- FOREIGN DATA WRAPPER functionality
-- Note: local connection must require password authentication for this to work properly
-- Otherwise, you will receive the following error from dblink_connect():
-- ----------------------------------------------------------------------
-- ERROR: password is required
-- DETAIL: Non-superuser cannot connect if the server does not request a password.
-- HINT: Target server's authentication method must be changed.

por ende debes habilitar algun tipo de autenticacion que requiera
password para usuarios que no son susperuser

Saludos

On 20/8/21 16:17, Andrés P.P. wrote:
>
> Hola Anthony, Hola Heriberto...
>
> Tengo mis accesos en trust ...
>
> # TYPE  DATABASE        USER    ADDRESS                 METHOD
> local   all             all     trust
>
> .. no debería pedirme password...  ojo que cuando creé el user mapping
> con postgres puedo leer la tabla remota....  pero si creo el user
> mapping con mi usuario (miuser_db2) o le doy grant select desde
> postgres... me salen esos errores...
>
> (mientras tanto probaré con los permisos de connect y usage que
> menciona Heriberto)..
>
> Slds.
> Andrés
> .
>
>
> El vie, 20 ago 2021 a las 16:05, Anthony Sotolongo
> (<asotolongo(at)gmail(dot)com <mailto:asotolongo(at)gmail(dot)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.
>> (<solopostgres(at)gmail(dot)com <mailto:solopostgres(at)gmail(dot)com>>) escribió:
>>
>>
>> oh!...    voy a investigar eso...
>>
>> Gracias Anthony.
>>
>> Slds.
>> Andrés.
>>
>>
>> El vie, 20 ago 2021 a las 12:47, Anthony Sotolongo
>> (<asotolongo(at)gmail(dot)com <mailto:asotolongo(at)gmail(dot)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
>> <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 <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));
>>>
>>> ============================================================================================
>>> *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.
>>>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Andrés P.P. 2021-08-20 20:32:18 Re: Dudas DBLink
Previous Message Andrés P.P. 2021-08-20 20:17:26 Re: Dudas DBLink