Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Mencipta Peranan PostgreSQL Secara Bersyarat, Mengendalikan Ralat Peranan Pendua?

Bagaimanakah Saya Boleh Mencipta Peranan PostgreSQL Secara Bersyarat, Mengendalikan Ralat Peranan Pendua?

Susan Sarandon
Lepaskan: 2024-12-31 19:30:11
asal
628 orang telah melayarinya

How Can I Create a PostgreSQL Role Conditionally, Handling Duplicate Role Errors?

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan