Dans PostgreSQL 9.1, création d'un rôle à l'aide d'un simple CREATE L'instruction ROLE peut échouer si le rôle existe déjà. Cela peut être problématique dans les scripts automatisés où il est crucial de gérer de tels scénarios avec élégance.
Pour éviter les erreurs dans ces situations, il est nécessaire pour ajouter une vérification conditionnelle au script. Malheureusement, les instructions IF ne sont pas prises en charge en SQL brut dans PostgreSQL.
La solution réside dans l'utilisation de PL/pgSQL, qui fournit un flux de contrôle. capacités. Le script suivant montre comment créer un rôle de manière conditionnelle à l'aide de 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$;
Une approche alternative pour gérer les conditions de concurrence consiste à utiliser des blocs imbriqués avec gestion des exceptions. En imbriquant l'instruction CREATE ROLE dans un bloc interne, les exceptions déclenchées par des créations de rôles en double potentielles peuvent être interceptées :
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$;
Cette méthode est plus efficace car elle ne déclenche une exception que lorsque la condition de concurrence critique se produit, minimisant ainsi la surcharge. dans la plupart des cas.
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!