Dalam PostgreSQL 9.1, mencipta PERANAN yang tidak wujud menggunakan skrip mudah seperti CREATE ROLE my_user LOGIN PASSWORD 'my_password' boleh gagal jika pengguna sudah wujud. Untuk mengelakkan ralat ini, pendekatan yang lebih canggih diperlukan.
Satu penyelesaian yang berkesan ialah menggunakan pernyataan DO dalam bahasa prosedur seperti PL/pgSQL:
DO $do$ BEGIN IF EXISTS ( SELECT FROM pg_catalog.pg_roles WHERE rolname = 'my_user') THEN RAISE NOTICE 'Role "my_user" already exists. Skipping.'; ELSE CREATE ROLE my_user LOGIN PASSWORD 'my_password'; END IF; END $do$;
Skrip ini menyemak sama ada peranan sudah wujud menggunakan pernyataan EXISTS. Jika ya, notis dinaikkan dan penciptaan dilangkau. Jika tidak, peranan itu akan dibuat.
Untuk beban kerja yang sangat menimbulkan perbalahan, pengoptimuman selanjutnya boleh dibuat dengan meletakkan penyataan CREATE ROLE dalam blok bersarang:
DO $do$ BEGIN IF EXISTS ( SELECT FROM pg_catalog.pg_roles WHERE rolname = 'my_user') THEN RAISE NOTICE 'Role "my_user" already exists. Skipping.'; ELSE BEGIN -- nested block CREATE ROLE my_user LOGIN PASSWORD 'my_password'; EXCEPTION WHEN duplicate_object THEN RAISE NOTICE 'Role "my_user" was just created by a concurrent transaction. Skipping.'; END; END IF; END $do$;
Blok bersarang ini memastikan bahawa peranan hanya dicipta jika keadaan perlumbaan yang tidak mungkin berlaku. Ini dengan ketara mengurangkan overhed prestasi yang dikaitkan dengan menaikkan dan menangkap pengecualian.
Atas ialah kandungan terperinci Bagaimana untuk Mencipta Peranan PostgreSQL dengan Selamat jika ia Belum Wujud?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!