Powinieneś zawsze manipulować katalogami systemowymi tylko bezpośrednio, jeśli dokładnie wiesz, co robisz. Może mieć nieoczekiwane skutki uboczne. Lub możesz uszkodzić bazę danych (lub cały klaster bazy danych) nie do naprawienia.
Odpowiedź Jeremy'ego , choć w zasadzie robi to samo, nie jest wskazana dla ogółu społeczeństwa. Bezwarunkowo zmienia wszystkie funkcje w schemacie. Czy na pewno nie ma to wpływu na funkcje systemu lub funkcje zainstalowane przez dodatkowy moduł?
Nie ma również sensu zmieniać właściciela funkcji, które już należą do wyznaczonego właściciela.
Najpierw sprawdź, czy REASSIGN OWNED
może Ci pomóc:
zmienić własność obiektów bazy danych należących do roli bazy danych
Musisz jawnie wymienić wszystkie role, które mają zostać odrzucone. Ale również przypisuje funkcje .
Aby przypisać wszystkie funkcje (i żadnych innych obiektów) w danym schemacie do nowego właściciela (opcjonalnie niezależnie od poprzedniego właściciela):
SELECT string_agg('ALTER FUNCTION ' || oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'public';
-- AND p.relowner <> (SELECT oid FROM pg_roles WHERE rolname = 'foo')
-- AND p.proname ~~ 'f_%'
Generuje to kanoniczne polecenia SQLALTER FUNCTION ...
do zmiany wszystkich funkcji (w określonym schemacie). Możesz sprawdzić polecenia przed ich wykonaniem - pojedynczo lub wszystkie na raz:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
Zawarłem kilka skomentowanych WHERE
klauzul, których możesz użyć do filtrowania wyników.
Rzutowanie na regprocedure
tworzy prawidłową nazwę funkcji z parametrami, w razie potrzeby podwójnie cudzysłów, schemat - kwalifikowany w razie potrzeby dla prądu search_path
.
Funkcja agregująca string_agg () wymaga PostgreSQL 9.0 lub nowszego. W starszej wersji zamień na array_agg()
i array_to_string()
.
Ty mógł postawić wszystko na DO
rachunku lub funkcji jak wykazano w tym związanej z odpowiedzią:
W Postgresie 9.5 lub nowszym możesz uprościć zapytanie, używając nowych typów identyfikatorów obiektów regnamespace
iregrole
:
SELECT string_agg('ALTER FUNCTION '|| oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc
WHERE pronamespace = 'public'::regnamespace;
-- AND relowner <> 'foo'::regrole
-- AND proname ~~ 'f_%'
pg_proc.proisagg
otrzymuje w pg 11. Uwagi do wydania powiedzieć: Wymień tabeli systemowejpg_proc
„sproisagg
orazproiswindow
zprokind
(Peter Eisentraut)`To powinno działać dla funkcji:
źródło
Możesz użyć polecenia REASSIGN OWNED
Wystarczy zalogować się do bazy danych przy użyciu administratora i wykonać poniżej
REASSIGN OWNED BY [old_user] TO [new_user];
Spowoduje to zmianę wszystkich obiektów, tj. Tabel, sekwencji, funkcji itp. Należących do old_role na nową rolę. Nie musisz myśleć o tym, jakie obiekty ma użytkownik, wszystkie zostaną zmienione. To zmienia obiekty tylko wtedy, gdy chcesz zmienić własność samej bazy danych
ALTER DATABASE name OWNER TO new_owner
Jest to najlepsza metoda, ponieważ nie będzie n liczby tabel, sekwencja raczej będzie polegała na zapętlaniu i skryptach bash
źródło
Cóż, nie znalazłem procesu jednoetapowego, ale to zajmuje się wszystkimi obiektami, które widzę w mojej bazie danych:
źródło