PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да промените собствеността на всички обекти в определена схема в PostgreSQL?

Няколко предложения тук (благодаря), вдъхновиха ме да съставя bash скрипт за промяна на на всички обекти (ТАБЛИЦИ / ПОСЛЕДОВАТЕЛИ / ИЗГЛЕДИ / ФУНКЦИИ / АГРЕГАТИ / ТИПОВЕ) собственост в определена схема наведнъж. Няма специален код, включен в скрипт, аз основно избрах предложената техника и опростих метода на изпълнение чрез скрипт. Всъщност командата REASSIGN OWNED BY върши по-голямата част от работата гладко, но променя собствеността върху обектите в цялата база данни, независимо от която и да е схема. Два случая, при които не можете да използвате ПРЕПОРАЗВАНЕ НА ПРИСТЕЖЕН ОТ:

1. Ако потребителят по погрешка създаде всичките си обекти със супер-потребител (postgres) и по-късно възнамерява да се смени с друг потребител, тогава REASSIGN OWNED BY няма да работи и просто излиза като грешка като:

postgres=# reassign owned by postgres to user1;
ERROR: cannot reassign ownership of objects owned by role postgres because they are required by the database system

2. Ако потребителят желае да промени собствеността само на един обект на схема.

Независимо от случаите на промяна на обекти, от потребител на “postgres” към друг потребител, или просто промяна на само един обект на схема, ние трябва да преминем през всеки обект, като съберем детайли за обекта от pg_catalog's &information_schema и извикаме ALTER TABLE / FUNCTION / AGGREGATE / TYPE и др.

Хареса ми техниката за настройване на изхода на pg_dump с помощта на команди на ОС (sed/egrep), защото се знае, че по природа pg_dump пише ALTER .. OWNER TO на всеки обект (ТАБЛИЦИ / ПОСЛЕДОВАНИЯ / ИЗГЛЕДИ / ФУНКЦИИ / АГРЕГАТИ / ТИПОВЕ ) в неговия изход. Извличането на тези изрази от pg_dump stdout чрез замяна на new USER/SCHEMANAME със sed и след това връщане на тези оператори към psql клиента ще поправи нещата, дори ако обектът е собственост на потребител на Postgres. Използвах същия подход в скрипта и позволих на потребителя да предаде НОВО ПОТРЕБИТЕЛСКО ИМЕ и ИМЕ НА СХЕМА, така че да го заменя в оператор ALTER...OWNER TO..

Използване и изход на скрипт:

sh change_owner.sh  -n new_rolename -S schema_name

-bash-4.1$ sh change_owner.sh -n user1 -S public

Summary:
Tables/Sequences/Views : 16
Functions : 43
Aggregates : 1
Type : 2

Можете да изтеглите скрипта от тук, а има и README, който да ви помогне при използването.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Трябва ли да посоча както INDEX, така и UNIQUE INDEX?

  2. Как да извлечете номера на седмицата от дата в PostgreSQL

  3. Laravel:Грешка [PDOException]:Не можа да се намери драйвер в PostgreSQL

  4. Връзка не съществува

  5. Най-добрият начин за избор на произволни редове PostgreSQL