Dans PostgreSQL 9.1, créer un RÔLE qui n'existe pas à l'aide d'un simple script comme CREATE ROLE my_user LOGIN PASSWORD 'my_password' peut échouer si l'utilisateur existe déjà. Pour éviter cette erreur, une approche plus sophistiquée est nécessaire.
Une solution efficace consiste à utiliser l'instruction DO dans un langage procédural comme 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$;
Ce script vérifie si le rôle existe déjà à l'aide de l'instruction EXISTS. Si tel est le cas, un avis est émis et la création est ignorée. Sinon, le rôle est créé.
Pour les charges de travail très controversées, une optimisation supplémentaire peut être effectuée en imbriquant l'instruction CREATE ROLE dans un bloc imbriqué :
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 bloc imbriqué garantit que le rôle n'est créé que si la condition de concurrence improbable se produit. Cela réduit considérablement la surcharge de performances associée à la génération et à la capture d'exceptions.
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!