【跟我学oracle18c】第十八天:Multitenant Architecture:2.3 Overview of Applications in an Application Container

2.3 Overview of Applications in an Application Container

在应用程序容器中,应用程序是存储在应用程序root中的命名的、版本化的公共数据和元数据集.

在应用程序容器的上下文中,术语“应用程序”指的是“主应用程序定义”。例如,应用程序可能包括表、视图和包的定义.

This section contains the following topics:

  • About Application Containers
    An application container is an optional, user-created CDB component that stores data and metadata for one or more application back ends. A CDB includes zero or more application containers.
  • Application Common Objects
    An application common object is a common object created within an application in an application root. Common objects are either data-linked or metadata-linked.
  • Application Maintenance
    In this context, application maintenance refers to installing, uninstalling, upgrading, or patching an application.
  • Migration of an Existing Application
    You can migrate an application that is installed in a PDB to either an application root or to an application PDB.
  • Implicitly Created Applications
    In addition to user-created applications, application containers can also contain implicitly created applications.
  • Application Synchronization
    Within an application PDB, synchronization is the user-initiated update of the application to the latest version and patch in the application root.
  • Container Maps
    container map enables a session connected to application root to issue SQL statements that are routed to the appropriate PDB, depending on the value of a predicate used in the SQL statement.

See Also:

Parent topic: Overview of the Multitenant Architecture

2.3.1 About Application Containers

应用程序容器是一个可选的、用户创建的CDB组件,用于为一个或多个应用程序后端存储数据和元数据。一个CDB包含零个或多个应用程序容器.

例如,您可以在一个应用程序容器中创建多个与销售相关的PDBs,这些PDBs共享由一组公共表和表定义组成的应用程序后端。您可以在一个单独的应用程序容器中存储多个与hr相关的PDBs,并使用它们自己的公共表和表定义.

带有AS APPLICATION container子句的CREATE PLUGGABLE数据库语句创建应用程序容器的应用程序根,从而隐式地创建应用程序容器本身。当您第一次创建应用程序容器时,它不包含PDBs。要创建应用程序PDBs,必须连接到应用程序根,然后执行create PLUGGABLE数据库语句.

在CREATE PLUGGABLE DATABASE语句中,必须指定容器名(与应用程序根名称相同),例如saas_sales_ac。应用程序容器名称必须在CDB内是唯一的,并且在所有CDBs的范围内,这些CDBs的实例是通过特定的侦听器到达的。每个应用程序容器都有一个与应用程序容器同名的默认服务.

  • Purpose of Application Containers
    In some ways, an application container functions as an application-specific CDB within a CDB. An application container, like the CDB itself, can include multiple PDBs, and enables these PDBs to share metadata and data.
  • Application Root
    An application container has exactly one application root, which is the parent of the application PDBs in the container.
  • Application PDBs
    An application PDB is a PDB that resides in an application container. Every PDB in a CDB resides in either zero or one application containers.
  • Application Seed
    An application seed is an optional, user-created PDB within an application container. An application container has either zero or one application seed.

See Also:

Parent topic: Overview of Applications in an Application Container

2.3.1.1 Purpose of Application Containers

在某种程度上,应用程序容器在CDB中充当特定于应用程序的CDB。一个应用程序容器,像CDB本身一样,可以包含多个PDBs,并允许这些PDBs共享元数据和数据.

应用程序根允许应用程序PDBs共享应用程序,在此上下文中,这意味着一组命名的、版本化的公共元数据和数据。典型的应用程序安装应用程序公共用户、元数据链接公共对象和数据链接公共对象.

This section contains the following topics:

Parent topic: About Application Containers

2.3.1.1.1 核心利益of Application Containers

