sql >> Databáze >  >> RDS >> PostgreSQL

Jak změnit vlastnictví všech objektů v konkrétním schématu v PostgreSQL?

Je zde několik návrhů (díky), inspirovalo mě k sestavení bash skriptu pro změnu všech objektů (TABULKY / SEKVENCE / ZOBRAZENÍ / FUNKCE / AGREGÁTY / TYPY) vlastnictví v konkrétním schématu najednou. Ve skriptu není zahrnut žádný speciální kód, v podstatě jsem si vybral navrhovanou techniku ​​a zjednodušil metodu implementace pomocí skriptu. Ve skutečnosti příkaz REASSIGN OWNED BY provádí většinu práce hladce, ale mění vlastnictví objektů v celé databázi bez ohledu na jakékoli schéma. Dvě možnosti, kdy nemůžete použít REASSIGN OWNED BY:

1. Pokud uživatel omylem vytvoří všechny své objekty se super-uživatelem (postgres) a později zamýšlí změnit na jiného uživatele, pak REASSIGN OWNED BY nebude fungovat a dojde pouze k chybě jako:

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. Pokud si uživatel přeje změnit vlastnictví pouze jednoho objektu schématu.

Ať už jde o změnu objektů, z uživatele „postgres“ na jiného uživatele, nebo jen o změnu pouze jednoho objektu schématu, musíme procházet každý objekt shromažďováním podrobností o objektu z pg_catalog's &information_schema a voláním ALTER TABLE / FUNCTION / AGGREGATE / TYPE atd.

Líbila se mi technika ladění výstupu pg_dump pomocí příkazů OS (sed/egrep), protože bylo známo, že pg_dump přirozeně zapisuje ALTER .. OWNER TO každého objektu (TABULKY / SEKVENCE / ZOBRAZENÍ / FUNKCE / AGREGÁTY / TYPY ) ve svém výstupu. Greping těchto příkazů z pg_dump stdout nahrazením nového USER/SCHEMANAME sed a následným předáním těchto příkazů zpět klientovi psql věci napraví, i když objekt vlastní uživatel Postgres. Použil jsem stejný přístup ve skriptu a umožnil jsem uživateli předat NOVÉ UŽIVATELSKÉ JMÉNO a NÁZEV SCHÉMATU, takže je nahradit v příkazu ALTER…OWNER TO..

Použití a výstup skriptu:

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

Zde si můžete stáhnout skript a je zde také README, který vám pomůže s používáním.


  1. Funkce TRIM() v Oracle

  2. MariaDB CURRENT_USER() Vysvětleno

  3. Jak vytvořit DMZ pro EBS R12

  4. Jak zabudovat funkcionalitu RUNAS /NETONLY do programu (C#/.NET/WinForms)?