Anda hanya boleh memanipulasi katalog sistem secara langsung, jika Anda tahu persis apa yang Anda lakukan. Ini mungkin memiliki efek samping yang tidak terduga. Atau Anda dapat merusak database (atau seluruh kluster basis data) yang tidak dapat diperbaiki.
Jawaban Jeremy , sementara pada dasarnya melakukan trik, tidak disarankan untuk masyarakat umum. Itu tanpa syarat mengubah semua fungsi dalam skema. Apakah Anda yakin tidak ada fungsi sistem yang terpengaruh atau fungsi yang dipasang oleh modul tambahan?
Juga tidak ada gunanya mengubah pemilik fungsi yang sudah menjadi milik pemilik yang ditunjuk.
Pertama, periksa apakah REASSIGN OWNED
bisa bekerja untuk Anda:
mengubah kepemilikan objek database yang dimiliki oleh peran basis data
Anda harus mencantumkan semua peran yang akan dihapus secara eksplisit. Tetapi juga menugaskan kembali fungsi .
Untuk menetapkan semua fungsi (dan tidak ada objek lain) dalam skema yang diberikan kepada pemilik baru (opsional terlepas dari pemilik sebelumnya):
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_%'
Ini menghasilkan perintah SQL kanonikALTER FUNCTION ...
untuk mengubah semua fungsi (dalam skema yang ditentukan). Anda dapat memeriksa perintah sebelum menjalankannya - satu per satu atau sekaligus:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
Saya menyertakan beberapa WHERE
klausa komentar yang mungkin ingin Anda gunakan untuk memfilter hasilnya.
Para pemain untuk regprocedure
menghasilkan nama fungsi yang valid dengan parameter, dikutip ganda jika diperlukan, skema - terkualifikasi jika perlu untuk saat ini search_path
.
Fungsi agregat string_agg () membutuhkan PostgreSQL 9.0 atau yang lebih baru. Dalam versi yang lebih lama, gantikan dengan array_agg()
dan array_to_string()
.
Anda bisa memasukkan semua ini ke dalam DO
pernyataan atau fungsi seperti diperlihatkan dalam jawaban terkait ini:
Di Postgres 9.5 atau yang lebih baru, Anda bisa menyederhanakan kueri menggunakan tipe pengenal objekregnamespace
regrole
baru dan :
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
diganti di pg 11. Catatan rilis mengatakan: Ganti sistem tablepg_proc
'sproisagg
danproiswindow
denganprokind
(Peter Eisentraut) `