34.2. 데이터베이스 윈 토토 관리#

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

34.2.1. 데이터베이스 서버에 윈 토토#

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

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

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

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

윈 토토 대상기본값기본 사용자 이름으로 기본 데이터베이스에 대한 윈 토토을 시작합니다. 이 경우 별도의 사용자 이름이나 윈 토토 이름을 지정할 수 없습니다.

윈 토토 대상을 직접 지정하면(즉, 문자열 리터럴이나 변수 참조가 아닌) 대상의 구성 요소가 일반 SQL 구문 분석을 통해 전달됩니다. 이는 예를 들어 다음을 의미합니다.호스트 이름은(는) 점으로 구분된 하나 이상의 SQL 식별자처럼 보여야 하며, 해당 식별자는 큰따옴표를 사용하지 않는 한 대소문자가 구분됩니다. 임의의 값옵션은 SQL 식별자, 정수 또는 변수 참조여야 합니다. 물론 SQL 식별자에 큰따옴표를 사용하면 거의 모든 것을 넣을 수 있습니다. 실제로는 윈 토토 대상을 직접 작성하는 것보다 (작은따옴표로 묶인) 문자열 리터럴이나 변수 참조를 사용하는 것이 오류 발생 가능성이 더 낮습니다.

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

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

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

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

소켓 윈 토토을 지정할 때(유닉스:접두사), 호스트 이름은 정확히 다음과 같아야 합니다.로컬호스트. 기본이 아닌 소켓 디렉토리를 선택하려면 디렉토리의 경로 이름을 a호스트옵션옵션대상의 일부입니다.

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

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

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

EXEC SQL CONNECT TO tcp: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 표준에 지정되어 있지 않습니다. 따라서 이식 가능한 애플리케이션을 개발하려면 위의 마지막 예를 기반으로 한 것을 사용하여 윈 토토 대상 문자열을 어딘가에 캡슐화하는 것이 좋습니다.

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

34.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이어야 함)

세 번째 옵션은 윈 토토에 윈 토토된 SQL 식별자를 선언하는 것입니다. 예를 들면 다음과 같습니다.

EXEC SQL AT윈 토토 이름선언성명-이름진술서;
EXEC SQL 준비성명-이름발신 :dyn-string;

SQL 식별자를 윈 토토에 윈 토토하면 AT 절 없이 동적 SQL을 실행합니다. 이 옵션은 전처리기 지시문처럼 작동하므로 링크는 파일에서만 활성화됩니다.

다음은 이 옵션을 사용하는 예제 프로그램입니다:

#include <stdio.h

EXEC SQL 시작 선언 섹션;
char 데이터베이스 이름[128];
char *dyn_sql = "SELECT current_database()";
EXEC SQL END 선언 섹션;

정수 메인()
  EXEC SQL CONNECT TO postgres AS con1;
  EXEC SQL CONNECT TO testdb AS con2;
  EXEC SQL AT con1 DECLARE stmt STATEMENT;
  EXEC SQL PREPARE stmt FROM :dyn_sql;
  EXEC SQL EXECUTE stmt INTO :dbname;
  printf("%s\n", DB이름);

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

이 예는 기본 윈 토토이 testdb인 경우에도 다음 출력을 생성합니다:

포스트그레스

34.2.3. 윈 토토 종료#

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

EXEC SQL DISCONNECT [윈 토토];

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

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

윈 토토 이름이 지정되지 않으면 현재 윈 토토이 닫힙니다.

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

수정 사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.