應用程式貨櫃

在 CDB 中,您可以為應用程式資料與描述資料建立容器,以供 PDB 共用。

關於應用程式容器

應用程式容器是一個選擇性且由使用者建立的 CDB 元件,可儲存一或多個應用程式後端的資料與描述資料。CDB 包含零個或多個應用程式容器。

在應用程式容器中,應用程式是儲存於應用程式根目錄中的具名通用資料和中繼資料集合。在應用程式容器的這個相關資訊環境中,「應用程式」一詞是指「主要應用程式定義」。例如,應用程式可能包含表格、檢視與薪資配套的定義。

例如,您可能會在某個應用程式容器內建立多個銷售相關 PDB,而這些 PDB 會共用一個由一組通用表格與表格定義組成的應用程式。您可能會將多個 HR 相關 PDB 儲存在個別的應用程式容器中,並擁有它們自己的通用表格與表格定義。

含有 AS APPLICATION CONTAINER 子句的 CREATE PLUGGABLE DATABASE 敘述句會建立應用程式容器的應用程式根目錄,因此隱含地建立應用程式容器本身。當您第一次建立應用程式容器時,它就不會包含任何 PDB。若要建立應用程式 PDB,您必須連線到應用程式 root,然後執行 CREATE PLUGGABLE DATABASE 敘述句。

在 CREATE PLUGGABLE DATABASE 陳述式中,您必須指定容器名稱 (與應用程式根目錄名稱相同),例如 saas_sales_ac。應用程式容器名稱在 CDB 中必須是唯一的,在透過特定監聽器到達其執行處理的所有 CDB 範圍之內。每個應用程式容器都有一個與應用程式容器相同名稱的預設服務。

應用程式容器的用途

在某些方面,應用程式容器會在 CDB 中以應用程式特定的 CDB 形式運作。應用程式容器 (例如 CDB 本身) 可以包含多個 PDB,並且讓這些 PDB 能夠共用描述資料與資料。

應用程式根目錄可讓應用程式 PDB 共用應用程式,在此相關資訊環境中代表一組具名的啟動多版本功能通用描述資料和資料。典型的應用程式會安裝應用程式通用使用者、描述資料連結通用物件以及資料連結通用物件。

應用程式容器的主要優點

相對於將每個應用程式儲存在個別的 PDB 中,應用程式容器具有數個優點。

應用程式容器使用案例:SaaS

SaaS 部署可以使用多個應用程式 PDB,每個 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 中定義對應至相關季別的每個交易。若要產生聚總一年效能的報表,您可以使用 CONTAINERS() 子句聚總這四個 PDB。

此邏輯倉儲設計的優點包括:

應用程式根目錄

應用程式容器只有一個應用程式根目錄,亦即容器中應用程式 PDB 的父項。

應用程式根目錄的特性會在建立時建立,而且無法變更。應用程式 root 所屬的唯一容器是 CDB 根。應用程式根目錄就像是某個 CDB 根,它會以其他方式像一個 PDB:

應用程式根目錄不同於 CDB 根與標準 PDB,因為它可以儲存 user-created 通用物件,這些物件稱為應用程式通用物件。應用程式通用物件可供插入應用程式根目錄的應用程式 PDB 存取。應用程式通用物件不屬於應用程式 root 的 CDB 根、其他應用程式根目錄或 PDB 可看到。

範例 3-1 建立應用程式根目錄

在此範例中,您將以管理通用使用者 c##system 的身分登入 CDB 根。您可以建立名為 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 都位於零或一個應用程式容器中。

例如,saas_sales_ac 應用程式容器可能支援多位客戶,每位客戶應用程式都會將其資料儲存在個別的 PDB 中。應用程式 PDB cust1_sales_pdb 和 cust2_sales_pdb 可能位於 saas_sales_ac 中,在此情況下,它們不屬於其他應用程式容器 (雖然它們必定也屬於 CDB 根)。

連線至應用程式根目錄時執行 CREATE PLUGGABLE DATABASE,以建立應用程式 PDB。您可以從原始內建值建立應用程式 PDB,或是複製 PDB 或插入已拔除的 PDB。與插入到 CDB 根目錄中的 PDB 一樣,您可以複製、拔除或刪除應用程式 PDB。不過,應用程式 PDB 必須一律屬於應用程式 root。

應用程式種子

應用程式原始內建值是應用程式容器中,由使用者建立的選擇性 PDB。應用程式容器為零或一個應用程式原始內建值。