与将每个应用程序存储在单独的PDB中相比,应用程序容器提供了一些好处.

  • 应用程序根存储所有应用程序PDBs可以共享的元数据和数据.

    例如,所有应用程序PDBs都可以在中心表中共享数据,例如列出默认应用程序角色的表。此外,所有PDBs都可以共享一个表定义,并向其添加特定于pdb的行.

  • 在应用程序根中维护主应用程序定义,而不是在每个PDB中维护单独的副本.

    如果您在应用程序根目录中升级应用程序,那么更改将自动传播到所有应用程序PDBs。应用程序后端可能包含数据链接的公共对象app_roles,这是一个表,列出默认角色:admin、manager、sales_rep等等。连接到任何应用程序PDB的用户都可以查询这个表.

  • 应用程序容器可以包括应用程序种子、应用程序PDBs和代理PDBs(在其他CDBs中引用PDBs)。

  • 您可以从应用程序种子快速创建新的应用程序PDBs。

  • 您可以查询报告应用程序容器中所有PDBs的视图。

  • 在连接到应用程序根目录时,可以使用容器函数对多个PDBs中的对象执行DML。
    例如,如果products表存在于每个应用程序PDB中,那么您可以使用一个SELECTstatement连接到应用程序根并查询所有应用程序PDBs中的产品。

  • 您可以从应用程序根目录下拔下PDB,然后在更高的Oracle数据库版本中将其插入到应用程序根目录中。因此,PDBs在Oracle数据库升级中非常有用。

See Also:

"Overview of Applications in an Application Container"

Parent topic: Purpose of Application Containers

2.3.1.1.2 Application Container使用案例: SaaS

SaaS部署可以使用多个应用程序PDBs,每个PDBs用于单独的客户,共享元数据和数据。

在纯SaaS环境中,主应用程序定义驻留在应用程序根中,而特定于客户的数据驻留在其自己的应用程序PDB中。例如,sales_app是应用程序根目录中的应用程序模型。名为cust1_pdb的应用程序只包含客户1的销售数据,而名为cust2_pdb的应用程序只包含客户2的销售数据。对于单个客户PDBs,可以进行插入、断开、克隆和其他pdb级操作。

Figure 2-8 Saas Use Case

Description of Figure 2-8 follows
Description of "Figure 2-8 Saas Use Case"

纯SaaS配置提供了以下好处:

  • 性能
  • 安全
  • 支持多个客户

    每个客户的数据驻留在其自己的容器中,但经过整合后,您可以集体管理许多客户。该模型将管理多个as one的规模经济扩展到应用程序管理员,而不仅仅是DBA。

Parent topic: Purpose of Application Containers

2.3.1.1.3 Application Containers 使用案例: 逻辑数据仓库

客户可以使用多个应用程序PDBs来解决数据主权问题。
在一个示例用例中,公司将特定于每个财务季度的数据放在一个单独的PDB中。例如,名为sales_ac的应用程序容器包括q1_2016_pdb、q2_2016_pdb、q3_2016_pdb和q4_2016_pdb。在对应于相关季度的PDB中定义每个事务。要生成汇总一年性能的报告,可以使用container()子句在四个PDBs之间进行汇总。

这种逻辑仓库设计的好处包括:

  • 特定于单个PDB的数据的ETL不会影响其他PDBs。

  • 执行计划更高效,因为它们基于实际的数据分布。

Parent topic: Purpose of Application Containers

2.3.1.2 Application Root

应用程序容器只有一个应用程序根,它是容器中应用程序PDBs的父类。
作为应用程序根的属性是在创建时建立的,不能更改。应用程序根属于的唯一容器是CDB根。应用程序根在某些方面类似于CDB根,在其他方面类似于PDB:

  • 与CDB根一样,应用程序根充当插入其中的PDBs的父容器。当连接到应用程序根目录时,您可以管理普通用户和特权,创建应用程序PDBs,切换容器,并发出应用于应用程序容器中的所有PDBs的DDL

  • 与PDB类似,您可以使用create PLUGGABLE数据库语句创建应用程序根,使用alter PLUGGABLE数据库更改它,并通过启动和关闭更改其可用性。可以使用DDL插入、拔掉和删除应用程序根。应用程序根有自己的服务名称,用户可以像连接PDB一样连接到应用程序根。

应用程序根不同于CDB根和标准PDB,因为它可以存储用户创建的公共对象,这些公共对象称为应用程序公共对象。插入到应用程序根目录的应用程序PDBs可以访问应用程序公共对象。对于不属于应用程序根的CDB根、其他应用程序根或PDBs,应用程序公共对象是不可见的。

See Also:

Example 2-7 Creating an Application Root

在本例中,您以管理公共用户c##系统的身份登录到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

Parent topic: About Application Containers

2.3.1.3 Application PDBs

