Maison > base de données > tutoriel mysql > Comment créer en toute sécurité un rôle PostgreSQL s'il n'existe pas déjà ?

Comment créer en toute sécurité un rôle PostgreSQL s'il n'existe pas déjà ?

Patricia Arquette
Libérer: 2024-12-28 19:54:11
original
997 Les gens l'ont consulté

How to Safely Create a PostgreSQL Role if it Doesn't Already Exist?

Comment créer un RÔLE PostgreSQL s'il n'existe pas

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.

Solution utilisant l'instruction DO

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$;
Copier après la connexion

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éé.

Optimisation pour les charges de travail à forte contention

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$;
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal