Penciptaan Peranan Bersyarat dalam PostgreSQL
Keperluan untuk Penciptaan Peranan Bersyarat
> Dalam PostgreSQL 9.1, mencipta peranan yang menggunakan pernyataan CREATE ROLE yang mudah boleh gagal jika peranan itu sudah wujud. Ini boleh menjadi masalah dalam skrip automatik di mana ia adalah penting untuk mengendalikan senario sedemikian dengan anggun.
Mencapai Penciptaan Bersyarat
Untuk mengelakkan ralat dalam situasi ini, adalah perlu untuk menambah semakan bersyarat pada skrip. Malangnya, pernyataan IF tidak disokong dalam SQL biasa dalam PostgreSQL.
Menggunakan PL/pgSQL
Penyelesaian terletak pada penggunaan PL/pgSQL, yang menyediakan aliran kawalan keupayaan. Skrip berikut menunjukkan cara mencipta peranan secara bersyarat menggunakan 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$;
Salin selepas log masuk
Pengendalian Pengecualian dengan Blok Bersarang
Pendekatan alternatif untuk mengendalikan keadaan perlumbaan ialah menggunakan blok bersarang dengan pengendalian pengecualian. Dengan meletakkan penyataan CREATE ROLE dalam blok dalaman, pengecualian yang dibangkitkan oleh potensi penciptaan peranan pendua boleh ditangkap:
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$;
Salin selepas log masuk
Kaedah ini lebih cekap kerana ia hanya menimbulkan pengecualian apabila keadaan perlumbaan berlaku, meminimumkan overhed dalam kebanyakan kes.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Peranan PostgreSQL Secara Bersyarat, Mengendalikan Ralat Peranan Pendua?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!