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 (<asotolo...@gmail.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 (<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