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
929 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!

source:php.cn
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