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