應用程式貨櫃
在 CDB 中,您可以為應用程式資料與描述資料建立容器,以供 PDB 共用。
-
關於應用程式容器:應用程式容器是使用者建立的選擇性 CDB 元件,可儲存一或多個應用程式後端的資料和描述資料。CDB 包含零個或多個應用程式容器。
-
應用程式通用物件:應用程式通用物件是在應用程式根目錄中於應用程式內建立的通用物件。一般物件是資料連結物件或描述資料連結物件。
-
容器對應:容器對應可讓連線到應用程式根目錄的階段作業,根據 SQL 敘述句中使用的述詞值,發出路由到適當 PDB 的 SQL 敘述句。
-
跨容器作業:跨容器作業是 DDL 或 DML 敘述句,會一次影響多個容器。另請參閱:通用與本機物件以瞭解應用程式通用物件
關於應用程式容器
應用程式容器是一個選擇性且由使用者建立的 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 :應用程式 PDB 是位於應用程式容器中的 PDB。CDB 中的每個 PDB 都位於零或一個應用程式容器中。
-
應用程式原始內建值:應用程式原始內建值是應用程式容器內使用者建立的選擇性 PDB。應用程式容器為零或一個應用程式原始內建值。
應用程式容器的用途
在某些方面,應用程式容器會在 CDB 中以應用程式特定的 CDB 形式運作。應用程式容器 (例如 CDB 本身) 可以包含多個 PDB,並且讓這些 PDB 能夠共用描述資料與資料。
應用程式根目錄可讓應用程式 PDB 共用應用程式,在此相關資訊環境中代表一組具名的啟動多版本功能通用描述資料和資料。典型的應用程式會安裝應用程式通用使用者、描述資料連結通用物件以及資料連結通用物件。
-
應用程式容器的主要優點應用程式容器可為每個應用程式儲存在個別的 PDB 中提供數種優點。
-
應用程式容器使用案例:SaaS SaaS 部署可以使用多個應用程式 PDB,每個 PDB 適用於共用描述資料和資料的個別客戶。
-
應用程式容器使用案例:邏輯資料倉儲客戶可以使用多個應用程式 PDB 來處理資料主權問題。
應用程式容器的主要優點
相對於將每個應用程式儲存在個別的 PDB 中,應用程式容器具有數個優點。
-
應用程式根目錄會儲存所有應用程式 PDB 可共用的描述資料與資料。
例如,所有應用程式 PDB 都可以在中央表格中共用資料,例如列出的預設應用程式角色表格。此外,所有 PDB 也可以共用表格定義,以新增 PDB 特定的資料列。
-
您會在應用程式根目錄中維護主要應用程式定義,而不是在每個 PDB 中維護個別的複本。
如果您升級應用程式 root 中的應用程式,則變更會自動傳輸至所有應用程式 PDB。應用程式後端可能包含資料連結的通用物件
app_roles,這是列出預設角色的表格:admin、manager、sales_rep等等。連線至任何應用程式 PDB 的使用者可以查詢此表格。 -
應用程式容器可以包含應用程式原始內建值、應用程式 PDB 以及代理 PDB (參照其他 CDB 中的 PDB)。
-
您可以從應用程式原始內建值快速建立新應用程式 PDB。
-
您可以查詢報告應用程式容器中所有 PDB 的視觀表。
-
連線到應用程式 root 時,您可以使用
CONTAINERS函數來對多個 PDB 中的物件執行 DML。例如,如果每個應用程式 PDB 中都有
products表格,您就可以連線到應用程式根目錄,並使用單一SELECT敘述句查詢所有應用程式 PDB 中的產品。 -
您可以將 PDB 從應用程式 root 拔除,然後再將它插入到較新 Oracle 資料庫版本的應用程式 root 中。因此,PDB 可用於 Oracle 資料庫升級。
應用程式容器使用案例:SaaS
SaaS 部署可以使用多個應用程式 PDB,每個 PDB 適用於共用描述資料和資料的個別客戶。
在純 SaaS 環境中,主要應用程式定義位於應用程式根目錄中,但客戶特定的資料則位於其本身的應用程式 PDB 中。例如,sales_app 是應用程式根目錄中的應用程式模型。名稱為 cust1_pdb 的應用程式 PDB 只包含客戶 1 的銷售資料,而名為 cust2_pdb 的應用程式 PDB 只包含客戶 2 的銷售資料。插入、拔除、複製及其他 PDB 層次作業適用於個別的客戶 PDB。
圖 1:SaaS 使用案例

