Catatan: Seperti @trygvis menyebutkan jawaban di bawah ini , REASSIGN OWNED
perintah ini tersedia setidaknya sejak versi 8.2, dan merupakan metode yang jauh lebih mudah.
Karena Anda mengubah kepemilikan untuk semua tabel, kemungkinan Anda juga menginginkan tampilan dan urutan. Inilah yang saya lakukan:
Tabel:
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
Urutan:
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
Dilihat:
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
Anda mungkin bisa KERING sedikit karena statemen identik untuk ketiganya.
REASSIGN OWNED BY old_role [, ...] TO new_role
Anda bisa menggunakan
REASSIGN OWNED
perintah.Ringkasan:
Ini mengubah semua objek yang dimiliki oleh
old_role
peran baru. Anda tidak perlu memikirkan objek seperti apa yang dimiliki pengguna, semuanya akan diubah. Perhatikan bahwa itu hanya berlaku untuk objek di dalam satu basis data. Itu tidak mengubah pemilik database itu sendiri.Ini tersedia kembali setidaknya 8.2. Dokumentasi online mereka hanya sejauh itu.
sumber
ERROR: unexpected classid 3079
. Saya kira itu saat ini tidak berfungsi jika ada ekstensi.Ini: http://archives.postgresql.org/pgsql-bugs/2007-10/msg00234.php juga merupakan solusi yang bagus dan cepat, dan berfungsi untuk banyak skema dalam satu basis data:
Tabel
Urutan
Tampilan
Pandangan Terwujud
Berdasarkan jawaban ini
Ini menghasilkan semua
ALTER TABLE
/ALTER SEQUENCE
/ALTER VIEW
pernyataan yang diperlukan , salin dan tempel kembali ke plsql untuk menjalankannya.Periksa pekerjaan Anda dalam psql dengan melakukan:
sumber
Jika Anda ingin melakukannya dalam satu pernyataan sql, Anda perlu mendefinisikan fungsi exec () sebagaimana disebutkan dalam http://wiki.postgresql.org/wiki/Dynamic_DDL
Kemudian Anda dapat menjalankan kueri ini, itu akan mengubah pemilik tabel, urutan, dan tampilan:
$ NEWUSER adalah nama baru postgresql dari pemilik baru.
Dalam sebagian besar keadaan, Anda harus menjadi pengguna super untuk menjalankan ini. Anda dapat menghindari itu dengan mengubah pemilik dari pengguna Anda sendiri ke grup peran yang menjadi anggota Anda.
Terima kasih kepada RhodiumToad di #postgresql untuk membantu ini.
sumber
Baru-baru ini saya harus mengubah kepemilikan semua objek dalam database. Meskipun tabel, tampilan, pemicu, dan urutan agak mudah diubah, pendekatan di atas gagal untuk fungsi karena tanda tangan adalah bagian dari nama fungsi. Memang, saya memiliki latar belakang MySQL dan saya tidak begitu mengenal Postgres.
Namun, pg_dump memungkinkan Anda untuk membuang skema saja dan ini berisi ALTER xxx OWNER TO yyy; pernyataan yang Anda butuhkan. Inilah sedikit sihir shell saya pada topik tersebut
sumber
grep
perintah. Saya sendiri baru mengenal Linux, tetapi dari pemahaman saya, sepertinya itused
baik-baik saja untuk digunakan, terutama karena Anda menentukan pertandingan yang case-insensitive.sangat sederhana, cobalah ...
sumber
sangat sederhana
selesai
sumber
Saya suka yang ini karena memodifikasi tabel , tampilan , urutan dan fungsi pemilik skema tertentu dalam sekali jalan (dalam satu pernyataan sql), tanpa membuat fungsi dan Anda dapat menggunakannya langsung di PgAdmin III dan psql :
(Diuji dalam PostgreSql v9.2)
Berdasarkan jawaban yang diberikan oleh @rkj, @AlannaRose, @SharoonThomas, @ user3560574 dan jawaban ini oleh @a_horse_with_no_name
Terima kasih banyak.
Lebih baik lagi: Juga ganti pemilik basis data dan skema .
sumber
information_schema.sequences
kosong meskipunSELECT c.* FROM pg_class c WHERE c.relkind = 'S';
daftar urutan. Mengapa mereka tidak cocok?ALTER
permintaan kedua adalahALTER SEQUENCE
?Saya harus mengubah kepemilikan tabel, tampilan, dan urutan dan menemukan solusi hebat yang diposting oleh @rjk berfungsi dengan baik - meskipun ada satu detail: Jika nama objek dari case campuran (mis. "TableName"), ini akan gagal dengan " tidak ditemukan "- teror.
Untuk menghindari ini, bungkus nama objek dengan '"' seperti ini:
Tabel
Urutan
Tampilan
sumber
Anda dapat mencoba yang berikut ini di PostgreSQL 9
sumber
Tidak ada perintah seperti itu di PostgreSQL. Tetapi Anda dapat mengatasinya menggunakan metode yang saya jelaskan beberapa waktu lalu untuk GRANT.
sumber
Berdasarkan jawaban oleh elysch , berikut adalah solusi untuk beberapa skema:
sumber
Jawaban oleh @Alex Soto adalah jawaban yang benar dan inti yang diunggah oleh @Yoav Aner juga berfungsi asalkan tidak ada karakter khusus dalam tabel / nama tampilan (yang legal di postgres).
Anda perlu melarikan diri dari mereka untuk bekerja dan saya telah mengunggah inti untuk itu: https://gist.github.com/2911117
sumber
Kemudian pipa kembali file cadangan ke PostgreSQL menggunakan:
Karena tidak ada pemilik yang dimasukkan maka semua tabel, skema, dll, dibuat di bawah pengguna login yang Anda tentukan.
Saya telah membaca ini bisa menjadi pendekatan yang baik untuk migrasi antara versi PostgreSQL juga.
sumber
Saya telah membuat skrip yang mudah untuk itu; pg_change_db_owner.sh . Skrip ini mengubah kepemilikan untuk semua tabel, tampilan, urutan, dan fungsi dalam skema basis data dan juga pemilik skema itu sendiri.
Harap dicatat bahwa jika Anda hanya ingin mengubah kepemilikan semua objek, dalam database tertentu, yang dimiliki oleh peran database tertentu, maka Anda dapat menggunakan perintah
REASSIGN OWNED
saja.sumber
Mulai dari PostgreSQL 9.0, Anda memiliki kemampuan ke
GRANT [priv name] ON ALL [object type] IN SCHEMA
mana[priv name]
tipikalSELECT, INSERT, UPDATE, DELETE, etc
dan[object type]
dapat menjadi salah satu dari:TABLES
SEQUENCES
FUNCTIONS
Dokumentasi PostgreSQL
GRANT
danREVOKE
masuk ke detail lebih lanjut tentang ini. Dalam beberapa situasi masih diperlukan untuk menggunakan trik yang melibatkan katalog sistem (pg_catalog.pg_*
) tetapi itu tidak seperti biasa. Saya sering melakukan hal berikut:BEGIN
transaksi untuk memodifikasi privsDATABASES
menjadi "peran DBA"SCHEMAS
menjadi "peran DBA"REVOKE ALL
privs pada semuaTABLES
,SEQUENCES
danFUNCTIONS
dari semua peranGRANT SELECT, INSERT, UPDATE, DELETE
pada tabel yang relevan / sesuai untuk peran yang sesuaiCOMMIT
transaksi DCL.sumber
Solusi yang diterima tidak mengurus kepemilikan fungsi mengikuti solusi mengurus semuanya (saat meninjau saya perhatikan bahwa ini mirip dengan @magiconair di atas)
sumber
Script shell sederhana berikut ini bekerja untuk saya.
Di mana input $ 1 - nama pengguna (basis data) $ 2 = skema yang ada $ 3 = untuk skema baru.
sumber
Sama seperti pendekatan @ AlexSoto untuk fungsi:
sumber
Docker: Ubah Pemilik semua Tabel + Urutan
sumber