ホームページ > データベース > mysql チュートリアル > PostgreSQL ロールを条件付きで作成し、重複ロール エラーを処理するにはどうすればよいですか?

PostgreSQL ロールを条件付きで作成し、重複ロール エラーを処理するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-31 19:30:11
オリジナル
644 人が閲覧しました

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

PostgreSQL での条件付きロールの作成

条件付きロール作成の必要性

PostgreSQL 9.1 では、次を使用してロールを作成します。ロールがすでに存在する場合、単純な CREATE ROLE ステートメントは失敗する可能性があります。このようなシナリオを適切に処理することが重要な自動スクリプトでは、これは問題となる可能性があります。

条件作成の達成

これらの状況でのエラーを回避するには、次のことが必要です。スクリプトに条件チェックを追加します。残念ながら、PostgreSQL のプレーン SQL では IF ステートメントはサポートされていません。

PL/pgSQL の使用

解決策は、制御フローを提供する PL/pgSQL を使用することです。能力。次のスクリプトは、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$;
ログイン後にコピー

ネストされたブロックによる例外処理

競合状態を処理する別のアプローチそれは、例外処理でネストされたブロックを使用することです。 CREATE ROLE ステートメントを内部ブロック内にネストすることにより、重複する可能性のあるロールの作成によって発生した例外をキャッチできます。

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$;
ログイン後にコピー

このメソッドは、競合状態が発生した場合にのみ例外を発生させ、オーバーヘッドを最小限に抑えるため、より効率的です。ほとんどの場合。

以上がPostgreSQL ロールを条件付きで作成し、重複ロール エラーを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート