애플리케이션 컨테이너

CDB 내에서 PDB에서 공유할 수 있는 애플리케이션 데이터 및 메타데이터에 대한 컨테이너를 생성할 수 있습니다.

애플리케이션 컨테이너 정보

애플리케이션 컨테이너는 하나 이상의 애플리케이션 백엔드에 대한 데이터 및 메타데이터를 저장하는 선택적 사용자 생성 CDB 구성요소입니다. CDB에는 0개 이상의 애플리케이션 컨테이너가 포함됩니다.

애플리케이션 컨테이너 내에서 애플리케이션은 애플리케이션 루트에 저장된 이름이 지정되고 버전이 지정된 공통 데이터 및 메타데이터 세트입니다. 응용 프로그램 컨테이너의 이러한 컨텍스트에서 "응용 프로그램"이라는 용어는 "마스터 응용 프로그램 정의"를 의미합니다. 예를 들어, 응용 프로그램에는 테이블, 뷰 및 패키지 정의가 포함될 수 있습니다.

예를 들어, 공통 테이블 및 테이블 정의 집합으로 구성된 응용 프로그램을 공유하는 이러한 PDB를 사용하여 한 응용 프로그램 컨테이너 내에 여러 판매 관련 PDB를 생성할 수 있습니다. 여러 HR 관련 PDB를 개별 응용 프로그램 컨테이너에 고유한 공통 테이블 및 테이블 정의와 함께 저장할 수 있습니다.

AS APPLICATION CONTAINER 절이 있는 CREATE PLUGGABLE DATABASE 문은 응용 프로그램 컨테이너의 응용 프로그램 루트를 생성하므로 응용 프로그램 컨테이너 자체가 암시적으로 생성됩니다. 애플리케이션 컨테이너를 처음 생성하면 PDB가 포함되지 않습니다. 응용 프로그램 PDB를 생성하려면 응용 프로그램 루트에 연결한 다음 CREATE PLUGGABLE DATABASE 문을 실행해야 합니다.

CREATE PLUGGABLE DATABASE 문에서 컨테이너 이름(응용 프로그램 루트 이름과 동일)을 지정해야 합니다(예: saas_sales_ac). 응용 프로그램 컨테이너 이름은 CDB 내에서 고유해야 하며 특정 리스너를 통해 Instance에 도달하는 모든 CDB 범위 내에서 고유해야 합니다. 모든 애플리케이션 컨테이너에는 애플리케이션 컨테이너와 동일한 이름의 기본 서비스가 있습니다.

애플리케이션 컨테이너의 목적

어떤 면에서 응용 프로그램 컨테이너는 CDB 내에서 응용 프로그램별 CDB로 작동합니다. CDB 자체와 같은 애플리케이션 컨테이너는 여러 PDB를 포함할 수 있으며 이러한 PDB가 메타데이터와 데이터를 공유할 수 있도록 합니다.

응용 프로그램 루트를 사용하면 응용 프로그램 PDB가 응용 프로그램을 공유할 수 있습니다. 이 컨텍스트에서는 이름이 지정되고 버전이 지정된 공통 메타 데이터 및 데이터 세트를 의미합니다. 일반적인 응용 프로그램은 응용 프로그램 공통 사용자, 메타 데이터 연결 공통 객체 및 데이터 연결 공통 객체를 설치합니다.

애플리케이션 컨테이너의 주요 이점

애플리케이션 컨테이너는 각 애플리케이션을 별도의 PDB에 저장하는 것보다 여러 가지 이점을 제공합니다.

애플리케이션 컨테이너 사용 사례: SaaS

SaaS 배치는 메타데이터와 데이터를 공유하는 개별 고객에 대해 각각 여러 애플리케이션 PDB를 사용할 수 있습니다.

순수 SaaS 환경에서 마스터 애플리케이션 정의는 애플리케이션 루트에 상주하지만 고객별 데이터는 자체 애플리케이션 PDB에 상주합니다. 예를 들어, sales_app는 응용 프로그램 루트의 응용 프로그램 모델입니다. 이름이 cust1_pdb인 애플리케이션 PDB는 고객 1에 대한 판매 데이터만 포함하는 반면, 이름이 cust2_pdb인 애플리케이션 PDB는 고객 2에 대한 판매 데이터만 포함합니다. 개별 고객 PDB에 대해 플러그, 언플러그, 복제 및 기타 PDB 레벨 작업을 사용할 수 있습니다.

그림 1: SaaS 사용 사례

그림 cncpt389.png에 대한 설명

순수 SaaS 구성은 다음과 같은 이점을 제공합니다.

