PostgreSQL 9.1에서는 CREATE ROLE my_user LOGIN과 같은 간단한 스크립트를 사용하여 존재하지 않는 ROLE을 생성합니다. PASSWORD 'my_password'는 사용자가 이미 존재하는 경우 실패할 수 있습니다. 이 오류를 방지하려면 보다 정교한 접근 방식이 필요합니다.
효과적인 솔루션 중 하나는 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$;
이 스크립트는 EXISTS 문을 사용하여 역할이 이미 존재하는지 확인합니다. 그렇다면 알림이 발생하고 생성을 건너뜁니다. 그렇지 않으면 역할이 생성됩니다.
경합이 심한 작업 부하의 경우 중첩된 블록 내에 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!