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:35:50 |
Message-ID: | 1ac06cd0-cb2c-fa5b-dc64-d9682dfaaa03@gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
si por favor cambia por md5, y ten cuidado usar generalmente trust,
puede ser un espacio para que se conecten algunos usuarios no deseados y
traer otras consecuencias...
On 20/8/21 16:32, Andrés P.P. wrote:
>
> consultas..
>
> - el user mapping lo sigo creando de la misma forma: ??..
>
> CREATE USER MAPPING FOR *postgres* SERVER mibd1_srv OPTIONS(user
> 'miuser_db1', password 'miuser_db1');
>
> o.....
>
> CREATE USER MAPPING FOR *miuser_db2 *SERVER mibd1_srv OPTIONS(user
> 'miuser_db1', password 'miuser_db1');
>
> y el permiso en pg_hba...
>
> agrego:
>
> local all all md5 ?
> o peer..
> o quito el trust.. (no tengo muy claro los otros usos ya que
> generalmente usamos trust..).....
>
>
>
> El vie, 20 ago 2021 a las 16:23, Anthony Sotolongo
> (<asotolongo(at)gmail(dot)com <mailto:asotolongo(at)gmail(dot)com>>) escribió:
>
> 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.
>>>>
From | Date | Subject | |
---|---|---|---|
Next Message | Ekaterina Amez | 2021-09-20 14:48:38 | Replicación simple en PG9.6 que no funciona |
Previous Message | Andrés P.P. | 2021-08-20 20:32:18 | Re: Dudas DBLink |