純 SaaS 組態提供下列優點:
-
效能
-
安全性
-
支援多位客戶
每個客戶的資料都位於容器中,但已經過合併,因此您可以一起管理多個客戶。此模型將管理規模的經濟延伸至應用程式管理員,而非只有 DBA。
應用程式容器使用案例:邏輯資料倉儲
客戶可以使用多個應用程式 PDB 來解決資料主權問題。
在範例使用案例中,公司將每個財務季別的特定資料放入個別的 PDB 中。例如,名為 sales_ac 的應用程式容器包含 q1_2016_pdb、q2_2016_pdb、q3_2016_pdb 和 q4_2016_pdb。您需要在 PDB 中定義對應至相關季別的每個交易。若要產生聚總一年效能的報表,您可以使用 CONTAINERS() 子句聚總這四個 PDB。
此邏輯倉儲設計的優點包括:
-
針對單一 PDB 特定的資料進行 ETL 不影響其他 PDB。
-
執行計畫以實際資料分配為基礎,因此更有效率。
應用程式根目錄
應用程式容器只有一個應用程式根目錄,亦即容器中應用程式 PDB 的父項。
應用程式根目錄的特性會在建立時建立,而且無法變更。應用程式 root 所屬的唯一容器是 CDB 根。應用程式根目錄就像是某個 CDB 根,它會以其他方式像一個 PDB:
-
就像 CDB 根一樣,應用程式根目錄也是插入該 CDB 之 PDB 的父項容器。連線到應用程式 root 時,您可以管理通用使用者與權限、建立應用程式 PDB、切換容器,以及發出適用於應用程式容器中所有 PDB 的 DDL。
-
就像 PDB 一樣,您可以使用
CREATE PLUGGABLE DATABASE敘述句建立應用程式根目錄、使用ALTER PLUGGABLE DATABASE更改應用程式根目錄,以及使用STARTUP和SHUTDOWN變更其可用性。您可以使用 DDL 來插入、拔除及刪除應用程式根目錄。應用程式 root 具有自己的服務名稱,使用者可以使用與連線到 PDB 相同的方式連線到應用程式 root。
應用程式根目錄不同於 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 或應用程式根目錄中定義的通用現象在所有插入到此根目錄的容器中都是相同的。
-
建立應用程式一般物件:若要建立一般物件,請連線至應用程式根目錄,然後執行指定共用屬性的
CREATE敘述句。 -
描述資料連結應用程式通用物件:描述資料連結是一個說明物件,支援參照應用程式容器中所有 PDB 共用的通用描述資料以及授與權限。
-
資料連結的應用程式一般物件:資料連結物件是其描述資料和資料位於應用程式根目錄中的物件,可以從此應用程式容器中的所有應用程式 PDB 存取。
-
擴充資料連結應用程式物件:擴充資料連結物件是資料連結物件和描述資料連結物件的混合物件。另請參閱:「通用與本機物件」以瞭解通用物件
關於 CDB 的通用性
CDB 或應用程式根目錄中定義的通用現象在所有插入到此 root 的容器中都是相同的。
-
通用原則在 CDB 中,現象在系統容器 (CDB 本身) 或特定應用程式容器中都很常見。
-
CDB 中的命名空間 在 CDB 中,每個物件的命名空間都會計入其容器。
通用原則
在 CDB 中,現象在系統容器 (CDB 本身) 內或特定應用程式容器內都是一樣常見的。
例如,如果您在連線到 CDB$ROOT 時建立一個通用使用者帳戶,則此使用者帳戶是 CDB 中所有 PDB 與應用程式根目錄通用的。不過,如果您在連線到應用程式 root 的同時建立應用程式通用使用者帳戶,則此使用者帳戶只對此應用程式容器中的 PDB 通用。
在 CDB$ROOT 或應用程式根目錄的相關資訊環境中,通用原則如下:
-
常見的現象在每個現有和未來的容器中都相同。
因此,在 CDB 根中定義的通用使用者在插入到 CDB 根的每個 PDB 中都有相同的識別;在應用程式根目錄中定義的通用使用者在插入到此應用程式根目錄的每個應用程式 PDB 中都有相同的識別。相反地,區域現象的範圍僅限於一個現有的容器。
-
只有通用使用者可以更改通用現象的存在。
更精確地說,只有登入 CDB root 或應用程式 root 的通用使用者可以建立、損毀或修改目前容器中通用的使用者、角色或物件屬性。
CDB 中的命名空間
在 CDB 中,每個物件的命名空間會作用領域到其容器。
下列原則總結列出範圍規則:
-
從應用程式角度來看,PDB 是獨立於其他 PDB 的資料庫。
-
本機現象是在單一容器內建立,並限制在單一容器內。
備註:在本主題中,「現象」一詞表示「使用者帳戶、角色或資料庫物件」。
-
通用現象定義在 CDB 根或應用程式根目錄中,且存在於已經或將要插入到此 root 的所有 PDB 中。
前述原則對地方及常見的現象有影響。
本地現象
當地現象必須是容器內的唯一名稱,但不能跨越 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 根中建立通用使用者。
應用程式一般現象
在應用程式容器內,本機和應用程式通用現象的名稱不能衝突。
-
應用程式一般使用者與角色
應用程式通用使用者與 CDB 通用使用者一樣,也有相同的原則。不同之處在於,對於 CDB 通用使用者,通用使用者前置碼的預設值是
c##或C##,而在應用程式根目錄中,通用使用者前置碼的預設值是空字串。多雲端用戶架構假設您是從應用程式 root 建立應用程式 PDB,或將單一用戶應用程式轉換成多用戶應用程式。
-
應用程式一般物件
多雲端用戶架構假設您是在應用程式根目錄中建立應用程式通用物件。之後,您將在應用程式 PDB 內本機新增資料。不過,Oracle AI Database 支援在應用程式 PDB 中建立本機表格。在此情況下,本機表格與應用程式 PDB 內的應用程式通用物件位於相同的命名空間。
另請參閱:Oracle AI Database Security Guide 以深入瞭解一般使用者和角色
建立應用程式通用物件
若要建立一般物件,請連線至應用程式根目錄,然後執行指定共用屬性的 CREATE 敘述句。
您只能在應用程式安裝、升級或修補時建立或變更應用程式通用物件。您可以使用下列方式指定共用:
-
DEFAULT_SHARING初始化參數此設定是根目錄中所建立支援類型之所有資料庫物件的預設共用屬性。
-
SHARING子句您可以在
CREATE敘述句本身中指定此子句。當 SQL 陳述式中包含SHARING子句時,其優先順序高於DEFAULT_SHARING初始化參數中指定的值。可能的值為METADATA、DATA、EXTENDED DATA和NONE。
下表顯示應用程式通用物件類型,以及資料與中繼資料的儲存位置。
表格 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 層次的資料分割。
使用容器對應的主要元件包括:
-
描述資料連結表格
此表格是用來使用容器對應來查詢。例如,您可以建立一個名為
countries_mlt的描述資料連結表格,將不同資料儲存在每個應用程式 PDB 中。在amer_pdb中,countries_mlt.cname資料欄會儲存北美國家名稱;在euro_pdb中,countries_mlt.cname資料欄會儲存歐洲國家名稱;而在asia_pdb中,countries_mlt.cname資料欄會儲存亞洲國家名稱。 -
對應表
在應用程式根目錄中,您可以建立依清單、雜湊或範圍分割的單一資料欄對應表格。對應表格可以使用容器對應啟用的分割策略來查詢描述資料連結表格。對應物件表格中的分割區名稱,必須與應用程式容器中應用程式 PDB 的名稱相符。
例如,名為
pdb_map_tbl的對應表格可以依cname資料欄上的清單來分割。名為amer_pdb、euro_pdb和asia_pdb的分割區對應到應用程式 PDB 的名稱。每個分割區中的值都是國家的名稱,例如PARTITION amer_pdb VALUES ('US','MEXICO','CANADA')。從 Oracle Database 18c 開始,對於使用對應的
CONTAINERS()查詢,對應表格中的分割資料欄不需要與描述資料連結表格中的資料欄相符。假設容器對應pdb_map_tbl已啟用表格sh.sales,而cname是對應表格的分割資料欄。雖然sh.sales不包含cname資料欄,但是對應表格會將下列查詢遞送至適當的 PDB:SELECT * FROM CONTAINERS(sh.sales) WHERE cname = 'US' ORDER BY time_id。 -
容器對應
容器對應是指定對應表格的資料庫特性。若要設定特性,請連線至應用程式根目錄,然後執行
ALTER PLUGGABLE DATABASE SET CONTAINER_MAP=map_table敘述句,其中map_table是對應表格的名稱。
範例 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 根或應用程式根的通用使用者可以執行跨容器作業。跨容器作業會影響:
-
CDB 本身
-
一個 CDB 內的多個容器
-
多個現象,例如在多個容器中呈現的通用使用者或通用角色
-
目前未連線發出 DDL 或 DML 敘述句之使用者的容器
跨容器 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) 的別名。
另請參閱:「通用使用者帳戶」