应用程序PDB是驻留在应用程序容器中的PDB。CDB中的每个PDB都驻留在零个或一个应用程序容器中。
例如,saas_sales_ac应用程序容器可能支持多个客户,每个客户应用程序将其数据存储在单独的PDB中。应用程序PDBs cust1_sales_pdb和cust2_sales_pdb可能驻留在saas_sales_ac中,在这种情况下,它们不属于其他应用程序容器(尽管作为PDBs,它们也必须属于CDB根)。

通过在连接到应用程序根目录时执行Create PLUGGABLE数据库来创建应用程序PDB。您可以从种子创建应用程序PDB,或者克隆PDB,或者插入一个未插入的PDB。就像插入到CDB根目录中的PDB一样,您可以克隆、拔掉或删除应用程序PDB。然而,应用程序PDB必须始终属于应用程序根。

See Also:

"Creating and Removing Application Containers and Seeds"

Parent topic: About Application Containers

2.3.1.4 Application Seed

应用程序种子是应用程序容器中用户创建的可选PDB。一个应用程序容器有0个或1个应用程序种子。

应用程序种子使您能够快速创建应用程序PDBs。它在应用程序容器中的作用与PDB$SEED在CDB本身中的作用相同。

应用程序种子名总是application_container_name$ seed,其中application_container_name是应用程序容器的名称。例如,使用CREATE PDB…作为种子语句在saas_sales_ac应用程序容器中创建saas_sales_ac$SEED。

See Also:

"Creating and Removing Application Seeds"

Parent topic: About Application Containers

2.3.2 Application Common Objects

应用程序公共对象是在应用程序根中的应用程序内创建的公共对象。公共对象可以是数据链接的,也可以是元数据链接的。

对于数据链接的公共对象,应用程序PDBs共享一组数据。例如,saas_sales_ac应用程序容器的应用程序名为saas_sales_app,拥有1.0版本,并包含一个数据链接的usa_zipcodes表。在本例中,行存储在应用程序根目录中的表中,但是在所有应用程序PDBs中都是可见的。

对于元数据链接的公共对象,应用程序PDBs只共享元数据,但包含不同的数据集。例如,元数据链接产品表在每个应用程序PDB中都有相同的定义,但是行本身是特定于PDB的。名为cust1pdb的应用程序可能有一个包含书籍的产品表,而名为cust2pdb的应用程序可能有一个包含汽车零件的产品表。

This section contains the following topics:

See Also:

Parent topic: Overview of Applications in an Application Container

2.3.2.1 Creation of Application Common Objects

要创建公共对象,请连接到应用程序根,然后执行一个create语句,该语句指定一个共享属性。

您只能作为应用程序安装、升级或补丁的一部分创建或更改应用程序公共对象。您可以通过以下方式指定共享:

  • DEFAULT_SHARING初始化参数

    该设置是根中创建的受支持类型的所有数据库对象的默认共享属性。

  • SHARING clause

    在CREATE语句本身中指定这个子句。当在SQL语句中包含共享子句时,它优先于default_sharinginitial参数中指定的值。可能的值是元数据、数据、扩展数据,没有。

The following table shows the types of application common objects, and where the data and metadata is stored.

Table 2-7 Application Common Objects

Object Type SHARING Value Metadata Storage Data Storage
Data-Linked DATA Application root Application root
Extended Data-Linked EXTENDED DATA Application root Application root and application PDB
Metadata-Linked METADATA Application root Application PDB

See Also:

Parent topic: Application Common Objects

2.3.2.2 Metadata-Linked Application Common Objects

元数据链接是一个dictionary对象,它支持引用和授予应用程序容器中所有PDBs共享的公共元数据的特权。
在SHARING子句或default_sharinginitialize参数中指定元数据值,指定到对象元数据的链接,称为元数据链接公共对象。对象的元数据在应用程序根中存储一次。

表、视图和代码对象(例如PL/SQL过程)可以共享元数据。在此上下文中,“元数据”包括列定义、约束、触发器和代码。例如,如果sales_mlt是一个元数据链接的公共表,那么所有应用程序PDBs都通过元数据链接访问这个表的相同定义,该定义存储在应用程序根目录中。sales_mlt中的行在每个应用程序PDB中都是不同的,但是列定义是相同的。

通常,应用程序中的大多数对象都是元数据链接的。因此,您只需要维护一个主应用程序定义。这种方法将应用程序的管理集中在多个应用程序PDBs中。

