이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 34.2. 데이터베이스 토토 베이 관리버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

35.2. 데이터베이스 롤 토토 관리

이 섹션에서는 데이터베이스 롤 토토을 열고 닫고 전환하는 방법을 설명합니다.

35.2.1. 데이터베이스 서버에 롤 토토

다음 명령문을 사용하여 데이터베이스에 롤 토토합니다:

EXEC SQL 롤 토토 대상대상 [AS롤 토토 이름] [사용자사용자 이름];

대상다음 방법으로 지정할 수 있습니다:

  • db이름[@호스트 이름][:포트]
  • tcp:postgresql://호스트 이름[:포트][/db이름][?옵션]
  • unix:postgresql://호스트 이름[:포트][/db이름][?옵션]
  • 위 형식 중 하나를 포함하는 SQL 문자열 리터럴
  • 위 형식 중 하나를 포함하는 문자 변수에 대한 참조(예제 참조)
  • 기본값

롤 토토 대상을 문자 그대로 지정하고(즉, 변수 참조를 통하지 않고) 값을 인용하지 않으면 일반 SQL의 대소문자 구분 규칙이 적용됩니다. 이 경우 필요에 따라 개별 매개변수를 별도로 큰따옴표로 묶을 수도 있습니다. 실제로는 (작은따옴표로 묶인) 문자열 리터럴이나 변수 참조를 사용하는 것이 오류 발생 가능성이 적습니다. 롤 토토 대상기본값기본 사용자 이름으로 기본 데이터베이스에 대한 롤 토토을 시작합니다. 이 경우 별도의 사용자 이름이나 롤 토토 이름을 지정할 수 없습니다.

사용자 이름을 지정하는 방법도 다양합니다:

  • 사용자 이름
  • 사용자 이름/비밀번호
  • 사용자 이름식별자:비밀번호
  • 사용자 이름사용 중비밀번호

위와 같이 매개변수사용자 이름그리고비밀번호SQL 식별자, SQL 문자열 리터럴 또는 문자 변수에 대한 참조일 수 있습니다.

롤 토토 대상에 다음이 포함된 경우옵션, 이는 다음으로 구성됩니다.키워드=앰퍼샌드로 구분된 사양(&). 허용되는 키워드는 다음에서 인식하는 것과 동일합니다.libpq(참조섹션 33.1.2). 공백은 임의 앞에 무시됩니다.키워드또는, 하지만 1 이내 또는 이후는 아닙니다. 쓸 수 있는 방법이 없다는 점 참고하세요&내부.

롤 토토 이름은 하나의 프로그램에서 여러 롤 토토을 처리하는 데 사용됩니다. 프로그램이 하나의 롤 토토만 사용하는 경우 생략할 수 있습니다. 가장 최근에 열린 롤 토토이 현재 롤 토토이 되며, 이는 SQL 문이 실행될 때 기본적으로 사용됩니다(이 장의 뒷부분 참조).

신뢰할 수 없는 사용자가 다음을 채택하지 않은 데이터베이스에 액세스할 수 있는 경우보안 스키마 사용 패턴, 공개적으로 쓰기 가능한 스키마를 제거하여 각 세션을 시작합니다.검색_경로. 예를 들어 다음을 추가하세요.옵션=-c 검색_경로=옵션또는 문제EXEC SQL SELECT pg_catalog.set_config('search_path', '', false);롤 토토 후. 이 고려 사항은 ECPG에만 국한되지 않습니다. 임의의 SQL 명령을 실행하기 위한 모든 인터페이스에 적용됩니다.

다음은 몇 가지 예입니다.롤 토토문장:

EXEC SQL이 mydb@sql.mydomain.com에 롤 토토됩니다.

EXEC SQL CONNECT TO unix:postgresql://sql.mydomain.com/mydb AS myconnection USER john;

EXEC SQL 시작 선언 섹션;
const char *target = "mydb@sql.mydomain.com";
const char *user = "존";
const char *passwd = "비밀";
EXEC SQL END 선언 섹션;
 ...
