postgresql: bagaimana cara membuang dan mengembalikan peran untuk sebuah cluster?

27

Di mana peran disimpan dalam sebuah cluster, dan bagaimana cara membuangnya?

Saya melakukan pg_dump dari db dan kemudian memuatnya ke cluster yang berbeda, tapi saya mendapatkan banyak kesalahan ini:

psql:mydump.sql:3621: ERROR:  role "myrole" does not exist 

Jadi ternyata dump db saya tidak termasuk peran. Saya mencoba membuang 'postgres' db, tapi saya juga tidak melihat peran di sana.

Apakah saya perlu menggunakan pg_dumpall --roles-only?

Versi Postgresql 8.4.8 dan 9.1.4 OS: Ubuntu 11.04 Natty

Rob Bednark
sumber

Jawaban:

37

Dari CREATE ROLEdokumentasi :

Perhatikan bahwa peran didefinisikan di tingkat klaster basis data, dan juga berlaku di semua basis data di kluster.

Karena pg_dumpmembuang satu basis data, Anda tidak dapat mengekstrak peran dengan utilitas itu. The pg_dumpall --roles-onlyperintah Anda diusulkan akan melakukan pekerjaan - namun Anda mungkin perlu untuk menyaring output sehingga peran hanya diinginkan akan dibuat dalam cluster baru.

Peran disimpan dalam pg_authidkatalog, yang secara fisik disimpan dalam data/global/subfolder dari instalasi PostgreSQL, bersama dengan tabel cluster-wide lainnya. Anda dapat menanyakan konten pg_authidmelalui pg_rolestampilan.

CATATAN : Anda akan membutuhkan hak pengguna super untuk membuang peran. Jika tidak, Anda akan mendapatkan izin ditolak pada SELECTpada pg_authid- dan bahkan ketika superuser memberikan SELECThak, Anda akan mendapatkan kesalahan yang sama. Namun, dalam hal ini, Anda dapat membuat daftar peran dengan menanyakan pg_authidlangsung, peran COPYtersebut ke file dan memutar beberapa sihir untuk membuat yang diperlukan CREATE ROLEdan ALTER ROLEpernyataan.

dezso
sumber
Bisakah Anda menambahkan cara mengembalikan semua peran (yaitu tidak diperlukan penyaringan)?
Ethan Furman
1
untuk mengembalikan semua peran, cukup salin dan tempel output pg_dumpall --roles-onlyke dalam shell psql yang diinginkan. Atau spesifik CREATE ROLEdan ALTER ROLEgaris
Fernando Fabreti