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) `Ini harus berfungsi untuk fungsi:
sumber
Anda dapat menggunakan perintah REASSIGN OWNED
Cukup masuk ke database dengan superuser dan jalankan di bawah ini
REASSIGN OWNED BY [old_user] TO [new_user];
Ini mengubah semua objek yaitu tabel, urutan, fungsi dll yang dimiliki oleh old_role ke peran baru. Anda tidak perlu memikirkan objek seperti apa yang dimiliki pengguna, semuanya akan diubah. Ini mengubah objek hanya jika Anda ingin mengubah kepemilikan dari database itu sendiri hanya menggunakan
ALTER DATABASE name OWNER TO new_owner
Ini adalah metode terbaik karena akan ada n jumlah tabel, urutan agak terjadi untuk loop dan skrip bash
sumber
Yah, saya tidak menemukan proses satu langkah, tapi ini menangani semua objek yang bisa saya lihat di database saya:
sumber