Example 2-8 Creating a Metadata-Linked Common Object

在本例中,system用户登录到saas_sales_ac应用程序容器。在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数据库应用程序…同步语句,以同步应用程序PDBs,以使用相同的主应用程序定义。这样,每个应用程序PDB都有一个到saas_sales_adm的元数据链接。sales_mlt常见的表。在名为cust1_pdb的PDB中更新sales_mlt的中间层代码在cust1_pdb中向这个表添加行,而在cust2_pdb中更新sales_mlt的中间层代码在cust2_pdb中向这个表的副本添加行。只有存储在应用程序根目录中的表元数据是共享的。

执行报错啊:ORA-65021: SHARING 子句的使用非法,ORA-65295: 服务名称或模块名称不匹配?

我是这么处理的:

ORA-65021: SHARING 子句的使用非法

检查了默认的初始化参数show parameter DEFAULT_SHARING=metadata  报错那就不加了,可以过去

ORA-65295: 服务名称或模块名称不匹配(在END INSTALL '1.0'时出现)

在执行这个语句之前切换到system/@saas_sales_ac 下即可,这个应该是oracle18c文档一处bug,要么就是人家执行环境与我不一样,大家遇到注意一下

但是下面的Example 2-11 完全正常

Note:

  • Metadata Links
    For metadata-linked application common objects, the metadata for the object is stored once in the application root. A metadata link is a dictionary object whose object type is the same as the metadata it is sharing.

Parent topic: Application Common Objects

2.3.2.2.1 Metadata Links

对于元数据链接的应用程序公共对象,对象的元数据在应用程序根中存储一次。元数据链接是一个字典对象,其对象类型与其共享的元数据相同。
元数据链接的描述存储在创建它的PDB的数据字典中。元数据链接必须由应用程序公共用户拥有。您只能使用元数据链接在CDB根或应用程序根中共享其创建者拥有的公共对象的元数据。

与数据链接不同,元数据链接仅依赖于公共数据。例如,如果应用程序在应用程序根目录中包含本地表dow_close_lt和nasdaq_close_lt,那么普通用户就不能创建到这些对象的元数据链接。但是,名为sales_mlt的应用程序公共表可能是元数据链接的。

例如,如果有特权的普通用户更改sales_mlt的元数据,则向表中添加一列,然后将此更改传播到元数据链接。应用程序PDB用户可能不会更改元数据链接中的元数据。例如,管理名为cust1_pdb的应用程序PDB的DBA不能仅在此PDB中向sales_mlt添加列:这种元数据更改只能在应用程序根中进行

See Also:

"About Application Common Objects"

Parent topic: Metadata-Linked Application Common Objects

2.3.2.3 Data-Linked Application Common Objects

数据链接对象是一个对象,其元数据和数据驻留在应用程序根中,可以从这个应用程序容器中的所有应用程序PDBs访问。
在SHARING子句或DEFAULT_SHARING初始化参数中指定到一个公共对象(称为数据链接公共对象)的链接。数据仓库中的维度表通常是数据链接公共表的理想选择。

数据链接是一个字典对象,其功能很像同义词。例如,如果国家是一个应用程序公共表,那么所有应用程序PDBs都通过数据链接访问这个表的相同副本。如果将一行添加到这个表中,那么这一行在所有应用程序PDBs中都是可见的。

数据链接必须由应用程序公共用户拥有。链接从它指向的对象继承对象类型。数据链接的描述存储在创建数据链接的PDB字典中。例如,如果一个应用程序容器包含10个应用程序PDBs,如果每个PDB包含一个到country应用程序公共表的链接,那么所有10个PDBs都包含此链接的字典定义。

Example 2-9 Creating a Data-Linked Object

在本例中,system连接到saas_sales_ac应用程序容器。系统将名为saas_sales_app的应用程序从1.0版本升级到2.0版本。这个应用程序升级以公共用户saas_sales_adm的身份登录到容器中,创建一个名为countryes_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 将应用程序PDBs与应用程序根同步(请参阅“应用程序同步”)。这样,每个同步应用程序PDB都有一个到saas_sales_adm的数据链接。countries_dlt数据表。

Note:

"About Application Common Objects"

Parent topic: Application Common Objects

