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 <mailto: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 <mailto: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
        <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.

Reply via email to