Problème :
La création d'un rôle PostgreSQL à l'aide de l'instruction CREATE ROLE génère une erreur si le rôle existe déjà. Comment créer un rôle uniquement s'il n'existe pas ?
Solution :
Utilisez l'instruction DO avec un bloc de code PL/pgSQL pour effectuer la création du rôle conditionnellement :
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$;
Optimisation :
Pour éviter les conditions de course potentielles et surcharge de performances, envisagez d'utiliser un bloc imbriqué dans le mécanisme de gestion des exceptions :
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$;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!