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:05:03 |
Message-ID: | e9f24caa-2753-3a94-e18f-cfdfd48419db@gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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 | Heriberto Giron Samboni | 2021-08-20 20:07:35 | Re: Dudas DBLink |
Previous Message | Andrés P.P. | 2021-08-20 19:41:40 | Re: Dudas DBLink |