Heim > Datenbank > MySQL-Tutorial > Wie kann ich PostgreSQL-Rollen bedingt erstellen, um Fehler zu vermeiden?

Wie kann ich PostgreSQL-Rollen bedingt erstellen, um Fehler zu vermeiden?

DDD
Freigeben: 2024-12-17 19:37:10
Original
520 Leute haben es durchsucht

How Can I Create PostgreSQL Roles Conditionally to Avoid Errors?

Erstellen von PostgreSQL-Rollen mit bedingter Ausführung

Problemeinführung

In PostgreSQL 9.1 schlägt das Erstellen einer Rolle mit CREATE ROLE fehl, wenn die Rolle bereits vorhanden ist. Diese Einschränkung stellt eine Herausforderung bei der Skripterstellung für die Datenbankerstellung und Rollenverwaltung dar. Eine gewünschte Lösung besteht darin, die CREATE ROLE-Anweisung nur dann bedingt auszuführen, wenn die Rolle nicht existiert.

Bedingte Skriptentwicklung

Ein Ansatz besteht darin, den DO-Block von PL/pgSQL und die IF EXISTS-Bedingung zu verwenden :

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

Dieses Skript prüft dynamisch mithilfe von SELECT die Existenz der Rolle und führt CREATE ROLE nur aus, wenn dies der Fall ist Rolle existiert nicht.

Kein Race-Condition-Szenario

Diese Lösung führt keine Race-Bedingung ein. Die IF EXISTS-Bedingung stellt sicher, dass die Rolle nur dann erstellt wird, wenn sie zum Zeitpunkt der Prüfung noch nicht existiert. Jede gleichzeitige Transaktion, bei der die Rolle zwischen der Prüfung und der Erstellung erstellt wird, verursacht kein Problem, da die Rolle zum Zeitpunkt der CREATE ROLE-Ausführung bereits vorhanden ist.

Optimiertes Skript (keine Ausnahmebehandlung)

Um das Skript weiter zu optimieren, kann ein verschachtelter Block verwendet werden, um die Kosten eines Ausnahmehandlers zu vermeiden:

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

Dieses Skript führt die Prüfung effizient durch und verarbeitet alle potenzielle Rennbedingung mit minimalem Overhead. Der verschachtelte Block stellt sicher, dass die Rolle nur dann erstellt wird, wenn sie nicht existiert oder wenn sie gerade durch eine gleichzeitige Transaktion erstellt wurde. In diesem Fall wird eine Benachrichtigung ausgegeben.

Das obige ist der detaillierte Inhalt vonWie kann ich PostgreSQL-Rollen bedingt erstellen, um Fehler zu vermeiden?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage