PostgreSQL 9.1에서 역할이 이미 존재하는 경우 CREATE ROLE을 사용하여 역할을 생성하면 실패합니다. 이러한 제한으로 인해 데이터베이스 생성 및 역할 관리를 스크립팅할 때 문제가 발생합니다. 원하는 해결 방법은 역할이 존재하지 않는 경우에만 CREATE ROLE 문을 조건부로 실행하는 것입니다.
한 가지 접근 방식은 PL/pgSQL의 DO 블록과 IF EXISTS 조건을 활용하는 것입니다. :
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$;
이 스크립트는 SELECT를 사용하여 역할의 존재를 동적으로 확인하고 CREATE를 실행합니다. 역할이 존재하지 않는 경우에만 ROLE.
이 솔루션은 경쟁 조건을 도입하지 않습니다. IF 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!