在Oracle Database 12.2多租户架构中,使用Containers关键字来完成跨pdb查询.
2017-03-29 15:03
393 查看
在Oracle Database 12.2多租户架构中,使用Containers关键字来完成跨pdb查询,该表在各个pdb中有相同表名,相同表结构
考虑到MSSQLServer有跨库查询的语法,(以sa登录,select* from database_name.user_name.tab_name),
那么, 在12c多租户下怎么实现这种跨库的查询呢?
参考自:
https://docs.oracle.com/database/122/ADMIN/viewing-information-about-cdbs-and-pdbs-with-sql-plus.htm#ADMIN14319
大体过程:
考虑到MSSQLServer有跨库查询的语法,(以sa登录,select* from database_name.user_name.tab_name),
那么, 在12c多租户下怎么实现这种跨库的查询呢?
参考自:
https://docs.oracle.com/database/122/ADMIN/viewing-information-about-cdbs-and-pdbs-with-sql-plus.htm#ADMIN14319
大体过程:
在pdb highgo3下建立hgu3.t1这个table. 在pdb highgo2下建立hgu3.t1这个table. 在root中建立common user--C##nasa, 并赋予C##nasa对pdb highgo3下 hgu3.t1表的select权限 并赋予C##nasa对pdb highgo2下 hgu3.t1表的select权限 在pdb highgo3中建立c##nasa.v_t1这个视图. 在pdb highgo2中建立c##nasa.v_t1这个视图. 在root中建立c##nasa.v_t1这个表. 在root中执行查询语句:select * from containers(v_t1) where con_id =4;
======================================pdb highgo3开始======================================== SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 HIGHGO1 MOUNTED 4 HIGHGO2 READ WRITE NO 5 HIGHGO3 READ WRITE NO SQL> alter session set container=highgo3; Session altered. SQL> create user hgu3 identified by aaaaaa; User created. SQL> grant dba to hgu3; Grant succeeded. SQL> conn hgu3/aaaaaa@highgo3 Connected. SQL> create table t1 (c1 int,c3 char(2)); -------->在pdb highgo3下建立hgu3.t1这个table. Table created. SQL> insert into t1 values(1,'AA'); 1 row created. SQL> commit; Commit complete. SQL> select * from t1; C1 C3 ---------- -- 1 AA SQL> ======================================pdb highgo3结束======================================== ======================================pdb highgo2开始======================================== SQL> conn / as sysdba Connected. SQL> alter session set container=highgo2; Session altered. SQL> create user hgu3 identified by aaaaaa; User created. SQL> grant dba to hgu3; Grant succeeded. SQL> conn hgu3/aaaaaa@highgo2; Connected. SQL> create table t1 (c1 int,c3 char(2)); -------->在pdb highgo2下建立hgu3.t1这个table. Table created. SQL> insert into t1 values(2,'BB') 2 / 1 row created. SQL> commit; Commit complete. SQL> ======================================pdb highgo2结束======================================== SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> show user USER is "SYS" SQL> create user c##NASA identified by aaaaaa; ---->>>在root中建立common user. User created. SQL> grant dba to c##nasa container=all; Grant succeeded. SQL> SQL> SQL> conn sys/aaaaaa@highgo3 as sysdba Connected. SQL> show con_name CON_NAME ------------------------------ HIGHGO3 SQL> show user USER is "SYS" SQL> grant select on hgu3.t1 to c##nasa; ---->>>在pdb highgo3中授予common user c##nasa 对hgu3.t1表的select权限. Grant succeeded. SQL> SQL> conn sys/aaaaaa@highgo2 as sysdba ---->>>在pdb highgo2中授予common user c##nasa 对hgu3.t1表的select权限. Connected. SQL> grant select on hgu3.t1 to c##nasa; Grant succeeded. SQL> SQL> conn c##nasa/aaaaaa@highgo3 Connected. SQL> create view v_t1 as select * from hgu3.t1;---->>>在pdb highgo3中建立c##nasa.v_t1这个视图. View created. SQL> conn c##nasa/aaaaaa@highgo2 Connected. SQL> create view v_t1 as select * from hgu3.t1;---->>>在pdb highgo2中建立c##nasa.v_t1这个视图. View created. SQL> SQL> conn c##nasa/aaaaaa@cdb$root Connected. SQL> show user USER is "C##NASA" SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> create table v_t1 (c1 int,c3 char(2));;---->>>在root中建立c##nasa.v_t1这个表. Table created. SQL> SQL> select * from containers(v_t1); ----->>>查询语法如下. C1 C3 CON_ID ---------- -- ---------- 1 AA 5 2 BB 4 SQL> SQL> select * from containers(v_t1) where con_id =4; ----->>>查询语法如下. C1 C3 CON_ID ---------- -- ---------- 2 BB 4 SQL> SQL> explain plan for select * from containers(v_t1) where con_id =4; Explained. SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Plan hash value: 1051007651 ------------------------------------------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib | ------------------------------------------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 400 | 12000 | 1 (100)| 00:00:01 | | | | | | | 1 | PX COORDINATOR | | | | | | | | | | | | 2 | PX SEND QC (RANDOM) | :TQ10000 | 400 | 12000 | 1 (100)| 00:00:01 | | | Q1,00 | P->S | QC (RAND) | | 3 | PX PARTITION LIST SINGLE| | 400 | 12000 | 1 (100)| 00:00:01 | 4 | 4 | Q1,00 | PCWC | | | 4 | CONTAINERS FULL | V_T1 | 400 | 12000 | 1 (100)| 00:00:01 | | | Q1,00 | PCWP | | ------------------------------------------------------------------------------------------------------------------------------------ 11 rows selected. --------->>>上面还用了并行. SQL> SET AUTOTRACE ON SQL> select * from containers(v_t1) where con_id =4; C1 C3 CON_ID ---------- -- ---------- 2 BB 4 Execution Plan ---------------------------------------------------------- Plan hash value: 1051007651 ------------------------------------------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib | ------------------------------------------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 400 | 12000 | 1 (100)| 00:00:01 | | | | | | | 1 | PX COORDINATOR | | | | | | | | | | | | 2 | PX SEND QC (RANDOM) | :TQ10000 | 400 | 12000 | 1 (100)| 00:00:01 | | | Q1,00 | P->S | QC (RAND) | | 3 | PX PARTITION LIST SINGLE| | 400 | 12000 | 1 (100)| 00:00:01 | 4 | 4 | Q1,00 | PCWC | | | 4 | CONTAINERS FULL | V_T1 | 400 | 12000 | 1 (100)| 00:00:01 | | | Q1,00 | PCWP | | ------------------------------------------------------------------------------------------------------------------------------------ Statistics ---------------------------------------------------------- 292 recursive calls 0 db block gets 332 consistent gets 0 physical reads 0 redo size 674 bytes sent via SQL*Net to client 608 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 24 sorts (memory) 0 sorts (disk) 1 rows processed SQL>
相关文章推荐
- 在Oracle 12.2多租户架构中只flush 某个pdb的buffer cache
- 使用asp.net进行多关键字查询的例子
- [SharePoint Designer技巧-1]使用DataView与Form Web Part实现列表的关键字查询--转载
- DotNET企业架构应用实践-系统架构与性能-在业务中实例使用缓存与缓存查询-附上视频
- 使用tomcat的时候,网页地址出现中文,出现不认识编码导致查询无法完成解决方案
- 教学思路SQL之入门习题《学生成绩》 五、使用视图完成多表查询
- 使用asp.net进行多关键字查询的例子
- 在mysql 查询中使用 默认关键字
- 使用sql字符串查询关键字CHARINDEX
- JSP培训(7)——使用JDBC完成动态验证、采用MVC完成数据查询
- 使用MVC模式开发程序,完成数据的模糊查询
- 使用asp.net进行多关键字查询的例子
- KB242450:如何使用关键字和查询词查询 Microsoft 知识库
- 使用ibag完成多表查询的nhibernate应用
- 使用sql字符串查询关键字CHARINDEX
- 使用asp.net进行多关键字查询的例子
- sharepoint之-使用DataView与Form Web Part实现列表的关键字查询
- 教学思路SQL之入门习题《学生成绩》 五、使用视图完成多表查询
- DotNET企业架构应用实践-系统架构与性能-在业务中实例使用缓存与缓存查询-附上视频
- SSH整合使用Criteria动态查询及任意关键字多字段模糊查询