前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >探究 Oracle PDB Application Container (五)

探究 Oracle PDB Application Container (五)

作者头像
SQLplusDB
发布2022-08-19 21:16:22
2970
发布2022-08-19 21:16:22
举报
文章被收录于专栏:Oracle数据库技术

编者按:

本文作者系大连健哥,POSTGRESQL、ORACLE 数据库资深从业人员、IT 技术的深度爱好者。相信科学改变人类、技术创造未来。个人主页:https://www.cnblogs.com/gaojian/,经其本人授权发布。

【免责声明】本号文章仅代表个人观点,与任何公司无关。

探究 Oracle PDB Application Container (四)

在使用 Application Container 时,当我们定义Application 中的一个共通对象为 extended data 的时候,Application 中的共通数据,和 Application PDB 中的独立数据,会一起出现在查询结果中,导致一些特殊的问题(比如数据重复)。

下面是测试的过程,首先,构造测试用的 Application container 、Application、Application PDB。

代码语言:javascript
复制
alter system set db_create_file_dest='/refresh/home/cpdest';
 
CREATE PLUGGABLE DATABASE appcon1 AS APPLICATION CONTAINER ADMIN USER app_admin IDENTIFIED BY Password1;
ALTER PLUGGABLE DATABASE appcon1 OPEN;
ALTER SESSION SET container = appcon1;
CREATE PLUGGABLE DATABASE apppdb1 ADMIN USER pdb_admin IDENTIFIED BY Password1;
ALTER PLUGGABLE DATABASE apppdb1 OPEN;
 
CREATE PLUGGABLE DATABASE apppdb2 ADMIN USER pdb_admin IDENTIFIED BY Password1;
ALTER PLUGGABLE DATABASE apppdb2 OPEN;
 
 
ALTER SESSION SET container = appcon1;
ALTER PLUGGABLE DATABASE APPLICATION ref_app BEGIN INSTALL '1.0';
 
CREATE TABLESPACE app_ts DATAFILE SIZE 1M AUTOEXTEND ON NEXT 1M;
CREATE USER app_user IDENTIFIED BY app_user
DEFAULT TABLESPACE app_ts
QUOTA UNLIMITED ON app_ts
CONTAINER=ALL;
GRANT CREATE SESSION, CREATE TABLE TO app_user;
CREATE TABLE app_user.reference_data SHARING= EXTENDED DATA (
id NUMBER,
description VARCHAR2(50),
CONSTRAINT t1_pk PRIMARY KEY (id)
);
 
INSERT INTO app_user.reference_data
SELECT level,
'Description of ' || level
FROM dual
CONNECT by level <= 5;
 
COMMIT;
 
ALTER PLUGGABLE DATABASE APPLICATION ref_app END INSTALL;

这里,我定义 table app_user.reference_data 时,使用了 SHARING= EXTENDED DATA。我给了它5条数据。我先试试看能否插入同样ID(例如:ID=5)的数据:

代码语言:javascript
复制
SQL>  alter session set container=apppdb1;
 
Session altered.
 
SQL>
SQL> ALTER PLUGGABLE DATABASE APPLICATION ALL SYNC;
 
Pluggable database altered.
 
SQL> select * from app_user.reference_data;
 
        ID DESCRIPTION
---------- --------------------------------------------------
         1 Description of 1
         2 Description of 2
         3 Description of 3
         4 Description of 4
         5 Description of 5
 
 
SQL> insert into app_user.reference_data(id,description) values(5,'Desp5');
insert into app_user.reference_data(id,description) values(5,'Desp5')
*
ERROR at line 1:
ORA-00001: unique constraint (APP_USER.T1_PK) violated
 
 
SQL>

还不错,因为 Application 中的这个表,有主键约束,在已经有 ID=5 的数据的同时,我在 Appcation PDB 中,是无法再插入 ID =5 的数据的。

但是,如果我在 Application PDB 中插入 ID=6 的新数据,然后回到 Application 进行升级,在 Application 中,也插入 ID=6 的数据,会如何呢?

代码语言:javascript
复制
SQL>  alter session set container=apppdb1;
 
Session altered.
 
SQL>
SQL> ALTER PLUGGABLE DATABASE APPLICATION ALL SYNC;
 
SQL> insert into app_user.reference_data(id, description) values(6,'Desp6');
 
1 row created.
 
SQL> commit;
 
Commit complete.
 
 
SQL> alter session set container=appcon1;
 
Session altered.
 
SQL> ALTER PLUGGABLE DATABASE APPLICATION ref_app BEGIN UPGRADE '1.0' TO '1.1';
 
Pluggable database altered.
 
SQL> insert into app_user.reference_data(id, description) values(6,'Descrption 6');
 
1 row created.
 
SQL> commit;
 
Commit complete.
 
SQL> ALTER PLUGGABLE DATABASE APPLICATION ref_app END UPGRADE;
 
Pluggable database altered.
 
SQL>

可以看到,在Application 的升级过程里,插入同样 ID=6 的数据,成功了,Application 无视了 Application PDB 中的内容。

那么,我再回到 Application PDB中,会看到怎样的景象呢?

代码语言:javascript
复制
SQL> alter session set container=apppdb1;
 
Session altered.
 
SQL> ALTER PLUGGABLE DATABASE APPLICATION ALL SYNC;
 
Pluggable database altered.
 
SQL> select * from app_user.reference_data;
 
       ID DESCRIPTION
---------- --------------------------------------------------
        1 Description of 1
        2 Description of 2
        3 Description of 3
        4 Description of 4
        5 Description of 5
        6 Descrption 6
        6 Desp6
 
7 rows selected.
 
SQL>

可以看到, 在 Application PDB 中,看到了ID=6 的重复数据。看来,使用 Application container、Application 时,还是要从业务层面制定好规则,确定什么样的数据可以在 Application 中共享。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL和数据库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档