Uwaga: Jak wspomina @trygvis w odpowiedzi poniżej , REASSIGN OWNED
polecenie jest dostępne od wersji co najmniej 8.2 i jest znacznie łatwiejszą metodą.
Ponieważ zmieniasz własność wszystkich tabel, prawdopodobnie chcesz też widoków i sekwencji. Oto co zrobiłem:
Stoły:
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
Sekwencje:
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
Wyświetlenia:
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
Prawdopodobnie możesz to trochę przesuszyć , ponieważ instrukcje alter są identyczne dla wszystkich trzech.
REASSIGN OWNED BY old_role [, ...] TO new_role
Możesz użyć
REASSIGN OWNED
polecenia.Streszczenie:
Spowoduje to zmianę wszystkich obiektów należących
old_role
do nowej roli. Nie musisz myśleć o tym, jakie obiekty ma użytkownik, wszystkie zostaną zmienione. Pamiętaj, że dotyczy to tylko obiektów w jednej bazie danych. Nie zmienia to również właściciela samej bazy danych.Jest dostępny w wersji co najmniej 8.2. Ich dokumentacja online sięga tak daleko wstecz.
źródło
ERROR: unexpected classid 3079
. Myślę, że obecnie nie działa, jeśli są jakieś rozszerzenia.To: http://archives.postgresql.org/pgsql-bugs/2007-10/msg00234.php jest również dobrym i szybkim rozwiązaniem, które działa na wielu schematach w jednej bazie danych:
Stoły
Sekwencje
Wyświetlenia
Widoki zmaterializowane
Na podstawie tej odpowiedzi
Generuje to wszystkie wymagane instrukcje
ALTER TABLE
/ALTER SEQUENCE
/ALTER VIEW
, kopiuje je i wkleja z powrotem do plsql, aby je uruchomić.Sprawdź swoją pracę w psql, wykonując:
źródło
Jeśli chcesz to zrobić w jednej instrukcji SQL, musisz zdefiniować funkcję exec (), jak wspomniano w http://wiki.postgresql.org/wiki/Dynamic_DDL
Następnie możesz wykonać to zapytanie, zmieni ono właściciela tabel, sekwencji i widoków:
$ NEWUSER to nowa nazwa nowego właściciela postgresql.
W większości przypadków musisz być superużytkownikiem, aby to wykonać. Można tego uniknąć, zmieniając właściciela z własnego użytkownika na grupę ról, do której należysz.
Dzięki RhodiumToad na #postgresql za pomoc w tym.
źródło
Niedawno musiałem zmienić własność wszystkich obiektów w bazie danych. Chociaż tabele, widoki, wyzwalacze i sekwencje zostały nieco zmienione, powyższe podejście nie powiodło się dla funkcji, ponieważ podpis jest częścią nazwy funkcji. To prawda, że mam doświadczenie w MySQL i nie znam się na Postgresie.
Jednak pg_dump pozwala na zrzucenie tylko schematu, a zawiera on ALTER xxx WŁAŚCICIEL DO rrr; oświadczenia, których potrzebujesz. Oto moja odrobina magii powłoki na ten temat
źródło
grep
polecenia. Sam jestem nowy w Linuksie, ale z mojego rozumienia wydaje się, żesed
jest w porządku, zwłaszcza, że i tak określasz dopasowanie bez rozróżniania wielkości liter.bardzo proste, spróbuj ...
źródło
jest bardzo proste
gotowy.
źródło
Podoba mi się ten, ponieważ modyfikuje on tabele , widoki , sekwencje i funkcje właściciela określonego schematu za jednym razem (w jednej instrukcji SQL), bez tworzenia funkcji i można go używać bezpośrednio w PgAdmin III i psql :
(Testowane w PostgreSql v9.2)
Na podstawie odpowiedzi udzielonych przez @rkj, @AlannaRose, @SharoonThomas, @ user3560574 i tę odpowiedź przez @a_horse_with_no_name
Wielkie dzięki.
Jeszcze lepiej: zmień także właściciela bazy danych i schematu .
źródło
information_schema.sequences
jest pusty, mimo żeSELECT c.* FROM pg_class c WHERE c.relkind = 'S';
wyświetla sekwencje. Dlaczego mogą się nie zgadzać?ALTER
pytanie nie powinno byćALTER SEQUENCE
?Musiałem zmienić własność tabel, widoków i sekwencji i stwierdziłem, że świetne rozwiązanie opublikowane przez @rjk działa dobrze - pomimo jednego szczegółu: jeśli nazwy obiektów mają różne litery (np. „TableName”), to nie powiedzie się z „ nie znaleziono błędu.
Aby to obejść, zawiń nazwy obiektów następującymi znakami „”:
Stoły
Sekwencje
Wyświetlenia
źródło
Możesz spróbować wykonać następujące czynności w PostgreSQL 9
źródło
W PostgreSQL nie ma takiego polecenia. Ale możesz obejść to przy użyciu metody, którą opisałem jakiś czas temu dla GRANT.
źródło
Na podstawie odpowiedzi elysch , oto rozwiązanie dla wielu schematów:
źródło
Odpowiedź @Alex Soto jest prawidłowa, a treść przesłana przez @Yoav Aner również działa, pod warunkiem, że nie ma żadnych znaków specjalnych w nazwach tabel / widoków (które są legalne w postgresie).
Musisz uciec od nich, aby pracować, a ja przesłałem do tego listę: https://gist.github.com/2911117
źródło
Następnie przenieś plik kopii zapasowej z powrotem do PostgreSQL, używając:
Ponieważ nie ma w nim właściciela, wszystkie utworzone tabele, schematy itp. Są tworzone w ramach określonego użytkownika logowania.
Przeczytałem, że może to być również dobre podejście do migracji między wersjami PostgreSQL.
źródło
Stworzyłem do tego wygodny skrypt; pg_change_db_owner.sh . Ten skrypt zmienia własność wszystkich tabel, widoków, sekwencji i funkcji w schemacie bazy danych, a także właściciela samego schematu.
Pamiętaj, że jeśli chcesz tylko zmienić własność wszystkich obiektów w określonej bazie danych, należących do określonej roli bazy danych, możesz po prostu użyć polecenia
REASSIGN OWNED
zamiast tego.źródło
Począwszy od PostgreSQL 9.0, możesz określić,
GRANT [priv name] ON ALL [object type] IN SCHEMA
gdzie[priv name]
jest typowySELECT, INSERT, UPDATE, DELETE, etc
i[object type]
może być jednym z:TABLES
SEQUENCES
FUNCTIONS
Dokumenty PostgreSQL
GRANT
iREVOKE
przejdź do bardziej szczegółowych informacji na ten temat. W niektórych sytuacjach nadal wymagane jest stosowanie sztuczek obejmujących katalogi systemowe (pg_catalog.pg_*
), ale nie jest to tak powszechne. Często wykonuję następujące czynności:BEGIN
transakcja modyfikacji prywatnyDATABASES
na „rolę DBA”SCHEMAS
na „rolę DBA”REVOKE ALL
privs na wszystkoTABLES
,SEQUENCES
aFUNCTIONS
ze wszystkich rólGRANT SELECT, INSERT, UPDATE, DELETE
na odpowiednich / odpowiednich tabelach do odpowiednich rólCOMMIT
transakcja DCL.źródło
Zaakceptowane rozwiązanie nie dba o własność funkcji po rozwiązaniu dba o wszystko (podczas przeglądu zauważyłem, że jest podobny do @magiconair powyżej)
źródło
Poniższy prostszy skrypt powłoki zadziałał dla mnie.
Gdzie wpisz 1 $ - nazwa użytkownika (baza danych) 2 $ = istniejący schemat 3 USD = nowy schemat.
źródło
To samo, co podejście @ AlexSoto do funkcji:
źródło
Docker: modyfikuj właściciela wszystkich tabel i sekwencji
źródło