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

Reply via email to