Предоставление разрешений локальному пользователю для внешней таблицы БД в postgres

#postgresql #postgresql-12

#postgresql #postgresql-12

Вопрос:

Я настроил соединение с внешней базой данных с помощью dblink_connect в соответствии с документами:

 CREATE SERVER fdtest FOREIGN DATA WRAPPER dblink_fdw OPTIONS (hostaddr '127.0.0.1', dbname 'foreign_test_db');

CREATE USER test_user WITH PASSWORD 'secret';
CREATE USER MAPPING FOR test_user SERVER fdtest OPTIONS (user 'test_user', password 'secret');
GRANT USAGE ON FOREIGN SERVER fdtest TO regress_dblink_user;
GRANT SELECT ON TABLE foo TO test_user;

c - regress_dblink_user
SELECT dblink_connect('myconn', 'fdtest');


SELECT * FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]);
  

Окончательный ‘GRANT SELECT’, по-видимому, подразумевает, что если он предназначен для предоставления разрешений на выбор локальному пользователю test_user для таблицы foo в оболочке внешних данных fdtest. Однако, как я бы интерпретировал эту команду, она предоставляет разрешения test_user для выбора в локальной таблице foo (которая не существует). Как и ожидалось, при запуске этой команды я получаю сообщение об ошибке:

 ERROR:  relation "foo" does not exist
  

Я хотел бы знать, как на самом деле это сделать. Я хотел бы иметь возможность ограничивать доступ локальных пользователей только к определенным таблицам из внешней оболочки данных.

Ответ №1:

Вам нужно будет подключиться к удаленной базе данных и запустить там GRANT инструкцию.

Конечно, вы могли бы сделать это через dblink, но тогда вам пришлось бы подключиться к суперпользователю или владельцу таблицы.

Комментарии:

1. Да, я понял, что это просто своего рода рекурсивный пример. Они предполагают, что оба подключения к БД абсолютно одинаковы. Не кажется лучшим способом представить пример, но я новичок, так что это проблема только для меня. Спасибо за разъяснение!

Ответ №2:

Показываемое ими соединение — это обратное соединение, оно просто подключается к тому же серверу и (по-видимому) базе данных, в которой вы уже находитесь. Это полезно для целей тестирования. Таким образом, предоставление разрешения на локальном сервере — это то же самое, что и предоставление его на удаленном сервере, поскольку они являются одним и тем же сервером.

Они не показывают создание таблицы, вы можете найти его в контрибе регрессионного теста / dblink / sql /dblink.sql (из которого получен пример в документе) как:

 CREATE TABLE foo(f1 int, f2 text, f3 text[], primary key (f1,f2));