#postgresql #postgres-fdw
Вопрос:
Я пытаюсь создать FDW postgres
, используя учетные данные суперпользователя, выполнив следующие действия —
- Мой суперпользователь-это
postgres
- СОЗДАЙТЕ
testfdw
ПАРАМЕТРЫ ОБОЛОЧКИ ВНЕШНИХ ДАННЫХ СЕРВЕРАpostgres_fdw
(хост ‘10.10.10.171’, имя базы данных ‘testdb’, порт ‘5432’, размер выборки ‘50000’); - Я создал удаленного пользователя, доступного только для чтения
testdb_read_only_user
testdb
, и предоставил права только для чтения всем таблицам, последовательностям и функциям в нем - Теперь я создаю сопоставление пользователей для своего локального суперпользователя БД
postgres
- СОЗДАЙТЕ СОПОСТАВЛЕНИЕ ПОЛЬЗОВАТЕЛЕЙ ДЛЯ
postgres
testfdw
ПАРАМЕТРОВ СЕРВЕРА (пользователь «testdb_read_only_user», пароль «testpasswrd») - Затем я запускаю ИМПОРТ ОБЩЕДОСТУПНОЙ ВНЕШНЕЙ СХЕМЫ С СЕРВЕРА
testfdw
Вtest_local_schema
; - Теперь, когда я пытаюсь создать новую внешнюю таблицу с
test_local_schema
использованиемpostrges
суперпользователя, я все еще могу ее создать, но фактическое поведение, которого я ожидаю, — ошибка отказа в разрешении, и мое сопоставление пользователей основано на пользователе, доступном только для чтения, которого я создал в удаленной БД
Я что-то здесь упускаю. Пожалуйста, ведите.
Комментарии:
1. Я не понимаю ваших ожиданий. Создание внешней таблицы не записывается на внешний сервер, оно записывает описание внешней таблицы на локальный сервер.
Ответ №1:
Внешняя схема test_local_schema принадлежит postgres(суперпользователю), и PostgreSQL, рассматривающий ее как локальную схему(по назначению), дает вам возможность создать новую таблицу, Теперь, когда вы создаете новую внешнюю таблицу в test_local_schema, postgres проверит следующие ограничения
- Имя внешней таблицы должно отличаться от имени любой другой внешней таблицы, таблицы, последовательности, индекса, представления или материализованного представления в той же схеме.
- Чтобы создать внешнюю таблицу, у вас должны быть права на ИСПОЛЬЗОВАНИЕ(чтение) на внешнем сервере, а также права на использование для всех типов столбцов, используемых в таблице
- СОЗДАЙТЕ привилегию в целевой схеме.
Поскольку ваше сопоставление пользователей имеет пользователя только для чтения в исходной базе данных, вы должны иметь возможность извлекать данные для создания внешней таблицы в целевой базе данных, однако всякий раз, когда вы будете обновлять и вставлять новые данные, это приведет к ошибке, так как testdb_read_only_user не имеет никаких прав на обновление/вставку.
https://www.postgresql.org/docs/9.5/sql-createforeigntable.html
https://www.postgresql.org/docs/9.5/sql-importforeignschema.html
Комментарии:
1. Огромное спасибо, Нихил! Вы правы, я не могу обновить или удалить какие-либо таблицы во внешней схеме, используя пользователя только для чтения. Другая вещь, которую я заметил, заключается в том, что, хотя я могу создать внешнюю таблицу в своей локальной схеме с помощью суперпользователя postgres, та же самая новая таблица не отражается во внешней схеме, когда я на самом деле пытаюсь войти во внешнюю базу данных, чтобы увидеть.
2. Рад помочь 🙂