2.3.2.4 Extended Data-Linked Application Objects

扩展数据链接对象是数据链接对象和元数据链接对象的混合。
在扩展的数据链接对象中,存储在应用程序根中的数据对于所有应用程序PDBs是通用的,所有PDBs都可以访问该数据。但是,每个应用程序PDB都可以创建自己的特定于PDB的数据,同时在应用程序根中共享公共数据。因此,PDBs用自己的数据补充了公共数据。

例如,销售应用程序可能支持多个应用程序PDBs。所有的应用程序PDBs都需要美国的邮政编码。在这种情况下,可以在应用程序根目录中创建zipcodes_edt扩展数据链接表。应用程序根存储美国邮政编码,因此所有应用程序PDBs都可以访问它们。然而,一个应用程序PDB需要美国和加拿大的邮政编码。这个应用程序PDB可以将加拿大的邮政编码存储在应用程序PDB中的扩展数据链接对象中,而不是存储在应用程序根中。

通过连接到应用程序根并在Create语句中指定SHARING= extended DATA关键字,创建一个扩展数据链接对象。

Example 2-10 Creating an Extended-Data Object

在本例中,system连接到saas_sales_ac应用程序容器,然后将名为saas_sales_app(在“示例2-8”中创建)的应用程序从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';

Use the ALTER PLUGGABLE DATABASE APPLICATION ... SYNC 语句将应用程序PDBs与应用程序同步(请参阅“应用程序同步”)。这样,每个同步应用程序PDB都有一个到saas_sales_adm的数据链接。zipcodes_edt数据表。连接到这些PDBs的应用程序可以看到在应用程序升级期间插入到zipcodes_edt中的zip代码,但也可以将它们自己的zip代码插入到这个表中。

Note:

"About Application Common Objects"

Parent topic: Application Common Objects

2.3.3 

  • 应用维护

在这种情况下,应用程序维护是指安装、卸载、升级或修补应用程序。
应用程序必须有名称和版本号。属性的组合决定了您可以执行哪些维护操作。在所有维护操作中,执行以下步骤:

  1. 首先执行ALTER PLUGGABLE DATABASE ... APPLICATION statement with the BEGIN INSTALLBEGIN UPGRADE, or BEGIN PATCH clauses.

  2. 执行语句以修改应用程序.

  3. 结束通过执行the ALTER PLUGGABLE DATABASE ... APPLICATION statement with the END INSTALLEND UPGRADE, or END PATCH clauses.

随着应用程序的发展,应用程序容器维护所有版本和补丁更改。

This section contains the following topics:

Note:

"About Managing Applications in an Application Container"

  • About Application Maintenance
    Perform application installation, upgrade, and patching operations using an ALTER PLUGGABLE DATABASE APPLICATION statement.
  • Application Installation
    An application installation is the initial creation of a master application definition. A typical installation creates user accounts, tables, and PL/SQL packages.
  • Application Upgrade
    An application upgrade is a major change to an installed application.
  • Application Patch
    An application patch is a minor change to an application.

Parent topic: Overview of Applications in an Application Container

2.3.3.1 关于应用程序维护

使用ALTER PLUGGABLE数据库应用程序语句执行应用程序安装、升级和补丁操作。
应用程序维护的基本步骤如下:

  1. 登录到应用程序根目录。

  2. Begin the operation with an ALTER PLUGGABLE DATABASE APPLICATION ... BEGIN statement in the application root.

  3. Execute the application maintenance statements.

  4. End the operation with an ALTER PLUGGABLE DATABASE APPLICATION ... ENDstatement.

Perform the maintenance using scripts, SQL statements, or GUI tools.

See Also:

"About Managing Applications in an Application Container"

Parent topic: Application Maintenance

2.3.3.2 Application Installation

应用程序安装是主应用程序定义的初始创建。典型的安装创建用户帐户、表和PL/SQL包。

To install the application, specify the following in the ALTER PLUGGABLE DATABASE APPLICATION statement:

  • Name of the application

  • Application version number

Example 2-11 Installing an Application

这个示例假设您已登录到名为saas_sales_acas的应用程序容器。这个示例在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 application
CREATE USER saas_sales_adm IDENTIFIED BY manager CONTAINER=ALL;

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

-- Make 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/manager@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';

