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 OWNEDbisa 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 WHEREklausa komentar yang mungkin ingin Anda gunakan untuk memfilter hasilnya.
Para pemain untuk regproceduremenghasilkan 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 DOpernyataan atau fungsi seperti diperlihatkan dalam jawaban terkait ini:
Di Postgres 9.5 atau yang lebih baru, Anda bisa menyederhanakan kueri menggunakan tipe pengenal objekregnamespaceregrole 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.proisaggdiganti di pg 11. Catatan rilis mengatakan: Ganti sistem tablepg_proc'sproisaggdanproiswindowdenganprokind(Peter Eisentraut) `