Problem:
Das Erstellen einer PostgreSQL-Rolle mit der CREATE ROLE-Anweisung löst einen Fehler aus, wenn die Rolle bereits vorhanden ist. Wie erstellt man eine Rolle nur, wenn sie nicht existiert?
Lösung:
Verwenden Sie die DO-Anweisung mit einem PL/pgSQL-Codeblock, um die Rollenerstellung durchzuführen bedingt:
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$;
Optimierung:
Um Potenzial zu vermeiden Aufgrund von Rennbedingungen und Leistungsaufwand sollten Sie die Verwendung eines verschachtelten Blocks innerhalb des Ausnahmebehandlungsmechanismus in Betracht ziehen:
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$;
Das obige ist der detaillierte Inhalt vonWie erstelle ich eine PostgreSQL-Rolle nur, wenn sie noch nicht vorhanden ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!