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