PostgreSQL 9.1 では、次を使用してロールを作成します。ロールがすでに存在する場合、単純な CREATE ROLE ステートメントは失敗する可能性があります。このようなシナリオを適切に処理することが重要な自動スクリプトでは、これは問題となる可能性があります。
これらの状況でのエラーを回避するには、次のことが必要です。スクリプトに条件チェックを追加します。残念ながら、PostgreSQL のプレーン SQL では IF ステートメントはサポートされていません。
解決策は、制御フローを提供する 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 サイトの他の関連記事を参照してください。