si por favor cambia por md5, y ten cuidado usar generalmente trust, puede ser un espacio para que se conecten algunos usuarios no deseados y traer otras consecuencias...


On 20/8/21 16:32, Andrés P.P. wrote:

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