#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));