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