Heim > Datenbank > MySQL-Tutorial > Wie kann ich eine PostgreSQL-Rolle bedingt erstellen und dabei Fehler durch doppelte Rollen behandeln?

Wie kann ich eine PostgreSQL-Rolle bedingt erstellen und dabei Fehler durch doppelte Rollen behandeln?

Susan Sarandon
Freigeben: 2024-12-31 19:30:11
Original
625 Leute haben es durchsucht

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

Bedingte Rollenerstellung in PostgreSQL

Die Notwendigkeit der bedingten Rollenerstellung

In PostgreSQL 9.1 kann das Erstellen einer Rolle mit einer einfachen CREATE ROLE-Anweisung fehlschlagen wenn die Rolle bereits existiert. Dies kann in automatisierten Skripten problematisch sein, in denen es entscheidend ist, solche Szenarien ordnungsgemäß zu handhaben.

Bedingungserstellung erreichen

Um Fehler in diesen Situationen zu vermeiden, ist dies erforderlich um dem Skript eine bedingte Prüfung hinzuzufügen. Leider werden IF-Anweisungen in einfachem SQL in PostgreSQL nicht unterstützt.

Verwendung von PL/pgSQL

Die Lösung liegt in der Verwendung von PL/pgSQL, das den Kontrollfluss bereitstellt Fähigkeiten. Das folgende Skript zeigt, wie eine Rolle bedingt mit PL/pgSQL erstellt wird:

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$;
Nach dem Login kopieren

Ausnahmebehandlung mit verschachtelten Blöcken

Ein alternativer Ansatz zur Behandlung von Rennbedingungen besteht darin, verschachtelte Blöcke mit Ausnahmebehandlung zu verwenden. Durch die Verschachtelung der CREATE ROLE-Anweisung in einem inneren Block können Ausnahmen abgefangen werden, die durch potenzielle doppelte Rollenerstellung ausgelöst werden:

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$;
Nach dem Login kopieren

Diese Methode ist effizienter, da sie nur dann eine Ausnahme auslöst, wenn die Race-Bedingung auftritt, wodurch der Overhead minimiert wird in den meisten Fällen.

Das obige ist der detaillierte Inhalt vonWie kann ich eine PostgreSQL-Rolle bedingt erstellen und dabei Fehler durch doppelte Rollen behandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage