[20250812]一些cdb开头的视图存在隐藏列.txt
–//昨天看了链接https://mikedietrichde.com/2025/08/11/were-you-aware-of-the-two-hidden-columns-in-cdb-views/,给出一些信
–//息一些cdb视图存在2个隐藏列(实际上不止2个,只不过这两个比较有意义罢了)。
–//在我的机器上测试一下,看看一些相关细节。
1.环境:
SYS@book> @ver2
==============================
PORT_STRING : x86_64/Linux 2.4.xx
VERSION : 21.0.0.0.0
BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 – Production
BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 – Production
Version 21.3.0.0.0
BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 – Production
CON_ID : 0
PL/SQL procedure successfully completed.
2.测试:
SYS@book> @ desc CDB_DIRECTORIES
Name Null? Type
——————————- ——– —————————-
1 OWNER NOT NULL VARCHAR2(128)
2 DIRECTORY_NAME NOT NULL VARCHAR2(128)
3 DIRECTORY_PATH VARCHAR2(4000)
4 ORIGIN_CON_ID NUMBER
5 CON_ID NUMBER
–//desc信息显示5个字段。看看视图定义。
SYS@book> @ v2 CDB_DIRECTORIES
Show SQL text of views matching “CDB_DIRECTORIES”…
V_OWNER VIEW_NAME TEXT TEXT_VC
——- ————— —————————————————————————————————- —————————————————————————————————-
SYS CDB_DIRECTORIES SELECT k.”OWNER”,k.”DIRECTORY_NAME”,k.”DIRECTORY_PATH”,k.”ORIGIN_CON_ID”,k.”CON_ID”, k.CON$NAME, SELECT k.”OWNER”,k.”DIRECTORY_NAME”,k.”DIRECTORY_PATH”,k.”ORIGIN_CON_ID”,k.”CON_ID”, k.CON$NAME,
k.CDB$NAME, k.CON$ERRNUM, k.CON$ERRMSG FROM CONTAINERS(“SYS”.”DBA_DIRECTORIES”) k k.CDB$NAME, k.CON$ERRNUM, k.CON$ERRMSG FROM CONTAINERS(“SYS”.”DBA_DIRECTORIES”) k
no rows selected
–//仔细看一下就是发现视图定义还存在4个字段,分别是
–//k.CON$NAME,k.CDB$NAME, k.CON$ERRNUM, k.CON$ERRMSG
CDB_* views include these hidden columns:
CON$NAME: This column includes the name of the container whose data a given CDB_* row represents
CDB$NAME: This column displays the name of the CDB whose data a given CDB_* row represents
–//作者测试例子:
SYS@book> select * from CDB_DIRECTORIES where DIRECTORY_NAME=’DATA_PUMP_DIR’;
OWNER DIRECTORY_NAME DIRECTORY_PATH ORIGIN_CON_ID CON_ID
—– ————– —————————————————————— ————- ———-
SYS DATA_PUMP_DIR /u01/app/oracle/admin/book/dpdump/ 1 1
SYS DATA_PUMP_DIR /u01/app/oracle/admin/book/dpdump/1F36F47256D41C08E0636538A8C03260 1 3
SYS@book> column CON$ERRMSG format a20
SYS@book> select con$name,cdb$name,CON$ERRNUM,CON$ERRMSG,a.* from CDB_DIRECTORIES a where DIRECTORY_NAME=’DATA_PUMP_DIR’;
CON$NAME CDB$NAME CON$ERRNUM CON$ERRMSG OWNER DIRECTORY_NAME DIRECTORY_PATH ORIGIN_CON_ID CON_ID
——– ——– ———- ———— —– ————– —————————————————————— ————- ———-
CDB$ROOT book 0 SYS DATA_PUMP_DIR /u01/app/oracle/admin/book/dpdump/ 1 1
BOOK01P book 0 SYS DATA_PUMP_DIR /u01/app/oracle/admin/book/dpdump/1F36F47256D41C08E0636538A8C03260 1 3
–//这样做的好处就是不用使用连接操作,就可以获得CON$NAME。
–//尝试在toad下查看定义:
CREATE OR REPLACE FORCE VIEW SYS.CDB_DIRECTORIES
(OWNER, DIRECTORY_NAME, DIRECTORY_PATH, ORIGIN_CON_ID, CON_ID)
BEQUEATH DEFINER
AS
SELECT k.”OWNER”,k.”DIRECTORY_NAME”,k.”DIRECTORY_PATH”,k.”ORIGIN_CON_ID”,k.”CON_ID”,
k.CON$NAME, k.CDB$NAME, k.CON$ERRNUM, k.CON$ERRMSG FROM CONTAINERS(“SYS”.”DBA_DIRECTORIES”) k;
–//前面仅仅5个,select显示多了4个字段,能这样定义视图吗?自己做一个尝试。
SCOTT@book01p> create or replace view v_emp(EMPNO,ENAME) as select EMPNO,ENAME,DEPTNO from emp;
create or replace view v_emp(EMPNO,ENAME) as select EMPNO,ENAME,DEPTNO from emp
*
ERROR at line 1:
ORA-01730: invalid number of column names specified
SCOTT@book01p> CREATE OR REPLACE FORCE VIEW v_emp (empno,ename) BEQUEATH DEFINER AS select EMPNO,ENAME,DEPTNO from emp;
Warning: View created with compilation errors.
SCOTT@book01p> show error
Errors for VIEW V_EMP:
LINE/COL ERROR
——– ——————————
0/0 ORA-01730: invalid number of
column names specified
SCOTT@book01p> CREATE OR REPLACE FORCE VIEW v_emp (empno,ename) BEQUEATH DEFINER AS select EMPNO,ENAME,DEPTNO from CONTAINERS(emp);
Warning: View created with compilation errors.
–//不行!!
–//你可以查询cdb视图,许多类似包含 FROM CONTAINERS的视图都存在类似的情况,在最后多定义4个字段。
–//添加的风格都与前面不同k.CON$NAME, k.CDB$NAME, k.CON$ERRNUM, k.CON$ERRMSG,字段名没有双引号。