Создайте FDW Postgres с помощью суперпользователя postgres, у которого есть доступ только для чтения к удаленной схеме

#postgresql #postgres-fdw

Вопрос:

Я пытаюсь создать FDW postgres , используя учетные данные суперпользователя, выполнив следующие действия —

  1. Мой суперпользователь-это postgres
  2. СОЗДАЙТЕ testfdw ПАРАМЕТРЫ ОБОЛОЧКИ ВНЕШНИХ ДАННЫХ СЕРВЕРА postgres_fdw (хост ‘10.10.10.171’, имя базы данных ‘testdb’, порт ‘5432’, размер выборки ‘50000’);
  3. Я создал удаленного пользователя, доступного только для чтения testdb_read_only_user testdb , и предоставил права только для чтения всем таблицам, последовательностям и функциям в нем
  4. Теперь я создаю сопоставление пользователей для своего локального суперпользователя БД postgres
  5. СОЗДАЙТЕ СОПОСТАВЛЕНИЕ ПОЛЬЗОВАТЕЛЕЙ ДЛЯ postgres testfdw ПАРАМЕТРОВ СЕРВЕРА (пользователь «testdb_read_only_user», пароль «testpasswrd»)
  6. Затем я запускаю ИМПОРТ ОБЩЕДОСТУПНОЙ ВНЕШНЕЙ СХЕМЫ С СЕРВЕРА testfdw В test_local_schema ;
  7. Теперь, когда я пытаюсь создать новую внешнюю таблицу с test_local_schema использованием postrges суперпользователя, я все еще могу ее создать, но фактическое поведение, которого я ожидаю, — ошибка отказа в разрешении, и мое сопоставление пользователей основано на пользователе, доступном только для чтения, которого я создал в удаленной БД

Я что-то здесь упускаю. Пожалуйста, ведите.

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

1. Я не понимаю ваших ожиданий. Создание внешней таблицы не записывается на внешний сервер, оно записывает описание внешней таблицы на локальный сервер.

Ответ №1:

Внешняя схема test_local_schema принадлежит postgres(суперпользователю), и PostgreSQL, рассматривающий ее как локальную схему(по назначению), дает вам возможность создать новую таблицу, Теперь, когда вы создаете новую внешнюю таблицу в test_local_schema, postgres проверит следующие ограничения

  1. Имя внешней таблицы должно отличаться от имени любой другой внешней таблицы, таблицы, последовательности, индекса, представления или материализованного представления в той же схеме.
  2. Чтобы создать внешнюю таблицу, у вас должны быть права на ИСПОЛЬЗОВАНИЕ(чтение) на внешнем сервере, а также права на использование для всех типов столбцов, используемых в таблице
  3. СОЗДАЙТЕ привилегию в целевой схеме.

Поскольку ваше сопоставление пользователей имеет пользователя только для чтения в исходной базе данных, вы должны иметь возможность извлекать данные для создания внешней таблицы в целевой базе данных, однако всякий раз, когда вы будете обновлять и вставлять новые данные, это приведет к ошибке, так как 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. Рад помочь 🙂