Примечание. Как упоминает @trygvis в ответе ниже , эта REASSIGN OWNED
команда доступна по крайней мере начиная с версии 8.2 и является гораздо более простым методом.
Поскольку вы меняете владельца для всех таблиц, вам, вероятно, также нужны представления и последовательности. Вот что я сделал:
Таблицы:
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" YOUR_DB` ; do psql -c "alter table \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Последовательности:
for tbl in `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" YOUR_DB` ; do psql -c "alter sequence \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Взгляды:
for tbl in `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" YOUR_DB` ; do psql -c "alter view \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Вы, вероятно , можете немного высушить это, поскольку операторы alter идентичны для всех трех.
REASSIGN OWNED BY old_role [, ...] TO new_role
Вы можете использовать
REASSIGN OWNED
команду.Сводка:
Это изменяет все объекты, принадлежащие
old_role
новой роли. Вам не нужно думать о том, какие объекты у пользователя, они все будут изменены. Обратите внимание, что это относится только к объектам внутри одной базы данных. Это не меняет владельца самой базы данных.Доступно как минимум до 8.2. Их онлайн-документация только заходит так далеко.
источник
ERROR: unexpected classid 3079
, Я думаю, что в настоящее время не работает, если есть какие-либо расширения.Это: http://archives.postgresql.org/pgsql-bugs/2007-10/msg00234.php также является хорошим и быстрым решением и работает для нескольких схем в одной базе данных:
таблицы
Последовательности
Взгляды
Материализованные представления
На основании этого ответа
Это генерирует все необходимые операторы
ALTER TABLE
/ALTER SEQUENCE
/ALTER VIEW
, копирует их и вставляет их обратно в plsql для их запуска.Проверьте свою работу в psql, выполнив:
источник
Если вы хотите сделать это одним оператором sql, вам нужно определить функцию exec (), как указано в http://wiki.postgresql.org/wiki/Dynamic_DDL
Затем вы можете выполнить этот запрос, он изменит владельца таблиц, последовательностей и представлений:
$ NEWUSER - это новое имя postgresql для нового владельца.
В большинстве случаев вам нужно быть суперпользователем, чтобы выполнить это. Вы можете избежать этого, изменив владельца с вашего собственного пользователя на группу ролей, членом которой вы являетесь.
Спасибо RhodiumToad на #postgresql за помощь в этом.
источник
Мне недавно пришлось сменить владельца всех объектов в базе данных. Хотя таблицы, представления, триггеры и последовательности были несколько легко изменены, вышеупомянутый подход не удался для функций, так как подпись является частью имени функции. Конечно, у меня есть опыт работы с MySQL, и я не очень знаком с Postgres.
Тем не менее, pg_dump позволяет вывести только схему, и она содержит ALTER xxx OWNER TO yyy; заявления вам нужны. Вот мой кусочек магии на тему
источник
grep
команду. Я сам новичок в Linux, но, насколько я понимаю, кажется, чтоsed
это нормально, особенно если вы в любом случае указываете регистр без учета регистра.очень просто, попробуйте ...
источник
очень просто
сделанный.
источник
Мне нравится этот, так как он изменяет таблицы , представления , последовательности и функции- владельца определенной схемы за один раз (в одном выражении sql), не создавая функцию, и вы можете использовать ее непосредственно в PgAdmin III и psql :
(Проверено в PostgreSql v9.2)
На основании ответов, предоставленных @rkj, @AlannaRose, @SharoonThomas, @ user3560574 и этого ответа @a_horse_with_no_name
Большое спасибо.
Еще лучше: также измените владельца базы данных и схемы .
источник
information_schema.sequences
пусто, хотяSELECT c.* FROM pg_class c WHERE c.relkind = 'S';
перечисляет последовательности. Почему они могут не совпадать?ALTER
запрос бытьALTER SEQUENCE
?Мне пришлось изменить владельца таблиц, представлений и последовательностей, и я обнаружил, что отличное решение, опубликованное @rjk, работает нормально, несмотря на одну деталь: если имена объектов имеют смешанный регистр (например, «TableName»), это не удастся с « не найдена "- ошибка.
Чтобы обойти это, оберните имена объектов символом "" "следующим образом:
таблицы
Последовательности
Взгляды
источник
Вы можете попробовать следующее в PostgreSQL 9
источник
В PostgreSQL такой команды нет. Но вы можете обойти это, используя метод, который я описал некоторое время назад для GRANT.
источник
Основываясь на ответе elysch , вот решение для нескольких схем:
источник
Ответ @Alex Soto является правильным, и суть, загруженная @Yoav Aner, также работает при условии, что в именах таблиц / представлений нет специальных символов (которые допустимы в postgres).
Вам нужно избежать их на работу, и я загрузил суть для этого: https://gist.github.com/2911117
источник
Затем передайте файл резервной копии обратно в PostgreSQL, используя:
Поскольку владелец не включен, все созданные таблица, схема и т. Д. Создаются под указанным пользователем для входа.
Я читал, что это может быть хорошим подходом для миграции между версиями PostgreSQL.
источник
Я создал удобный сценарий для этого; pg_change_db_owner.sh . Этот сценарий меняет владельца для всех таблиц, представлений, последовательностей и функций в схеме базы данных, а также для владельца самой схемы.
Обратите внимание, что если вы хотите просто изменить владельца всех объектов в конкретной базе данных, принадлежащих определенной роли базы данных, тогда вы можете просто использовать команду
REASSIGN OWNED
вместо этого.источник
Начиная с PostgreSQL 9.0, у вас есть способность ,
GRANT [priv name] ON ALL [object type] IN SCHEMA
где[priv name]
является типичнымSELECT, INSERT, UPDATE, DELETE, etc
и[object type]
может быть одним из:TABLES
SEQUENCES
FUNCTIONS
Документы PostgreSQL
GRANT
иREVOKE
более подробно об этом. В некоторых ситуациях все еще требуется использовать трюки с системными каталогами (pg_catalog.pg_*
), но это не так часто. Я часто делаю следующее:BEGIN
транзакция для изменения привилегийDATABASES
на "роль DBA"SCHEMAS
на "роль DBA"REVOKE ALL
privs на всехTABLES
,SEQUENCES
иFUNCTIONS
от всех ролейGRANT SELECT, INSERT, UPDATE, DELETE
на соответствующие / соответствующие таблицы для соответствующих ролейCOMMIT
транзакция DCL.источник
Принятое решение не заботится о владении функциями. Следующее решение заботится обо всем (при рассмотрении я заметил, что оно похоже на @magiconair выше)
источник
Следующий более простой сценарий оболочки работал для меня.
Где ввод $ 1 - имя пользователя (база данных) $ 2 = существующая схема $ 3 = в новую схему.
источник
То же, что и подход @ AlexSoto для функций:
источник
Докер: Изменить владельца всех таблиц + последовательности
источник