>데이터 베이스 >MySQL 튜토리얼 >오류를 방지하기 위해 조건부로 PostgreSQL 역할을 생성하려면 어떻게 해야 합니까?

오류를 방지하기 위해 조건부로 PostgreSQL 역할을 생성하려면 어떻게 해야 합니까?

DDD
DDD원래의
2024-12-17 19:37:10557검색

How Can I Create PostgreSQL Roles Conditionally to Avoid Errors?

조건부 실행으로 PostgreSQL 역할 생성

문제 소개

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.