PDB同步是用户发起的应用程序PDB与应用程序根目录中的应用程序的更新。在将应用程序PDBs与saas_sales_app应用程序同步之后,每个应用程序PDB将包含一个名为products_mlt的空表。应用程序可以连接到应用程序PDB,然后将特定于PDB的行插入到该表中。

See Also:

Parent topic: Application Maintenance

2.3.3.3 Application Upgrade

应用程序升级是对已安装应用程序的重大更改。
通常,升级会改变应用程序的物理体系结构。例如,升级可能会添加新的用户帐户、表和包,或者更改现有对象的定义。

To upgrade the application, you must specify the following in the ALTER PLUGGABLE DATABASE APPLICATION statement:

  • Name of the application

  • Old application version number

  • New application version number

Example 2-12 Upgrading an Application Using the Automated Technique

在本例中,您作为管理员连接到应用程序根,然后将应用程序saas_sales_app从1.0版本升级到2.0版本。这个升级创建了一个数据链接表,名为countryes_dlt,然后向它添加行。它还创建一个名为zipcodes_edt的扩展数据链接表,然后向其添加行。

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

-- Connect as app owner to app 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');

-- Create an extended data-linked 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 '2.0';

This section contains the following topics:

See Also:

"Upgrading Applications in an Application Container"

Parent topic: Application Maintenance

2.3.3.3.1 How an Application Upgrade Works

在应用程序升级期间,应用程序仍然可用。为了使这种可用性成为可能,Oracle数据库克隆应用程序根。
下图概述了应用程序升级过程。

Figure 2-9 Application Upgrade

Description of Figure 2-9 follows
Description of "Figure 2-9 Application Upgrade"

升级过程如下所示:

  1. 在初始状态下,应用程序根在特定版本中有一个应用程序。

  2. The user executes the ALTER PLUGGABLE DATABASE APPLICATION BEGIN UPGRADE statement, and then issues the application upgrade statements.

    在升级期间,数据库会自动执行以下操作:

    • 克隆应用程序根

      For example, if the saas_sales_app application is at version 1.0 in the application root, then the clone is also at version 1.0

    • Points the application PDBs to the application root clone

      The clone is in read-only mode. The application remains available to the application PDBs.

  3. The user executes the ALTER PLUGGABLE DATABASE APPLICATION END UPGRADEstatement.

    在这个阶段,应用程序PDBs仍然指向应用程序根克隆,而原来的应用程序根仍然指向一个新版本。例如,如果saas_sales_app应用程序在应用程序根目录中处于1.0版本,那么升级可能会将其带到2.0版本。然而,应用程序根克隆仍然是1.0版本。

  4. Optionally, the user synchronizes the application PDBs with the upgraded application root by issuing ALTER PLUGGABLE DATABASE APPLICATION statement with the SYNC clause.

    例如,在同步之后,一些应用程序PDBs被插入到2.0版本的应用程序根目录中。但是,应用程序根克隆继续支持必须保持在1.0版本上的应用程序PDBs,或任何在1.0版本时插入到应用程序根上的新应用程序PDBs。

See Also:

Parent topic: Application Upgrade

2.3.3.3.2 Applications at Different Versions

不同的应用程序PDBs可能使用不同版本的应用程序。
例如,一个应用程序PDB可能拥有saas_sales_app的1.0版本。在同一个应用程序容器中,另一个应用程序PDB拥有这个应用程序的2.0版本。
用例是提供给不同客户的SaaS应用程序。如果每个客户都有自己的应用程序PDB,那么一些客户可能会等待更长的时间来升级应用程序。在这种情况下,一些应用程序PDBs可能使用应用程序的最新版本,而其他应用程序PDBs使用的是旧版本。

See Also:

"Upgrading Applications in an Application Container" to learn more about applications at different versions

Parent topic: Application Upgrade

2.3.3.4 Application Patch

应用程序补丁是对应用程序的微小更改。
应用程序补丁的典型例子包括错误修复和安全补丁。新的功能和包被允许在一个补丁。

一般来说,破坏性操作是不允许的。例如,一个补丁不能包含dropstatement,或ALTER TABLE语句(删除列或更改数据类型)。