EXEC SQL 롤 토토 대상 :target USER :user USING :passwd;
/* 또는 EXEC SQL CONNECT TO :target USER :user/:passwd; */

마지막 형식은 위에 언급된 변형을 문자 변수 참조로 사용합니다. C 변수에 콜론을 접두어로 붙여 SQL 문에서 C 변수를 사용하는 방법은 이후 섹션에서 살펴보겠습니다.

롤 토토 대상의 형식은 SQL 표준에 지정되어 있지 않습니다. 따라서 이식 가능한 애플리케이션을 개발하려면 위의 마지막 예를 기반으로 한 것을 사용하여 롤 토토 대상 문자열을 어딘가에 캡슐화하는 것이 좋습니다.

35.2.2. 롤 토토 선택

Embedded SQL 프로그램의 SQL 문은 기본적으로 현재 롤 토토, 즉 가장 최근에 열린 롤 토토에서 실행됩니다. 애플리케이션이 여러 롤 토토을 관리해야 하는 경우 이를 처리하는 두 가지 방법이 있습니다.

첫 번째 옵션은 각 SQL 문에 대한 롤 토토을 명시적으로 선택하는 것입니다. 예를 들면 다음과 같습니다.

EXEC SQL AT롤 토토 이름선택 ...;

이 옵션은 응용프로그램이 여러 롤 토토을 혼합된 순서로 사용해야 하는 경우 특히 적합합니다.

애플리케이션이 여러 실행 스레드를 사용하는 경우 동시에 롤 토토을 공유할 수 없습니다. 롤 토토에 대한 액세스를 명시적으로 제어하거나(뮤텍스 사용) 각 스레드에 대한 롤 토토을 사용해야 합니다.

두 번째 옵션은 현재 롤 토토을 전환하는 명령문을 실행하는 것입니다. 그 진술은 다음과 같습니다:

EXEC SQL 세트 롤 토토롤 토토 이름;

이 옵션은 동일한 롤 토토에서 많은 명령문이 실행되는 경우 특히 편리합니다.

다음은 여러 데이터베이스 롤 토토을 관리하는 예제 프로그램입니다:

#include <stdio.h

EXEC SQL 시작 선언 섹션;
    char 데이터베이스 이름[1024];
EXEC SQL END 선언 섹션;

정수
메인()

    EXEC SQL CONNECT TO testdb1 AS con1 USER testuser;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL 커밋;
    EXEC SQL CONNECT TO testdb2 AS con2 USER testuser;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL 커밋;
    EXEC SQL CONNECT TO testdb3 AS con3 USER testuser;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL 커밋;

    /* 이 쿼리는 마지막으로 열린 데이터베이스 "testdb3"에서 실행됩니다. */
    EXEC SQL SELECT current_database() INTO :dbname;
    printf("현재=%s(testdb3이어야 함)\n", dbname);

    /* "testdb2"에서 쿼리를 실행하기 위해 "AT"를 사용함 */
    EXEC SQL AT con2 SELECT current_database() INTO :dbname;
    printf("현재=%s(testdb2여야 함)\n", dbname);

    /* 현재 롤 토토을 "testdb1"로 전환합니다. */
    EXEC SQL SET 롤 토토 con1;

    EXEC SQL SELECT current_database() INTO :dbname;
    printf("현재=%s(testdb1이어야 함)\n", dbname);

    EXEC SQL 모두 롤 토토 해제;
    0을 반환합니다.

이 예는 다음과 같은 출력을 생성합니다:

current=testdb3 (testdb3이어야 함)
current=testdb2(testdb2여야 함)
current=testdb1(testdb1이어야 함)

35.2.3. 롤 토토 종료

롤 토토을 종료하려면 다음 명령문을 사용하십시오:

EXEC SQL 롤 토토 해제 [롤 토토];

롤 토토다음 방법으로 지정할 수 있습니다:

  • 롤 토토 이름
  • 현재
  • 전체

롤 토토 이름이 지정되지 않으면 현재 롤 토토이 종료됩니다.

애플리케이션이 열린 모든 롤 토토에서 항상 명시적으로 롤 토토을 끊는 것이 좋은 스타일입니다.