In PostgreSQL 9.1 kann das Erstellen einer Rolle mit einer einfachen CREATE ROLE-Anweisung fehlschlagen wenn die Rolle bereits existiert. Dies kann in automatisierten Skripten problematisch sein, in denen es entscheidend ist, solche Szenarien ordnungsgemäß zu handhaben.
Um Fehler in diesen Situationen zu vermeiden, ist dies erforderlich um dem Skript eine bedingte Prüfung hinzuzufügen. Leider werden IF-Anweisungen in einfachem SQL in PostgreSQL nicht unterstützt.
Die Lösung liegt in der Verwendung von PL/pgSQL, das den Kontrollfluss bereitstellt Fähigkeiten. Das folgende Skript zeigt, wie eine Rolle bedingt mit PL/pgSQL erstellt 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 CREATE ROLE my_user LOGIN PASSWORD 'my_password'; END IF; END $do$;
Ein alternativer Ansatz zur Behandlung von Rennbedingungen besteht darin, verschachtelte Blöcke mit Ausnahmebehandlung zu verwenden. Durch die Verschachtelung der CREATE ROLE-Anweisung in einem inneren Block können Ausnahmen abgefangen werden, die durch potenzielle doppelte Rollenerstellung ausgelöst werden:
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$;
Diese Methode ist effizienter, da sie nur dann eine Ausnahme auslöst, wenn die Race-Bedingung auftritt, wodurch der Overhead minimiert wird in den meisten Fällen.
Das obige ist der detaillierte Inhalt vonWie kann ich eine PostgreSQL-Rolle bedingt erstellen und dabei Fehler durch doppelte Rollen behandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!