Heim >Datenbank >MySQL-Tutorial >Wie erstelle ich sicher eine PostgreSQL-Rolle, wenn sie noch nicht vorhanden ist?

Wie erstelle ich sicher eine PostgreSQL-Rolle, wenn sie noch nicht vorhanden ist?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-28 19:54:11931Durchsuche

How to Safely Create a PostgreSQL Role if it Doesn't Already Exist?

So erstellen Sie eine PostgreSQL-ROLLE, wenn sie nicht existiert

In PostgreSQL 9.1 erstellen Sie eine ROLLE, die nicht existiert, mit einem einfachen Skript wie CREATE ROLE my_user LOGIN PASSWORD „my_password“ kann fehlschlagen, wenn der Benutzer bereits existiert. Um diesen Fehler zu vermeiden, ist ein ausgefeilterer Ansatz erforderlich.

Lösung mit der DO-Anweisung

Eine effektive Lösung ist die Verwendung der DO-Anweisung in einer prozeduralen Sprache wie 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$;

Dieses Skript prüft mithilfe der EXISTS-Anweisung, ob die Rolle bereits vorhanden ist. Ist dies der Fall, wird ein Hinweis ausgegeben und die Erstellung übersprungen. Andernfalls wird die Rolle erstellt.

Optimierung für stark umstrittene Workloads

Für stark umstrittene Workloads kann eine weitere Optimierung vorgenommen werden, indem die CREATE ROLE-Anweisung in einem verschachtelten Block verschachtelt 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
      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$;

Dieser verschachtelte Block stellt sicher, dass die Rolle nur erstellt wird, wenn die unwahrscheinliche Rennbedingung eintritt. Dadurch wird der Leistungsaufwand, der mit dem Auslösen und Abfangen von Ausnahmen verbunden ist, erheblich reduziert.

Das obige ist der detaillierte Inhalt vonWie erstelle ich sicher eine PostgreSQL-Rolle, wenn sie noch nicht vorhanden ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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