애플리케이션 컨테이너 사용 사례: 논리적 데이터 웨어하우스

고객은 여러 애플리케이션 PDB를 사용하여 데이터 주권 문제를 해결할 수 있습니다.

샘플 사용 사례에서 회사는 각 회계 분기별 데이터를 별도의 PDB에 저장합니다. 예를 들어, 이름이 sales_ac인 애플리케이션 컨테이너에는 q1_2016_pdb, q2_2016_pdb, q3_2016_pdb 및 q4_2016_pdb가 포함됩니다. 연관된 분기에 해당하는 PDB에서 각 트랜잭션을 정의합니다. 1년 간 성능을 집계하는 보고서를 생성하려면 CONTAINERS() 절을 사용하여 네 개의 PDB에서 집계합니다.

이 논리적 웨어하우스 설계의 이점은 다음과 같습니다.

애플리케이션 루트

애플리케이션 컨테이너에는 컨테이너에 있는 애플리케이션 PDB의 상위인 정확히 하나의 애플리케이션 루트가 있습니다.

응용 프로그램 루트의 등록 정보는 생성 시 설정되며 변경할 수 없습니다. 응용 프로그램 루트가 속한 유일한 컨테이너는 CDB 루트입니다. 응용 프로그램 루트는 어떤 방식으로든 CDB 루트와 같으며 다른 방식으로는 PDB와 같습니다.

응용 프로그램 루트는 사용자 생성 공통 객체(응용 프로그램 공통 객체라고 함)를 저장할 수 있으므로 CDB 루트 및 표준 PDB와 다릅니다. 애플리케이션 공통 객체는 애플리케이션 루트에 플러그인된 애플리케이션 PDB에서 액세스할 수 있습니다. 응용 프로그램 공통 객체는 CDB 루트, 기타 응용 프로그램 루트 또는 응용 프로그램 루트에 속하지 않는 PDB에 표시되지 않습니다.

예 3-1 응용 프로그램 루트 만들기

이 예에서는 CDB 루트에 관리 공통 사용자 c##system로 로그인합니다. saas_sales_ac라는 응용 프로그램 컨테이너를 생성한 다음 컨테이너와 동일한 이름을 가진 응용 프로그램 루트를 엽니다.

-- Create the application container called saas_sales_ac
CREATE PLUGGABLE DATABASE saas_sales_ac AS APPLICATION CONTAINER
  ADMIN USER saas_sales_ac_adm IDENTIFIED BY manager;

-- Open the application root
ALTER PLUGGABLE DATABASE saas_sales_ac OPEN;

현재 컨테이너를 saas_sales_ac로 설정한 다음 이 컨테이너가 애플리케이션 루트인지 확인합니다.

-- Set the current container to saas_sales_ac
ALTER SESSION SET CONTAINER = saas_sales_ac;

COL NAME FORMAT a15
COL ROOT FORMAT a4
SELECT CON_ID, NAME, APPLICATION_ROOT AS ROOT,
       APPLICATION_PDB AS PDB,
FROM   V$CONTAINERS;

    CON_ID NAME            ROOT PDB
---------- --------------- ---- ---
         3 SAAS_SALES_AC   YES	NO

애플리케이션 컨테이너의 경우 SYS_CONTEXT 함수의 USERENV 네임스페이스에 다음 두 개의 매개변수를 지정합니다.

SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT')
SYS_CONTEXT('USERENV', 'IS_APPLICATION_PDB')

응용 프로그램 루트의 SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT') 값은 다음과 같습니다.

SQL> select sys_context('USERENV', 'IS_APPLICATION_ROOT') from dual;

SYS_CONTEXT('USERENV','IS_APPLICATION_ROOT')
--------------------------------------------------------------------------------
YES

SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT')의 값은 V$PDBS 뷰의 APPLICATION_ROOT 열과 일치합니다.

SQL> select application_root from v$pdbs where con_id=sys_context('USERENV', 'CON_ID');

APP
---
YES

애플리케이션 PDB

애플리케이션 PDB는 애플리케이션 컨테이너에 상주하는 PDB입니다. CDB의 모든 PDB는 0개 또는 하나의 애플리케이션 컨테이너에 상주합니다.

예를 들어, saas_sales_ac 애플리케이션 컨테이너는 여러 고객을 지원할 수 있으며, 각 고객 애플리케이션은 해당 데이터를 별도의 PDB에 저장합니다. PDB cust1_sales_pdb 및 cust2_sales_pdb 애플리케이션은 saas_sales_ac에 상주할 수 있으며, 이 경우 다른 애플리케이션 컨테이너에 속하지 않습니다(PDB와 마찬가지로 CDB 루트에도 속함).

애플리케이션 루트에 접속되어 있는 동안 CREATE PLUGGABLE DATABASE를 실행하여 애플리케이션 PDB를 생성합니다. 시드로부터 애플리케이션 PDB를 생성하거나, PDB를 복제하거나, 언플러그된 PDB를 플러그인할 수 있습니다. CDB 루트에 플러그인된 PDB와 마찬가지로 애플리케이션 PDB를 복제, 언플러그 또는 삭제할 수 있습니다. 그러나 응용 프로그램 PDB는 항상 응용 프로그램 루트에 속해야 합니다.

애플리케이션 시드

애플리케이션 시드는 애플리케이션 컨테이너 내에서 사용자가 생성한 선택적 PDB입니다. 애플리케이션 컨테이너에 0개 또는 1개의 애플리케이션 시드가 있습니다.

애플리케이션 시드를 사용하면 애플리케이션 PDB를 빠르게 생성할 수 있습니다. PDB$SEED가 CDB 자체 내에서 작동하는 것처럼 애플리케이션 컨테이너 내에서 동일한 역할을 수행합니다.

애플리케이션 시드 이름은 항상 application_container_name$SEED입니다. 여기서 application_container_name은 애플리케이션 컨테이너의 이름입니다. 예를 들어, CREATE PDB ... AS SEED 문을 사용하여 saas_sales_ac 애플리케이션 컨테이너에 saas_sales_ac$SEED를 생성합니다.

응용 프로그램 공통 객체

응용 프로그램 공통 객체는 응용 프로그램 루트의 응용 프로그램 내에서 생성되는 공통 객체입니다. 공통 객체는 데이터 링크 또는 메타 데이터 링크입니다.

데이터 연결 공통 객체의 경우 애플리케이션 PDB는 단일 데이터 세트를 공유합니다. 예를 들어, saas_sales_ac 애플리케이션 컨테이너에 대한 애플리케이션 이름은 saas_sales_app이고, 버전은 1.0이며, 데이터 링크 usa_zipcodes 테이블을 포함합니다. 이 경우 행은 응용 프로그램 루트의 테이블에 한 번 저장되지만 모든 응용 프로그램 PDB에서 표시됩니다.

메타데이터 연결 공통 객체의 경우 애플리케이션 PDB는 메타데이터만 공유하지만 서로 다른 데이터 세트를 포함합니다. 예를 들어, 메타데이터로 링크된 products 테이블은 모든 애플리케이션 PDB에서 동일한 정의를 가지지만 행 자체는 PDB와 관련됩니다. cust1pdb라는 애플리케이션 PDB에는 장부가 포함된 products 테이블이 있을 수 있지만, cust2pdb라는 애플리케이션 PDB에는 자동차 부품이 포함된 products 테이블이 있을 수 있습니다.

CDB의 공통성 정보

CDB 또는 응용 프로그램 루트에 정의된 일반적인 현상은 이 루트에 플러그인된 모든 컨테이너에서 동일합니다.

일반성의 원칙

CDB에서는 시스템 컨테이너(CDB 자체) 내에서 또는 특정 응용 프로그램 컨테이너 내에서 현상이 일반적일 수 있습니다.

예를 들어, CDB$ROOT에 접속되어 있는 동안 공통 사용자 계정을 생성하는 경우 이 사용자 계정은 CDB의 모든 PDB 및 애플리케이션 루트에 공통됩니다. 그러나 애플리케이션 루트에 연결된 동안 애플리케이션 공통 사용자 계정을 생성하는 경우 이 사용자 계정은 이 애플리케이션 컨테이너의 PDB에만 공통됩니다.

CDB$ROOT 또는 응용 프로그램 루트의 컨텍스트 내에서 공통성 원칙은 다음과 같습니다.

CDB의 네임스페이스

CDB에서는 모든 객체의 네임스페이스가 해당 컨테이너로 범위가 지정됩니다.

다음 원칙은 범위 지정 규칙을 요약합니다.

앞의 원칙은 지역 및 공통 현상에 영향을 미칩니다.

지역 현상

로컬 현상은 컨테이너 내부에서 고유하게 명명되어야 하지만 CDB의 모든 컨테이너에서는 명명되지 않아야 합니다. 서로 다른 컨테이너에서 동일하게 명명된 로컬 현상은 구분됩니다. 예를 들어, 한 PDB의 로컬 사용자 sh가 다른 PDB의 로컬 사용자 sh와 충돌하지 않습니다.

CDB$ROOT 공통 현상

