Sun Java System Directory Server Enterprise Edition 6.3 관리 설명서

JDBC 데이터 보기 만들기 및 구성

JDBC 데이터 보기를 사용하면 LDAP 클라이언트 응용 프로그램이 관계형 데이터베이스에 액세스할 수 있습니다. JDBC 데이터 보기가 작동하는 방법에 대한 자세한 내용은 Sun Java System Directory Server Enterprise Edition 6.3 ReferenceJDBC Data Views를 참조하십시오.

JDBC 데이터 보기를 만들고 구성하는 방법에 대한 자세한 내용은 다음 절차를 참조하십시오.

ProcedureJDBC 데이터 보기를 만드는 방법

DSCC를 사용하여 이 작업을 수행할 수 없습니다. 이 절차에 설명된 것처럼 명령줄을 사용하십시오.

  1. 관계형 데이터베이스에 대한 JDBC 데이터 소스를 만듭니다.


    $ dpconf create-jdbc-data-source -h host -p port -b db-name -B db-url -J driver-url \
    [-J driver-url]... -S driver-class source-name
    

    현재는 각 JDBC 데이터 보기에 대해 한 개의 JDBC 데이터 소스만 지원됩니다. 즉, 여러 JDBC 데이터 소스에서 로드 균형 조정을 수행할 수 없습니다. 여러 JDBC 데이터 소스에 액세스하려면 각 데이터 소스에 대한 데이터 보기를 만들어 결합 데이터 보기와 결합할 수 있습니다.

    JDBC 데이터 소스를 만드는 경우 다음 등록 정보를 설정해야 합니다.

    db-name

    관계형 데이터베이스 이름(예: payrolldb).

    db-url

    jdbc: vendor:driver://dbhost: dbport 형식의 데이터베이스 URL.

    db-url에는 데이터베이스 이름이 없으므로 완전한 JDBC 데이터베이스 URL이 아닙니다. (데이터베이스 이름은 db-name 등록 정보로 지정됩니다.)

    MySQL, DB2 및 Derby 데이터베이스의 경우에는 db-url/로 끝나야 하고, Oracle 데이터베이스의 경우에는 :으로 끝나야 합니다.

    driver-class

    JDBC 드라이버 클래스(예: org.hsqldb.jdbcDriver).

    driver-url

    JDBC 드라이버 경로(예: file:/// path/to/hsqldb/lib/hsqldb.jar).

    driver-url 등록 정보는 여러 값을 가집니다. 따라서 driver-url은 JDBC 드라이버에 여러 개의 JAR 파일을 지원하여 여러 플랫폼의 JDBC 소스에 연결할 수 있습니다.

  2. JDBC 데이터 소스 풀을 만듭니다.


    $ dpconf create-jdbc-data-source-pool -h host -p port pool-name
    
  3. JDBC 데이터 소스를 JDBC 데이터 소스 풀에 첨부합니다.


    $ dpconf attach-jdbc-data-source -h host -p port pool-name source-name
    
  4. JDBC 데이터 보기를 만듭니다.


    $ dpconf create-jdbc-data-view -h host -p port view-name pool-name suffix-DN
    
  5. (옵션) 데이터 보기가 성공적으로 만들어졌는지 확인하려면 JDBC 데이터 보기 목록을 봅니다.


    $ dpconf list-jdbc-data-views -h host -p port
    

ProcedureJDBC 데이터 보기를 구성하는 방법

DSCC를 사용하여 이 작업을 수행할 수 없습니다. 이 절차에 설명된 것처럼 명령줄을 사용하십시오.

  1. JDBC 데이터 보기의 등록 정보를 봅니다.


    $ dpconf get-jdbc-data-view-prop -h host -p port view-name
    

    JDBC 데이터 보기의 기본 등록 정보는 다음과 같습니다.


    alternate-search-base-dn                    :  -
    attr-name-mappings                          :  none
    base-dn                                     :  o=sql1
    contains-shared-entries                     :  -
    description                                 :  -
    distribution-algorithm                      :  -
    dn-join-rule                                :  -
    dn-mapping-attrs                            :  none
    dn-mapping-source-base-dn                   :  none
    excluded-subtrees                           :  -
    filter-join-rule                            :  -
    is-enabled                                  :  true
    is-read-only                                :  false
    is-routable                                 :  true
    jdbc-data-source-pool                       :  pool-name
    lexicographic-attrs                         :  all
    lexicographic-lower-bound                   :  none
    lexicographic-upper-bound                   :  none
    non-viewable-attr                           :  -
    non-writable-attr                           :  -
    numeric-attrs                               :  all
    numeric-default-data-view                   :  false
    numeric-lower-bound                         :  none
    numeric-upper-bound                         :  none
    pattern-matching-base-object-search-filter  :  all
    pattern-matching-dn-regular-expression      :  all
    pattern-matching-one-level-search-filter    :  all
    pattern-matching-subtree-search-filter      :  all
    process-bind                                :  -
    replication-role                            :  master
    viewable-attr                               :  all except non-viewable-attr
    writable-attr                               :  all except non-writable-attr
  2. 단계 1에 나열된 하나 이상의 등록 정보를 변경합니다.


    $ dpconf set-jdbc-data-view-prop -h host -p port view-name property:value \
     [property:value ... ]

ProcedureJDBC 테이블, 속성 및 객체 클래스 구성

JDBC 데이터 보기를 구성할 경우에는 다음 객체도 구성해야 합니다.

  1. 관계형 데이터베이스에서 각 테이블에 대한 JDBC 테이블을 만듭니다.


    % dpconf create-jdbc-table jdbc-table-name db-table
    

    db-table의 이름은 대소문자를 구분합니다. 관계형 데이터베이스에 사용된 것과 동일한 대소문자를 사용해야 하며, 그렇지 않으면 해당 테이블에 대한 작업이 실패할 수 있습니다.

  2. 각 관계형 데이터베이스 테이블에서 각 열에 대한 JDBC 속성을 만듭니다.


    % dpconf add-jdbc-attr table-name attr-name sql-column
    

    JDBC 속성을 만들면 테이블 열이 LDAP 속성에 매핑됩니다.

  3. (옵션) 관계형 데이터베이스의 열이 대소문자를 구분할 경우 JDBC 속성의 LDAP 구문을 변경합니다.


    % dpconf set-jdbc-attr-prop table-name attr-name ldap-syntax:ces

    ldap-syntax의 값은 기본적으로 cis입니다. 이는 jdbc-attr이 대소문자를 구분하지 않는다는 것을 의미합니다. 관계형 데이터베이스가 대소문자를 구분할 경우 값을 ces로 변경합니다.

    Oracle 및 DB2와 같은 특정 관계형 데이터베이스는 기본적으로 대소문자를 구분합니다. LDAP는 기본적으로 대소문자를 구분하지 않습니다. 디렉토리 프록시 서버에서 관계형 데이터베이스 테이블의 열이 대소문자를 구분한다는 것을 감지하는 경우 필터에서 해당 속성이 있는 ldapsearch 쿼리가 UPPER 함수를 사용하여 SQL 쿼리로 변환됩니다.

    예를 들어 ldapsearch -b "dc=mysuffix" "(attr=abc)" 쿼리는 다음 SQL 쿼리로 변환됩니다.


    SELECT * FROM mytable WHERE (UPPER(attr)='ABC')

    기본적으로 이 유형의 쿼리는 색인화되지 않습니다. 따라서 이 특성을 가진 쿼리는 성능에 큰 영향을 줄 수 있습니다.

    다음 두 가지 방법으로 성능에 미치는 영향을 줄일 수 있습니다.

    • jdbc-attr의 ldap-syntax 등록 정보를 ces로 설정

    • LDAP 필터에서 사용할 수 있는 각 jdbc-attr에 대해 UPPER 함수를 사용하여 색인 만들기


    주 –

    관계형 데이터베이스가 대소문자를 구분하지 않는 경우 ldap-syntax를 기본값 즉, cis로 사용합니다. ldap-syntax:ces는 대소문자를 구분하지 않는 데이터베이스에서 지원되지 않습니다.


  4. LDAP 관계형 데이터베이스 테이블에 대한 JDBC 객체 클래스를 만듭니다.


    % dpconf create-jdbc-object-class view-name objectclass primary-table \
      [secondary-table... ] DN-pattern
    

    기본적으로 JDBC 객체 클래스를 만들면 해당 테이블과 연관되는 LDAP 객체 클래스가 지정됩니다. 또한 JDBC 객체 클래스는 기본 테이블과 보조 테이블을 지정합니다(있을 경우).

    JDBC 객체 클래스를 만들 때 DN 패턴을 지정합니다. DN 패턴은 항목의 DN을 구성하는 데 사용해야 하는 속성을 설명합니다. 예를 들어 DN 패턴을 uid로 지정하면 항목의 DN이 uid 속성 및 데이터 보기의 보기 기준을 사용하여 구성됩니다. 예를 들면 uid=bjensen,ou=people,dc=example,dc=com과 같습니다. DN 패턴으로 여러 속성을 만들 수 있습니다. 이 경우 속성을 ,(쉼표)로 구분해야 합니다. 예를 들어 DN 패턴을 uid,country로 지정하는 경우 데이터 보기에서 반환되는 항목의 DN은 uid=bjensen,country=America,ou=people,dc=example,dc=com입니다.

    JDBC 객체 클래스의 DN 패턴에서 정의된 모든 하위 트리 구성 요소에는 해당 구성 요소에 대해 정의된 JDBC 객체 클래스가 있어야 합니다. 예를 들어 JDBC 객체 클래스에 DN 패턴 uid,ou가 있는 경우 JDBC 객체 클래스 정의에는 DN 패턴 ou가 포함되어야 합니다. 디렉토리 프록시 서버에서는 올바로 구성된 DIT를 구성해야 합니다. 그렇지 않으면 ou=xxx,base-DN과 같은 값이 있는 하위 트리는 검색 결과로 반환되지 않습니다.

  5. 보조 테이블이 있을 경우 기본 테이블과 보조 테이블 간에 결합 규칙을 정의합니다.


    % dpconf set-jdbc-table-prop secondary-table-name filter-join-rule:join-rule
    

    결합 규칙은 보조 테이블에 정의되며 해당 테이블의 데이터가 기본 테이블의 테이터에 연결되는 방법을 결정합니다. 객체 클래스의 기본 테이블과 보조 테이블 간에 관계를 정의하는 방법은 중요합니다. 자세한 내용은 JDBC 테이블 간의 관계 정의를 참조하십시오.

  6. JDBC 객체 클래스에 대한 수퍼 클래스를 지정합니다.


    % dpconf set-jdbc-object-class-prop view-name objectclass super-class:value
    

    수퍼 클래스는 JDBC 객체 클래스가 상속하는 LDAP 객체 클래스를 나타냅니다.

JDBC 테이블 간의 관계 정의

가장 단순한 경우 JDBC 객체 클래스는 단일(기본) 테이블만 포함합니다. 이 테이블에는 보조 테이블이 없으므로 테이블 간에 관계를 정의할 필요가 없습니다.

객체 클래스에 둘 이상의 테이블이 포함된 경우에는 해당 테이블 간의 관계를 분명하게 정의해야 합니다. 테이블 간의 관계는 항상 보조 테이블에서 정의됩니다. 보조 테이블의 다음 등록 정보를 사용하여 이러한 관계를 정의할 수 있습니다.

다음 예는 처음 두 개의 등록 정보 값을 기준으로 필터 결합 규칙을 정의하는 방법을 보여줍니다. 다음 예에서는 객체 클래스에 기본 테이블과 보조 테이블이 한 개씩 있다고 가정합니다.


예 23–1 is-single-row-table:truecontains-shared-entries:true

이 값은 해당 등록 정보의 기본값입니다. 이 경우 기본 테이블과 보조 테이블 간의 관계는 n->1입니다. 즉, 기본 테이블의 n개 행이 보조 테이블의 공유된 행 하나를 참조합니다.

관계형 데이터베이스에서 외래 키(FK)가 기본 테이블에 정의되고 보조 테이블의 열을 가리킵니다.

예를 들어 조직에서 여러 직원이 동일한 관리자를 공유할 수 있다고 가정합니다. 이 경우 다음 구조를 가진 두 개의 관계형 데이터베이스 테이블이 정의됩니다.


primary table : EMPLOYEE [ID, NAME, FK_MANAGER_ID]
secondary table : MANAGER  [ID, NAME]

다음 객체 클래스와 속성이 정의됩니다.


object-class : employee
attr : name (from primary EMPLOYEE.NAME)
attr : manager (from secondary MANAGER.NAME)

다음 필터 결합 규칙이 보조 테이블에 정의됩니다.


ID=\${EMPLOYEE.FK_MANAGER_ID}"

보조 테이블이 여러 개인 경우 각 보조 테이블에서 filter-join-rule을 구성해야 합니다. 여러 보조 테이블에 대해 filter-join-rule을 구성하는 방법에 대한 자세한 내용은 단계 11를 참조하십시오.

이 구성을 사용하면 LDAP 작업에 대해 다음 동작이 발생합니다.



예 23–2 is-single-row-table:truecontains-shared-entries:false

이 경우 기본 테이블과 보조 테이블 간의 관계는 1->1 또는 1<-1입니다. 즉, 기본 테이블의 한 행을 보조 테이블의 한 행에서 참조합니다.

관계형 데이터베이스에서 외래 키(FK)는 기본 테이블 또는 보조 테이블에 정의할 수 있습니다.

예를 들어 조직에서 직원의 UID가 하나의 테이블에 저장되고 직원의 성이 다른 테이블에 저장된다고 가정합니다. 이 경우 다음 구조를 가진 두 개의 관계형 데이터베이스 테이블이 정의됩니다.


primary table : UID [ID, VALUE, FK_SN_ID]
secondary table : SN [ID, VALUE]

다음 객체 클래스와 속성이 정의됩니다.


object-class : employee
attr : uid (from primary UID.VALUE)
attr : sn (from secondary ID.VALUE)

다음 필터 결합 규칙이 보조 테이블에 정의됩니다.


ID=\${UID.FK_SN_ID}

이 구성은 외래 키 FK_UID_ID가 보조 테이블에 저장되고 UID.ID를 가리키는 정반대 구성이 될 수 있습니다.



예 23–3 is-single-row-table:falsecontains-shared-entries:false

이 경우 기본 테이블과 보조 테이블 간의 괸계는 1->n입니다. 즉, 기본 테이블의 한 행을 보조 테이블의 n개 행에서 참조합니다. 이 예는 값이 여러 개인 속성의 경우를 보여줍니다. 값이 여러 개인 속성은 보조 테이블에서 행 집합으로 표시되며 속성 값당 한 행을 가집니다.

관계형 데이터베이스에서 외래 키는 보조 테이블에 정의되고 기본 테이블의 열을 가리킵니다.

예를 들어 조직에서 직원이 여러 전화 번호를 가질 수 있다고 가정합니다. 이 경우 다음 구조를 가진 두 개의 관계형 데이터베이스 테이블이 정의됩니다.


primary table : EMPLOYEE [ID, NAME]
secondary table : PHONE [ID, VALUE, USER_ID]

다음 객체 클래스와 속성이 정의됩니다.


object-class : employee
attr : cn (from primary EMPLOYEE.NAME)
attr : telephoneNumber (from secondary PHONE.VALUE)

다음 필터 결합 규칙이 보조 테이블에 정의됩니다.


USER_ID=\${EMPLOYEE.ID}


예 23–4 is-single-row-table:falsecontains-shared-entries:true

이 경우는 현재 디렉토리 프록시 서버에서 지원되지 않습니다.