正如Oracle数据库补丁程序限制Oracle数据库补丁程序允许的操作种类一样,应用程序补丁程序也限制应用程序补丁程序允许的操作。如果一个修复程序包含一个引发“应用程序补丁中不支持的操作”错误的操作,那么执行一个应用程序升级。

Note:

当另一个应用程序补丁或升级正在进行时,您不能对应用程序进行补丁。
要对应用程序进行补丁,请在ALTER PLUGGABLE DATABASE application语句中指定应用程序名称和补丁号。您可以选择指定应用程序的最小版本。
示例2-13使用自动技术对应用程序进行修补

在本例中,system登录到应用程序根目录,然后在1.0或更高版本上对应用程序saas_sales_app进行补丁。补丁101以saas_sales_adm的身份登录到应用程序容器,然后创建一个元数据链接的PL/SQL函数,名为get_total_revenue。

ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app BEGIN PATCH 101 MINIMUM VERSION '1.0';

-- Connect to the saas_sales_ac container as saas_sales_adm, who owns the application
CONNECT saas_sales_adm/*******@saas_sales_ac

-- Now install the get_total_revenue() function
CREATE FUNCTION get_total_revenue SHARING=METADATA (p_year IN NUMBER)
RETURN SYS_REFCURSOR
AS
c1_cursor SYS_REFCURSOR;
BEGIN
OPEN c1_cursor FOR
   SELECT a.year,sum(a.revenue)
   FROM containers(sales_data) a
   WHERE a.year = p_year
   GROUP BY a.year;
RETURN c1_cursor;
END;
/

-- End the patch
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app END PATCH 101;

怀疑此处是不是表名写错了,我改成下边的表了,因为sales_data没见过doc里面提到

   FROM containers(sales_mlt) a

See Also:

"Patching Applications in an Application Container"

Parent topic: Application Maintenance

2.3.4 Migration of an Existing Application

您可以将安装在PDB中的应用程序迁移到应用程序根目录或应用程序PDB目录。
迁移已经存在的应用程序的典型原因包括:

  • Applications that use an installation program

    有些应用程序使用安装程序而不是脚本。在这种情况下,您可以在新的应用程序根中运行安装程序,然后使用DBMS_PDB_ALTER_SHARING包将对象设置为适当的共享模式:元数据、数据或扩展数据。根目录自动将更改传播到应用程序PDBs。Oracle数据库创建安装的语句日志,因此可以将具有以前应用程序版本的PDBs插入到应用程序根目录中。

  • Applications that are defined separately in each PDB

    有些应用程序定义在每个PDB中,但不存在应用程序容器。在这种情况下,您可以更新安装脚本以设置适当的共享模式。创建一个应用程序根,然后在这个根中创建主应用程序定义。您可以将现有的PDBs作为应用程序PDBs,方法是将它们插入到应用程序根目录中,然后运行一个SQL脚本,用对公共定义的引用替换完整的定义。

例如,您可以将安装在PDB中的应用程序迁移到插入到Oracle数据库12c CDB中的应用程序容器中,迁移到Oracle数据库18c CDB中的应用程序容器中。

See Also:

Parent topic: Overview of Applications in an Application Container

2.3.5隐式创建的应用程序

除了用户创建的应用程序之外,应用程序容器还可以包含隐式创建的应用程序。
当应用程序公共用户操作使用容器=ALL子句发出时,应用程序将隐式地在应用程序根中创建,而不需要在ALTER PLUGGABLE DATABASE BEGIN语句之前。

应用程序通用用户操作包括使用CREATE user语句创建通用用户或使用ALTER user语句更改通用用户等操作。数据库自动命名一个隐式应用程序应用程序$guid,其中guid是应用程序根的全局惟一ID。当第一次打开应用程序根目录时,将创建一个隐式应用程序。

See Also:

"Synchronizing Applications in an Application PDB" to learn more about implicitly created applications

Parent topic: Overview of Applications in an Application Container

2.3.6 Application Synchronization

在应用程序PDB中,同步是用户发起的应用程序到应用程序根目录中最新版本和补丁的更新。
当连接到应用程序PDB时,通过使用SYNC关键字发出ALTER PLUGGABLE数据库应用程序语句来同步应用程序。如果您在同步之前指定了应用程序名称,那么数据库只同步指定的应用程序。如果不指定应用程序名称,或者指定所有同步,那么数据库将同步所有应用程序,包括隐式创建的应用程序。

Note:

当您连接到应用程序根目录时,安装、升级和修补应用程序的操作不会自动将更改传播到应用程序PDBs。

Example 2-14 Synchronizing a Specific Application in an Application PDB

以下语句使一个名为saas_sales_app的应用程序与应用程序根中的最新应用程序更改同步:

ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app SYNC;

Example 2-15 Synchronizing a Specific Application to a Patch in an Application PDB

以下语句使一个名为saas_sales_app的应用程序与应用程序根目录中的补丁100同步:

ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app SYNC TO PATCH 100;

See Also:

"Synchronizing Applications in an Application PDB"

Parent topic: Overview of Applications in an Application Container

2.3.7 Container Maps

容器映射允许连接到应用程序根的会话发出路由到适当PDB的SQL语句,这取决于SQL语句中使用的谓词的值。
映射表指定元数据链接的公共表中的一列,并使用分区将不同的应用程序PDBs与不同的列值关联起来。通过这种方式,当数据没有在表级别物理分区时,容器映射支持在PDB级别分区数据。

The key components for using container maps are:

  • Metadata-linked table

    此表打算使用容器映射进行查询。例如,您可以创建一个元数据链接表,名为countryes_mlt,它在每个应用程序PDB中存储不同的数据。在amer_pdb中,countries . mlt.cname列存储北美国家名称;在euro_pdb中,countries . mlt.cname列存储欧洲国家名称;在asia_pdb中,countries_mlt.cname列存储亚洲国家名称。

  • Map table

    在应用程序根目录中,创建一个单列映射表,按列表、散列或范围分区。映射表允许使用由容器映射启用的分区策略查询元数据链接表。映射对象表中的分区名称必须与应用程序容器中的应用程序PDBs名称匹配。

    例如,名为pdb_map_tbl的映射表可以按cname列上的列表进行分区。名为amer_pdb、euro_pdb和asia_pdb的分区对应于应用程序PDBs的名称。每个分区中的值都是国家的名称,例如分区amer_pdb值(“US”、“MEXICO”、“CANADA”)。

    从Oracle Database 18c开始,对于容器()查询使用映射,映射表中的分区列不需要匹配元数据链接表中的列。假设容器映射pdb_map_tbl启用了sh.sales表,cname是映射表的分区列。尽管sh.sales不包含cname列,但是map表将以下查询路由到适当的PDB: SELECT * FROM CONTAINERS(sh.sales),其中cname = 'US' ORDER BY time_id。

  • Container map

    容器映射是指定映射表的数据库属性。要设置属性,您需要连接到应用程序根,并执行ALTER PLUGGABLE数据库集CONTAINER_MAP=map_table语句,其中map_table是映射表的名称。

Example 2-16 Creating a Metadata-Linked Table, Map Table, and Container Map: Part 1

在本例中,您以应用程序管理员的身份登录到应用程序根目录。假设一个应用程序容器有三个应用程序PDBs: amer_pdb、euro_pdb和asia_pdb。每个应用程序PDB存储不同区域的国家名称。一个名为oe的元数据链接表。countryes_mlt有一个存储国家名称的cname列。对于这种分区策略,使用partition by list创建一个名为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';

Note:

虽然使用分区语法创建容器映射,但是数据库不使用分区功能。定义容器映射不需要Oracle分区。
在前面的脚本中,是ALTER TABLE oe。countries es_mlt ENABLE CONTAINERS_DEFAULT语句指定在应用程序根中发出的查询和DML语句在默认情况下必须对数据库对象使用CONTAINERS()子句。

Example 2-17 Synchronizing the Application, and Adding Data: Part 2

这个例子继续上一个例子。在连接到应用程序根目录时,依次将当前容器切换到每个PDB,同步saas_sales_app应用程序,然后向oe添加特定于PDB的数据。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;

Example 2-18 Querying the Metadata-Linked Table: Part 3

这个例子继续上一个例子。您连接到应用程序根,然后查询oe。country _mlt多次,在WHERE子句中指定不同的国家。该查询返回来自ole .countries_mlt的正确值。地区列。

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

See Also:

"Partitioning by PDB with Container Maps"

Parent topic: Overview of Applications in an Application Container

猜你喜欢

转载自blog.csdn.net/viviliving/article/details/84226803