應用程式原始內建值可讓您快速建立應用程式 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 表格。在此情況下,資料列會儲存在應用程式 root 的表格中一次,但可以在所有應用程式 PDB 中看到。

在描述資料連結通用物件中,應用程式 PDB 只會共用描述資料,但是會包含不同的資料集。例如,描述資料連結 products 表格在每個應用程式 PDB 中都具有相同的定義,但資料列本身是 PDB 特有的。名為 cust1pdb 的應用程式 PDB 可能有包含報表簿的 products 表格,而名為 cust2pdb 的應用程式 PDB 可能有包含自動零件的 products 表格。

關於 CDB 的通用性

CDB 或應用程式根目錄中定義的通用現象在所有插入到此 root 的容器中都是相同的。

通用原則

在 CDB 中,現象在系統容器 (CDB 本身) 內或特定應用程式容器內都是一樣常見的。

例如,如果您在連線到 CDB$ROOT 時建立一個通用使用者帳戶,則此使用者帳戶是 CDB 中所有 PDB 與應用程式根目錄通用的。不過,如果您在連線到應用程式 root 的同時建立應用程式通用使用者帳戶,則此使用者帳戶只對此應用程式容器中的 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 應用程式通用物件

物件類型 共用值 描述資料儲存 資料儲存
資料相關 DATA 應用程式的根目錄 應用程式的根目錄
延伸資料連結 EXTENDED DATA 應用程式的根目錄 應用程式根目錄和應用程式 PDB
中繼資料連結 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 會在 1.0 版安裝名為 saas_sales_app 的應用程式。此應用程式會建立名為 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 資料連結表格的資料連結。

延伸資料連結的應用程式物件

擴充資料連結物件是資料連結物件與描述資料連結物件的混合物件。

在擴充資料連結物件中,儲存在應用程式 root 中的資料是所有應用程式 PDB 通用的資料,而所有 PDB 都可以存取此資料。不過,每個應用程式 PDB 可以在共用應用程式 root 中的通用資料時,建立自己的 PDB 特定資料。因此,PDB 會使用自己的資料來補充通用資料。

例如,銷售應用程式可能支援數個應用程式 PDB。所有的應用程式 PDB 都需要美國的郵遞區號。在此情況下,您可以在應用程式根目錄中建立 zipcodes_edt 延伸資料連結表格。應用程式根目錄會儲存美國郵遞區號,因此所有應用程式 PDB 都可以存取。不過,一個應用程式 PDB 需要美國和加拿大的郵遞區號。此應用程式 PDB 可以將加拿大的郵遞區號儲存在應用程式 PDB 的擴充資料連結物件中,而非在應用程式 root 中。

連線至應用程式根目錄,並在 CREATE 敘述句中指定 SHARING=EXTENDED DATA 關鍵字,以建立延伸資料連結物件。

範例 3-4 建立擴充資料物件

在此範例中,SYSTEM 會連線至 saas_sales_ac 應用程式容器,然後將名為 saas_sales_app 的應用程式 (在「範例 3-2 」中建立) 從版本 2.0 升級至 3.0。此應用程式以通用使用者 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 的郵遞區號,但也可以將自己的郵遞區號插入此表格。

容器對應

容器對應可讓連線至應用程式 root 的階段作業根據 SQL 敘述句中使用的述詞值,發出遞送至適當 PDB 的 SQL 敘述句。

對應表格會指定描述資料連結之通用表格中的資料欄,並使用分割區將不同的應用程式 PDB 與不同的資料欄值建立關聯。透過此方式,容器對應可以在未實際在表格層次分割資料時,啟用 PDB 層次的資料分割。

使用容器對應的主要元件包括:

範例 3-5 建立描述資料連結表格、對應表格以及容器對應:第 1 部分

在此範例中,您以應用程式管理員身分登入應用程式根目錄。假設應用程式容器有三個應用程式 PDB:amer_pdb、euro_pdb 以及 asia_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 敘述句指定在應用程式根目錄中發出的查詢和 DML 敘述句,預設必須使用 CONTAINERS() 子句作為資料庫物件。

範例 3-6 同步應用程式及新增資料:第 2 部分

此範例會從上一個範例繼續。連線至應用程式 root 時,您可以依次將目前的容器切換至每個 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 查詢描述資料連結表格:第 3 部分

此範例會從上一個範例繼續。您可以連線至應用程式根目錄,然後多次查詢 oe.countries_mlt,在 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 值。此表格存在於兩個個別的 PDB 中,容器 ID 為 7 和 8。這兩個 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) 的別名。

另請參閱:「通用使用者帳戶」