[20250812]一些cdb开头的视图存在隐藏列.txt

来源:这里教程网 时间:2026-03-03 22:34:36 作者:

[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,字段名没有双引号。

相关推荐