問題:
CREATE ROLE ステートメントを使用した PostgreSQL ロールの作成ロールがすでに存在する場合はエラーが発生します。ロールが存在しない場合にのみロールを作成するにはどうすればよいですか?
解決策:
PL/pgSQL コード ブロックで DO ステートメントを使用してロールの作成を実行します。条件付き:
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$;
最適化:
潜在的な競合状態とパフォーマンスのオーバーヘッドを回避するには、例外処理メカニズム内でネストされたブロックの使用を検討してください:
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 サイトの他の関連記事を参照してください。