CDB$ROOT에 정의된 일반적인 현상은 여러 컨테이너에 존재하며 이러한 각 네임스페이스 내에서 고유해야 합니다. 예를 들어, CDB 루트에는 SYSTEM 및 SYS와 같은 미리 정의된 일반 사용자가 포함됩니다. 네임스페이스 구분을 보장하기 위해 Oracle AI Database는 다른 컨테이너 내에서 SYSTEM 사용자를 생성하지 못하도록 합니다.

네임스페이스 구분을 보장하려면 CDB 루트에서 사용자가 생성한 공통 현상의 이름이 COMMON_USER_PREFIX 초기화 매개변수로 지정된 값으로 시작해야 합니다. 기본 접두어는 c## 또는 C##입니다. 사용자가 생성한 모든 기타 현상의 이름은 c## 또는 C##로 시작하지 않아야 합니다. 예를 들어, c##hr라는 이름의 hrpdb에 로컬 사용자를 만들 수 없으며, hr라는 이름의 CDB 루트에 공통 사용자를 만들 수도 없습니다.

애플리케이션 공통 현상

애플리케이션 컨테이너 내에서 로컬 및 애플리케이션 공통 현상의 이름이 충돌하지 않아야 합니다.

참조: 일반 사용자 및 역할에 대한 자세한 내용은 Oracle AI Database Security Guide를 참조하십시오.

애플리케이션 공통 객체 생성

공통 객체를 생성하려면 응용 프로그램 루트에 연결한 다음 공유 속성을 지정하는 CREATE 문을 실행합니다.

애플리케이션 설치, 업그레이드 또는 패치의 일부로만 애플리케이션 공통 객체를 생성하거나 변경할 수 있습니다. 다음과 같은 방법으로 공유를 지정할 수 있습니다.

다음 표에서는 응용 프로그램 공통 객체의 유형과 데이터 및 메타 데이터가 저장되는 위치를 보여줍니다.

테이블 1 애플리케이션 공통 객체

객체 유형 SHARING 값 메타데이터 스토리지 데이터 예외사항역
데이터 연결 DATA 애플리케이션 루트 애플리케이션 루트
확장 데이터 연결 EXTENDED DATA 애플리케이션 루트 애플리케이션 루트 및 애플리케이션 P DB
메타데이터 연결됨 METADATA 애플리케이션 루트 애플리케이션 PDB

참조: 공통 객체에 대한 권한을 관리하는 방법은 Oracle AI Database Security Guide를 참조하십시오.

메타 데이터 링크 응용 프로그램 공통 객체

메타데이터 링크는 애플리케이션 컨테이너의 모든 PDB에서 공유하는 공통 메타데이터에 대한 참조 및 권한 부여를 지원하는 딕셔너리 객체입니다.

SHARING 절 또는 DEFAULT_SHARING 초기화 매개변수에 METADATA 값을 지정하면 객체의 메타데이터에 대한 링크(메타데이터 연결 공통 객체라고 함)가 지정됩니다. 객체의 메타데이터는 응용 프로그램 루트에 한 번 저장됩니다.

PL/SQL 프로시저와 같은 테이블, 뷰 및 코드 객체는 메타 데이터를 공유할 수 있습니다. 이 컨텍스트에서 "메타 데이터"에는 열 정의, 제약 조건, 트리거 및 코드가 포함됩니다. 예를 들어, sales_mlt가 메타데이터로 연결된 공통 테이블인 경우 모든 애플리케이션 PDB는 메타데이터 링크를 통해 애플리케이션 루트에 저장된 이 테이블의 동일한 정의에 액세스합니다. sales_mlt의 행은 모든 애플리케이션 PDB에서 다르지만 열 정의는 동일합니다.

일반적으로 응용 프로그램의 대부분의 객체는 메타 데이터로 연결됩니다. 따라서 하나의 마스터 응용 프로그램 정의만 유지 관리하면 됩니다. 이 접근 방식은 여러 애플리케이션 PDB에서 애플리케이션 관리를 중앙 집중화합니다.

예제 3-2 메타 데이터 링크 공통 객체 생성

이 예에서 SYSTEM 사용자는 saas_sales_ac 애플리케이션 컨테이너에 로그인합니다. SYSTEM는 saas_sales_app라는 애플리케이션을 버전 1.0에 설치합니다. 이 응용 프로그램은 saas_sales_adm라는 공통 사용자 계정을 만듭니다. 이 스키마는 sales_mlt라는 메타데이터로 연결된 공통 테이블을 포함합니다.

-- Begin the install of saas_sales_app
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app BEGIN INSTALL '1.0';

