2010-08-18 1 views
8

Я пытаюсь импортировать схему-дамп в PostgreSQL с «psql -U username -W dbname < migrations/schema.psql», схема импортируется частично , но консоль выдает такие ошибки, как «ОШИБКА: разрешение отклонено для отношения table_name» и «ERROR: отношение table_name не существует».PostgreSQL выдает ошибку: «ОШИБКА: разрешение отклонено для отношения table_name»

Я создал базу данных, как это: «CREATEDB -O имя пользователя имя_бд»

Есть только 7 таблиц для импорта, и он порывает с просто импортировать 3 из них.

Кто-нибудь подскажет, что делать?

+0

Проверьте файл дампа для любых инструкций «ALTER OWNER ...» или «SET SESSION AUTHORIZATION ...». –

ответ

3

Если резервная копия в формате «обычай» (-Fc), вы можете использовать вместо pg_restore, так что вы можете сказать ему, чтобы не применить изменения собственности:

pg_restore -U username -W --no-owner --dbname=dbname migrations/schema.psql 

Все объекты, созданные с «именем «как владелец.

Запрет на использование команды ALTER OWNER и SET SESSION AUTHORIZATION в новый файл (или через send grep output через pipe to psql). Эти команды всегда должны быть в одной строке в формате вывода текстового текста.

+0

pg_restore не может обрабатывать текстовые файлы SQL, только файлы, созданные с помощью pg_dump -Fc (что, предположительно, это не так) – alvherre

+0

Duh. Забыл об этом, я обновлю свой ответ на другую идею. –

2

Иногда эта проблема возникает из-за проблем с чувствительностью к регистру. PostgreSQL сворачивает, чтобы опустить все некотируемые идентификаторы; если таблицы создаются с цитированными именами, содержащими заглавные буквы, более поздние команды, которые не цитируют имена, могут не найти таблицу.

Ошибки разрешения могут быть связаны с одной и той же вещью, иначе это может быть что-то другое. Трудно сказать, не видя неудачных команд.

0

Поскольку я работаю на своих сайтах, я получаю эту ошибку все время, потому что я буду создавать таблицу как меня, таблицу, к которой должен обратиться пользователь Apache/PHP, который подключается позже.

Существует таблица с именем pg_class, которая определяет ваши таблицы. Это включает столбец с именем relowner. Изменение этого с правильным номером даст вам правильное право собственности.

У меня есть сведения об этой странице:

http://linux.m2osw.com/table_owner_in_postgresql

альтер ПРЕДПРИНИМАТЕЛЬ ... может быть лучшим решением, которое делает то же самое, хотя и в более ранних версиях PostgreSQL это было не существует!

+1

Я новичок в PG. Но я думал об изменении владельца. В среде, где владелец является администратором, но приложение имеет ограниченный доступ к БД, разве у нас просто нет пользователя с ограниченными разрешениями? – itsols

+0

Да. Если вы являетесь разработчиком, рекомендуется использовать хорошие разрешения (если вы этого не сделаете). Система, которую я использовал, называется Drupal, и ожидается, что она будет иметь полные права на создание, изменение , и удаление таблиц. Не лучший выбор для моей точки зрения, но это позволяет администраторам делать все непосредственно со своего сайта (например, устанавливать, обновлять, удалять модули, которые создают, изменять и удалять таблицы ...) У меня есть еще одна система, передняя часть не имеет таких разрешений.Все таблицы должны существовать, и только INSERT/UPDATE и время DELETE работают ... –

+0

@Alexis_Wilke да, в моем предложении мы * должны * использовать ограниченные разрешения для пользователя. Глядя на ваш сценарий Drupal, я нахожу это страшно, чтобы предоставить приложениям полные права. Если пользователь обнаруживает недостаток в логике программы, это может означать конец данных. Во всяком случае, это еще одна проблема ... – itsols