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.
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.
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!