-- Create the tablespace for the app
CREATE TABLESPACE saas_sales_tbs DATAFILE SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 200M;

-- Create the user account saas_sales_adm, which will own the app
CREATE USER saas_sales_adm IDENTIFIED BY ****** CONTAINER=ALL;

-- Grant necessary privileges to this user account
GRANT CREATE SESSION, DBA TO saas_sales_adm;

-- Makes the tablespace that you just created the default for saas_sales_adm
ALTER USER saas_sales_adm DEFAULT TABLESPACE saas_sales_tbs;

-- Now connect as the application owner
CONNECT saas_sales_adm/******@saas_sales_ac

-- Create a metadata-linked table
CREATE TABLE saas_sales_adm.sales_mlt SHARING=METADATA
(YEAR       NUMBER(4),
 REGION     VARCHAR2(10),
 QUARTER    VARCHAR2(4),
 REVENUE    NUMBER);

-- End the application installation
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app END INSTALL '1.0';

ALTER PLUGGABLE DATABASE APPLICATION ... SYNC 문을 사용하여 애플리케이션 PDB를 동기화하여 동일한 마스터 애플리케이션 정의를 사용할 수 있습니다. 이러한 방식으로 모든 애플리케이션 PDB에는 saas_sales_adm.sales_mlt 공통 테이블에 대한 메타데이터 링크가 있습니다. 이름이 cust1_pdb인 PDB 내에서 sales_mlt를 업데이트하는 중간 계층 코드는 cust1_pdb에서 이 테이블에 행을 추가하는 반면, cust2_pdb에서 sales_mlt를 업데이트하는 중간 계층 코드는 cust2_pdb에서 이 테이블의 복사본에 행을 추가합니다. 응용 프로그램 루트에 저장된 테이블 메타 데이터만 공유됩니다. 주: 일반적으로 부여되는 객체 권한이 작동하는 방식에 대해 자세히 알아보려면 Oracle AI Database Security Guide를 참조하십시오.

메타데이터 링크

메타 데이터로 연결된 응용 프로그램 공통 객체의 경우 객체에 대한 메타 데이터는 응용 프로그램 루트에 한 번 저장됩니다. 메타 데이터 링크는 객체 유형이 공유 중인 메타 데이터와 동일한 딕셔너리 객체입니다.

메타데이터 링크에 대한 설명은 생성된 PDB의 데이터 딕셔너리에 저장됩니다. 메타데이터 링크는 애플리케이션 공통 사용자가 소유해야 합니다. 메타데이터 링크만 사용하여 CDB 루트 또는 응용 프로그램 루트의 생성자가 소유한 공통 객체의 메타데이터를 공유할 수 있습니다.

데이터 링크와 달리 메타데이터 링크는 공통 데이터에만 종속됩니다. 예를 들어, 응용 프로그램이 응용 프로그램 루트에 로컬 테이블 dow_close_lt 및 nasdaq_close_lt를 포함하는 경우 공통 사용자는 이러한 객체에 대한 메타 데이터 링크를 생성할 수 없습니다. 그러나 sales_mlt라는 응용 프로그램 공통 테이블은 메타 데이터 링크일 수 있습니다.

권한 있는 일반 사용자가 sales_mlt에 대한 메타데이터를 변경하는 경우(예: 테이블에 열을 추가하는 경우) 이 변경사항은 메타데이터 링크로 전달됩니다. 애플리케이션 PDB 사용자는 메타데이터 링크에서 메타데이터를 변경할 수 없습니다. 예를 들어, 이름이 cust1_pdb인 애플리케이션 PDB를 관리하는 DBA는 이 PDB의 sales_mlt에만 열을 추가할 수 없습니다. 이러한 메타데이터 변경은 애플리케이션 루트에서만 수행할 수 있습니다.

데이터 링크 응용 프로그램 공통 객체

데이터 연결 객체는 메타데이터 및 데이터가 애플리케이션 루트에 상주하며 이 애플리케이션 컨테이너의 모든 애플리케이션 PDB에서 액세스할 수 있는 객체입니다.

SHARING 절 또는 DEFAULT_SHARING 초기화 매개변수에 DATA 값을 지정하면 데이터 연결 공통 객체라는 공통 객체에 대한 링크가 지정됩니다. 데이터 웨어하우스의 차원 테이블은 종종 데이터 연결 공통 테이블의 후보입니다.

데이터 링크는 동의어처럼 작동하는 딕셔너리 객체입니다. 예를 들어, countries가 애플리케이션 공통 테이블인 경우 모든 애플리케이션 PDB는 데이터 링크를 통해 이 테이블의 동일한 복사본에 액세스합니다. 이 테이블에 행이 추가되면 이 행이 모든 애플리케이션 PDB에 표시됩니다.

데이터 링크는 애플리케이션 공통 사용자가 소유해야 합니다. 링크는 가리키는 객체에서 객체 유형을 상속합니다. 데이터 링크에 대한 설명은 해당 링크가 생성된 PDB의 딕셔너리에 저장됩니다. 예를 들어, 애플리케이션 컨테이너에 10개의 애플리케이션 PDB가 포함되어 있고 모든 PDB에 countries 애플리케이션 공통 테이블에 대한 링크가 포함되어 있는 경우 모든 10개의 PDB에 이 링크에 대한 딕셔너리 정의가 포함됩니다.

예제 3-3 데이터 연결 객체 생성

이 예에서 SYSTEM는 saas_sales_ac 애플리케이션 컨테이너에 접속합니다. SYSTEM는 이름이 saas_sales_app인 애플리케이션을 버전 1.0에서 2.0로 업그레이드합니다. 이 애플리케이션 업그레이드는 공통 사용자 saas_sales_adm로 컨테이너에 로그인하고, countries_dlt라는 데이터 링크 테이블을 생성한 다음, 컨테이너에 행을 삽입합니다.

-- Begin an upgrade of the application
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app BEGIN UPGRADE '1.0' to '2.0';

-- Connect as application owner to application root
CONNECT saas_sales_adm/manager@saas_sales_ac

-- Create data-linked table named countries_dlt
CREATE TABLE countries_dlt SHARING=DATA
(country_id   NUMBER,
 country_name VARCHAR2(20));

-- Insert records into countries_dlt
INSERT INTO countries_dlt VALUES(1, 'USA');
INSERT INTO countries_dlt VALUES(44, 'UK');
INSERT INTO countries_dlt VALUES(86, 'China');
INSERT INTO countries_dlt VALUES(91, 'India');

-- End application upgrade
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app END UPGRADE TO '2.0';

ALTER PLUGGABLE DATABASE APPLICATION ... SYNC 문을 사용하여 애플리케이션 PDB를 애플리케이션 루트와 동기화합니다. 이러한 방식으로 모든 동기화된 애플리케이션 PDB에는 saas_sales_adm.countries_dlt 데이터 링크 테이블에 대한 데이터 링크가 있습니다.

확장된 데이터 연결 응용 프로그램 객체

확장된 데이터 연결 객체는 데이터 연결 객체 및 메타데이터 연결 객체의 하이브리드입니다.

확장된 데이터 링크 객체에서 응용 프로그램 루트에 저장된 데이터는 모든 응용 프로그램 PDB에 공통되며 모든 PDB가 이 데이터에 액세스할 수 있습니다. 그러나 각 응용 프로그램 PDB는 응용 프로그램 루트의 공통 데이터를 공유하면서 고유의 PDB 관련 데이터를 생성할 수 있습니다. 따라서 PDB는 공통 데이터를 자체 데이터로 보완합니다.

예를 들어, 영업 애플리케이션은 여러 애플리케이션 PDB를 지원할 수 있습니다. 모든 애플리케이션 PDB에는 미국의 우편 번호가 필요합니다. 이 경우 응용 프로그램 루트에 zipcodes_edt 확장 데이터 링크 테이블을 만들 수 있습니다. 응용 프로그램 루트는 미국 우편 번호를 저장하므로 모든 응용 프로그램 PDB에서 해당 우편 번호에 액세스할 수 있습니다. 그러나 한 응용 프로그램 PDB에는 미국 및 캐나다의 우편 번호가 필요합니다. 이 응용 프로그램 PDB는 응용 프로그램 루트가 아닌 응용 프로그램 PDB의 확장된 데이터 연결 객체에 캐나다 우편 번호를 저장할 수 있습니다.

응용 프로그램 루트에 연결하고 CREATE 문에 SHARING=EXTENDED DATA 키워드를 지정하여 확장된 데이터 연결 객체를 생성합니다.

예 3-4 확장 데이터 객체 만들기

이 예에서 SYSTEM는 saas_sales_ac 애플리케이션 컨테이너에 접속한 다음 2.0 버전에서 3.0로 이름이 saas_sales_app인 애플리케이션("예 3-2"로 생성됨)을 업그레이드합니다. 이 응용 프로그램은 일반 사용자 saas_sales_adm로 컨테이너에 로그인하고, zipcodes_edt라는 확장된 데이터 링크 테이블을 생성한 다음 여기에 행을 삽입합니다.

-- Begin an upgrade of the app
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app BEGIN UPGRADE '2.0' to '3.0';

-- Connect as app owner to app root
CONNECT saas_sales_adm/manager@saas_sales_ac

-- Create a common-data table named zipcodes_edt
CREATE TABLE zipcodes_edt SHARING=EXTENDED DATA
(code       VARCHAR2(5),
 country_id NUMBER,
 region     VARCHAR2(10));

-- Load rows into zipcodes_edt
INSERT INTO zipcodes_edt VALUES ('08820','1','East');
INSERT INTO zipcodes_edt VALUES ('10005','1','East');
INSERT INTO zipcodes_edt VALUES ('44332','1','North');
INSERT INTO zipcodes_edt VALUES ('94065','1','West');
INSERT INTO zipcodes_edt VALUES ('73301','1','South');
COMMIT;

-- End app upgrade
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app END UPGRADE TO '3.0';

ALTER PLUGGABLE DATABASE APPLICATION ... SYNC 문을 사용하여 애플리케이션 PDB를 애플리케이션과 동기화합니다. 이러한 방식으로 모든 동기화된 애플리케이션 PDB에는 saas_sales_adm.zipcodes_edt 데이터 링크 테이블에 대한 데이터 링크가 있습니다. 이러한 PDB에 연결하는 애플리케이션은 애플리케이션 업그레이드 중 zipcodes_edt에 삽입된 우편 번호를 볼 수 있지만 이 테이블에 자체 우편 번호를 삽입할 수도 있습니다.

컨테이너 맵

컨테이너 맵을 사용하면 응용 프로그램 루트에 연결된 세션이 SQL 문에 사용된 술어 값에 따라 적절한 PDB로 경로 지정되는 SQL 문을 실행할 수 있습니다.

맵 테이블은 메타 데이터로 연결된 공통 테이블의 열을 지정하고, 분할 영역을 사용하여 서로 다른 응용 프로그램 PDB를 서로 다른 열 값과 연관시킵니다. 이러한 방식으로 컨테이너 맵은 데이터가 테이블 레벨에서 물리적으로 분할되지 않은 경우 PDB 레벨에서 데이터 분할을 사용으로 설정합니다.

컨테이너 맵을 사용하기 위한 주요 구성요소는 다음과 같습니다.

예 3-5 메타 데이터 연결 테이블, 맵 테이블 및 컨테이너 맵 생성: 파트 1

이 예에서는 응용 프로그램 관리자로 응용 프로그램 루트에 로그인합니다. 애플리케이션 컨테이너에 amer_pdb, euro_pdb 및 asia_pdb의 세 가지 애플리케이션 PDB가 있다고 가정합니다. 각 애플리케이션 PDB는 서로 다른 지역의 국가 이름을 저장합니다. oe.countries_mlt라는 메타데이터로 링크된 테이블에는 국가 이름을 저장하는 cname 열이 있습니다. 이 분할 전략의 경우 분할 영역별 목록을 사용하여 각 영역에 대한 분할 영역을 생성하는 salesadm.pdb_map_tbl라는 맵 객체를 생성합니다. 국가 이름에 따라 지역이 결정됩니다.

ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app BEGIN INSTALL '1.0';

-- Create the metadata-linked table.
CREATE TABLE oe.countries_mlt SHARING=METADATA (
  region    VARCHAR2(30),
  cname     VARCHAR2(30));

-- Create the partitioned map table, which is list partitioned on the
-- cname column. The names of the partitions are the names of the
-- application PDBs.
CREATE TABLE salesadm.pdb_map_tbl (cname VARCHAR2(30) NOT NULL)
  PARTITION BY LIST (cname) (
    PARTITION amer_pdb VALUES ('US','MEXICO','CANADA'),
    PARTITION euro_pdb VALUES ('UK','FRANCE','GERMANY'),
    PARTITION asia_pdb VALUES ('INDIA','CHINA','JAPAN'));

-- Set the CONTAINER_MAP database property to the map object.
ALTER PLUGGABLE DATABASE SET CONTAINER_MAP='salesadm.pdb_map_tbl';

-- Enable the container map for the metadata-linked table to be queried.
ALTER TABLE oe.countries_mlt ENABLE CONTAINER_MAP;

-- Ensure that the table to be queried is enabled for the
-- CONTAINERS clause.
ALTER TABLE oe.countries_mlt ENABLE CONTAINERS_DEFAULT;

-- End the application installation.
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app END INSTALL '1.0';

주: 분할 구문을 사용하여 컨테이너 맵을 생성하더라도 데이터베이스는 분할 기능을 사용하지 않습니다. 컨테이너 맵을 정의할 때는 Oracle Partitioning이 필요하지 않습니다.

앞의 스크립트에서 ALTER TABLE oe.countries_mlt ENABLE CONTAINERS_DEFAULT 문은 응용 프로그램 루트에서 실행된 query 및 DML 문이 데이터베이스 객체에 대해 기본적으로 CONTAINERS() 절을 사용하도록 지정합니다.

예제 3-6 응용 프로그램 동기화 및 데이터 추가: 파트 2

이 예제는 이전 예제에서 계속됩니다. 응용 프로그램 루트에 연결된 상태에서 현재 컨테이너를 각 PDB로 차례로 전환하고 saas_sales_app 응용 프로그램을 동기화한 다음 PDB 관련 데이터를 oe.countries_mlt 테이블에 추가합니다.

ALTER SESSION SET CONTAINER=amer_pdb;
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app SYNC;
INSERT INTO oe.countries_mlt VALUES ('AMER','US');
INSERT INTO oe.countries_mlt VALUES ('AMER','MEXICO');
INSERT INTO oe.countries_mlt VALUES ('AMER','CANADA');
COMMIT;

ALTER SESSION SET CONTAINER=euro_pdb;
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app SYNC;
INSERT INTO oe.countries_mlt VALUES ('EURO','UK');
INSERT INTO oe.countries_mlt VALUES ('EURO','FRANCE');
INSERT INTO oe.countries_mlt VALUES ('EURO','GERMANY');
COMMIT;

ALTER SESSION SET CONTAINER=asia_pdb;
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app SYNC;
INSERT INTO oe.countries_mlt VALUES ('ASIA','INDIA');
INSERT INTO oe.countries_mlt VALUES ('ASIA','CHINA');
INSERT INTO oe.countries_mlt VALUES ('ASIA','JAPAN');
COMMIT;

예제 3-7 메타 데이터 링크 테이블 Query: 3부

이 예제는 이전 예제에서 계속됩니다. 응용 프로그램 루트에 연결한 다음 oe.countries_mlt를 여러 번 query하여 WHERE 절에 다른 국가를 지정합니다. 질의는 oe.countries_mlt.region 열에서 올바른 값을 반환합니다.

ALTER SESSION SET CONTAINER=saas_sales_ac;

SELECT region FROM oe.countries_mlt WHERE cname='MEXICO';

REGION
------
AMER

SELECT region FROM oe.countries_mlt WHERE cname='GERMANY';

REGION
------
EURO

SELECT region FROM oe.countries_mlt WHERE cname='JAPAN';

REGION
------
ASIA

컨테이너 간 작업

컨테이너 간 작업은 한 번에 여러 컨테이너에 영향을 주는 DDL 또는 DML 문입니다.

CDB 루트 또는 응용 프로그램 루트에 연결된 공통 사용자만 컨테이너 간 작업을 수행할 수 있습니다. 컨테이너 간 작업은 다음 사항에 영향을 줄 수 있습니다.

컨테이너 간 DDL 작업의 예로는 다른 공통 사용자에게 일반적으로 권한을 부여하는 사용자 SYSTEM 및 전체 CDB에 적용되는 ALTER DATABASE . . . RECOVER 문이 있습니다.

CDB 루트 또는 응용 프로그램 루트에 연결된 경우 단일 DML 문을 실행하여 컨테이너 내에 있는 여러 PDB의 테이블 또는 뷰를 수정할 수 있습니다. 데이터베이스는 DML 문에 지정된 CON_ID 열의 값에서 대상 PDB를 추론합니다. CON_ID가 지정되지 않은 경우 데이터베이스는 ALTER PLUGGABLE DATABASE CONTAINERS DEFAULT TARGET 문으로 지정된 CONTAINERS_DEFAULT_TARGET 속성을 사용합니다.

예제 3-8 단일 DML 문에서 다중 PDB 갱신

이 예제에서 목표는 country_name 열을 sh.sales 테이블의 USA 값으로 설정하는 것입니다. 이 테이블은 컨테이너 ID가 7 및 8인 두 개의 개별 PDB에 존재합니다. 두 PDB는 모두 saas_sales_ac이라는 애플리케이션 컨테이너에 있습니다. 응용 프로그램 루트에 관리자로 연결하고 다음과 같이 업데이트할 수 있습니다.

CONNECT sales_admin@saas_sales_ac
Password: *******

UPDATE CONTAINERS(sh.sales) sal
  SET sal.country_name = 'USA'
  WHERE sal.CON_ID IN (7,8);

앞의 UPDATE 문에서 sal는 CONTAINERS(sh.sales)의 별칭입니다.

참조: "공통 사용자 계정"