Maison > base de données > tutoriel mysql > Comment puis-je créer un rôle PostgreSQL de manière conditionnelle, en gérant les erreurs de rôle en double ?

Comment puis-je créer un rôle PostgreSQL de manière conditionnelle, en gérant les erreurs de rôle en double ?

Susan Sarandon
Libérer: 2024-12-31 19:30:11
original
628 Les gens l'ont consulté

How Can I Create a PostgreSQL Role Conditionally, Handling Duplicate Role Errors?

Création de rôles conditionnels dans PostgreSQL

La nécessité d'une création de rôles conditionnelles

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.

Achieving Conditional Creation

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.

Utilisation de PL/pgSQL

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

Gestion des exceptions avec des blocs imbriqués

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

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!

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