欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OB Oracle系統(tǒng)視圖權限導致的故障解決案例

 更新時間:2023年10月25日 09:50:02   作者:愛可生開源社區(qū)  
在 Oracle 和 OB Oracle 租戶下調用存儲過程時,兩者表現(xiàn)并不一致,導致獲取到的 SQL 文本拼接不完整,影響到了業(yè)務側的功能測試,本文將針對這個問題進行相關的測試和驗證

背景

最近在客戶這邊遇到一個故障,在 Oracle 和 OB Oracle 租戶下調用存儲過程時,兩者表現(xiàn)并不一致,導致獲取到的 SQL 文本拼接不完整,影響到了業(yè)務側的功能測試。

客戶的存儲過程邏輯并不復雜,就是通過查詢系統(tǒng)視圖 user_tab_columns 來獲取用戶的表名,然后再進行 SQL 拼接,完成后續(xù)的業(yè)務邏輯。

本文將針對這個問題進行相關的測試和驗證。

問題復現(xiàn)

Oracle 環(huán)境中驗證

-- 創(chuàng)建測試用戶并賦權
[root@localhost ~]# sqlplus / as sysdba
SQL> create user u1 identified by u1;
User created.
SQL> create user u2 identified by u2;
User created.
SQL> grant connect,resource to u1;
Grant succeeded.
SQL> grant create procedure to u1;
Grant succeeded.
SQL> grant connect,resource to u2;
Grant succeeded.
SQL> grant create synonym to u2;
Grant succeeded.
SQL> grant select any table to u2;
Grant succeeded.
-- 創(chuàng)建測試表并賦權
SQL> conn u1/u1
Connected.
SQL> create table t1(id int);
Table created.
SQL> insert into t1(id) values(1);
1 row created.
-- 創(chuàng)建表的同義詞
SQL> conn u2/u2
Connected.
SQL> create synonym t1 for u1.t1;
Synonym created.
SQL> set lin 200
SQL> col owner for a5
SQL> col table_owner for a5
SQL> col db_link for a10
SQL> select * from all_synonyms where owner='U2';
OWNER SYNONYM_NAME          TABLE TABLE_NAME           DB_LINK
----- ------------------------------ ----- ------------------------------ ----------
U2  T1               U1  T1
-- 創(chuàng)建存儲過程并賦權
SQL> conn u1/u1
Connected.
SQL> create or replace procedure proc_case1 as
v_str varchar2(10);
begin
select table_name into v_str from user_tab_columns where table_name='T1';
dbms_output.put_line(v_str);
end;
/  2    3    4    5    6    7  
Procedure created.
SQL> grant execute on proc_case1 to u2;
Grant succeeded.
-- 創(chuàng)建存儲過程同義詞
SQL> conn u2/u2
Connected.
SQL> create synonym proc_case1 for u1.proc_case1;
Synonym created.
SQL> select * from all_synonyms where owner='U2';
OWNER SYNONYM_NAME                   TABLE TABLE_NAME                     DB_LINK
----- ------------------------------ ----- ------------------------------ ----------
U2    PROC_CASE1                     U1    PROC_CASE1
U2    T1                             U1    T1
-- 驗證
SQL> conn u1/u1
Connected.
SQL> select * from t1;
        ID
----------
         1
SQL> set serveroutput on;
SQL> call proc_case1();
T1
Call completed.
SQL> conn u2/u2
Connected.
SQL> select * from t1;
        ID
----------
         1
SQL> set serveroutput on;
SQL> call proc_case1();
T1
Call completed.
SQL>

由此可見,在 Oracle 中,無論是 u1 還是 u2 用戶,調用存儲過程時都能正確返回表名,說明兩者查詢 user_tab_columns 視圖的返回結果是一致的,這也是符合預期的。

OB Oracle 環(huán)境中驗證

-- 創(chuàng)建測試用戶并賦權
SYS[SYS]> create user u1 identified by u1;
Query OK, 0 rows affected (0.04 sec)
SYS[SYS]> create user u2 identified by u2;
Query OK, 0 rows affected (0.04 sec)
SYS[SYS]> grant connect,resource to u1;
Query OK, 0 rows affected (0.04 sec)
SYS[SYS]> grant create procedure to u1;
Query OK, 0 rows affected (0.03 sec)
SYS[SYS]> grant connect,resource to u2;
Query OK, 0 rows affected (0.05 sec)
SYS[SYS]> grant create synonym to u2;
Query OK, 0 rows affected (0.03 sec)
SYS[SYS]> grant select any table to u2;
Query OK, 0 rows affected (0.03 sec)
-- 創(chuàng)建測試表并賦權
SYS[SYS]> conn u1
Connection id:  269006
Current database: U1
SYS[U1]> create table t1(id int);
Query OK, 0 rows affected (0.21 sec)
SYS[U1]> insert into t1(id) values(1);
Query OK, 1 row affected (0.03 sec)
SYS[U1]> commit;
Query OK, 0 rows affected (0.01 sec)
-- 創(chuàng)建表的同義詞
SYS[U1]> conn u2
Connection id:  50837
Current database: U2
SYS[U2]> create synonym t1 for u1.t1;
Query OK, 0 rows affected (0.05 sec)
SYS[U2]> select * from all_synonyms where owner='U2';
+-------+--------------+-------------+------------+---------+
| OWNER | SYNONYM_NAME | TABLE_OWNER | TABLE_NAME | DB_LINK |
+-------+--------------+-------------+------------+---------+
| U2    | T1           | U1          | T1         | NULL    |
+-------+--------------+-------------+------------+---------+
2 rows in set (0.01 sec)
-- 創(chuàng)建存儲過程并賦權
SYS[U2]> conn u1
Connection id:  269078
Current database: U1
SYS[U1]> create or replace procedure proc_case1 as
  -> v_str varchar2(10);
  -> begin
  -> select table_name into v_str from user_tab_columns where table_name='T1';
  -> dbms_output.put_line(v_str);
  -> end;
  -> /
Query OK, 0 rows affected (0.17 sec)
SYS[U1]> grant execute on proc_case1 to u2;
Query OK, 0 rows affected (0.06 sec)
-- 創(chuàng)建存儲過程同義詞
SYS[U1]> conn u2
Connection id:  50896
Current database: U2
SYS[U2]> create synonym proc_case1 for u1.proc_case1;
Query OK, 0 rows affected (0.05 sec)
SYS[U2]> select * from all_synonyms where owner='U2';
+-------+--------------+-------------+------------+---------+
| OWNER | SYNONYM_NAME | TABLE_OWNER | TABLE_NAME | DB_LINK |
+-------+--------------+-------------+------------+---------+
| U2    | PROC_CASE1   | U1          | PROC_CASE1 | NULL    |
| U2    | T1           | U1          | T1         | NULL    |
+-------+--------------+-------------+------------+---------+
2 rows in set (0.01 sec)
-- 驗證
SYS[U2]> conn u1
Connection id:  269134
Current database: U1
SYS[U1]> select * from t1;
+------+
| ID   |
+------+
|    1 |
+------+
1 row in set (0.01sec)
SYS[U1]> set serveroutput on;
Query OK, 0 rows affected (0.41 sec)
SYS[U1]> call proc_case1();
Query OK, 0 rows affected (0.21 sec)
SYS[U1]> select table_name,column_name from user_tab_columns;
+------------+-------------+
| TABLE_NAME | COLUMN_NAME |
+------------+-------------+
| C          | NAME        |
| C          | ADDRESS     |
+------------+-------------+
2 rows in set (0.08 sec)

此處其實已經(jīng)可以發(fā)現(xiàn)一些端倪,在 OB 中雖然可以通過 conn 進行用戶切換,切換后的用戶也能訪問自己的對象,但是在訪問 USER_ 等視圖時,返回結果與 Oracle 不同。

用戶 u1 查詢 user_tab_columns 表時,只能看到 SYS 用戶下的表( C 表是由 SYS 用戶創(chuàng)建的),所以存儲過程無法返回 T1 表的表名,其查詢結果為空。

-- 直連 u1 用戶驗證
U1[U1]> select * from t1;
+------+
| ID   |
+------+
|    1 |
+------+
1 row in set (0.01sec)
U1[U1]> set serveroutput on;
Query OK, 0 rows affected (0.02sec)
U1[U1]> call proc_case1();
Query OK, 0 rows affected (0.08sec)
T1
U1[U1]>
-- 直連 u2 用戶進行驗證
U2[U2]> select * from t1;
+------+
| ID   |
+------+
|    1 |
+------+
1 row in set (0.03sec)
U2[U2]> set serveroutput on;
Query OK, 0 rows affected (0.44 sec)
U2[U2]> call proc_case1();
Query OK, 0 rows affected (0.43 sec)
U2[U2]> select * from user_tab_columns;
Empty set (0.08 sec)
# 同樣地,u2 也無法從 user_tab_columns 視圖中查詢到 u1 創(chuàng)建的表,調用存儲過程返回結果為空
-- 將 user_tab_columns 替換成 all_tab_columns 視圖
U2[U2]> select table_name,column_name from all_tab_columns where owner='U1';
+------------+-------------+
| TABLE_NAME | COLUMN_NAME |
+------------+-------------+
| T1         | ID          |
+------------+-------------+
1 row in set (0.08 sec)
U2[U2]> create or replace procedure proc_case2 as
    -> v_str varchar2(10);
    -> begin
    -> select table_name into v_str from all_tab_columns where table_name='T1' and owner='U1';
    -> dbms_output.put_line(v_str);
    -> end;
    -> /
Query OK, 0 rows affected (0.17ec)
U2[U2]> call proc_case2();
Query OK, 0 rows affected (0.16ec)
T1
U2[U2]>
-- 將 SELECT ANY TABLE 權限回收
SYS[SYS]> revoke select any table from u2;
Query OK, 0 rows affected (0.03 sec)
U2[U2]> select table_name,column_name from all_tab_columns where owner='U1';
Empty set (0.05 sec)
U2[U2]> set serveroutput on;
Query OK, 0 rows affected (0.01 sec)
U2[U2]> call proc_case2();
Query OK, 0 rows affected (0.05 sec)

當用戶 u2 沒有 SELECT ANY TABLE 系統(tǒng)權限后,即使查詢 all_tab_columns 視圖,也無法獲取其他用戶創(chuàng)建表的相關信息。

排查調用系統(tǒng)視圖的相關對象

PL 對象

PL 對象,如:函數(shù),存儲過程等。

-- dba_source 視圖中存放了各種 PL 對象的定義
SQL> select count(*),type from dba_source group by type;
 COUNT(*) TYPE
---------- ------------
  152202 PROCEDURE
   89318 PACKAGE
   31504 PACKAGE BODY
   1276 TYPE BODY
   2210 TRIGGER
   3895 FUNCTION
     7 JAVA SOURCE
   12338 TYPE
8 rows selected.
-- 創(chuàng)建測試存儲過程(大小寫各1個)
SQL> CREATE OR REPLACE PROCEDURE PROC_1 IS
V_N NUMBER :=0;
BEGIN
 SELECT COUNT(*) INTO V_N FROM USER_TAB_COLUMNS;
END;
/ 2  3  4  5  6 
Procedure created.
SQL> create or replace procedure proc_2 is
v_n number :=0;
begin
 select count(*) into v_n from user_tab_columns;
end;
/ 2  3  4  5  6 
Procedure created.
-- 查詢常用系統(tǒng)視圖名(此處只列舉了幾個與表相關的視圖)
select owner,object_name,object_type from dba_objects where owner='SYS' and (object_name like 'USER_PART_%' or object_name like 'USER_T%' or object_name like 'ALL_PART_%' or object_name like 'ALL_T%' or object_name like 'DBA_PART_%' or object_name like 'DBA_T%');
-- 根據(jù)上一步獲取到的系統(tǒng)視圖名,通過模糊搜索,即可捕獲到涉及查詢這些系統(tǒng)視圖的 PL 對象
SQL> set line 200 pages 9999 long 999999
SQL> col owner for a10
SQL> col name for a30
SQL> col text for a80
SQL> select owner,name,type,text from dba_source where owner not in('SYS', 'SYSTEM', 'SYSMAN', 'OUTLN', 'DIP', 'TSMSYS', 'DBSNMP',
     'ORACLE_OCM', 'WMSYS', 'EXFSYS', 'XDB', 'ANONYMOUS', 'ORDSYS',
     'ORDPLUGINS', 'SI_INFORMTN_SCHEMA', 'MDSYS', 'MGMT_VIEW', 'PERFSTAT',
     'DMSYS', 'CTXSYS', 'OLAPSYS', 'MDDATA', 'APPQOSSYS', 'XS$NULL',
     'ORDDATA', 'SPATIAL_WFS_ADMIN_USR', 'SPATIAL_CSW_ADMIN_USR',
     'OWBSYS', 'APEX_PUBLIC_USER', 'APEX_030200', 'FLOWS_FILES', 'SCOTT',
     'OMS', 'OWBSYS_AUDIT', 'DSG', 'DBMGR', 'PATROL', 'SPA', 'GOLDENGATE',
     'DBADM') and owner not like 'MYNET%' and (text like '%USER_TAB_COLUMNS%' or text like '%user_tab_columns%' or text like '%USER%TABLES%' or text like '%user%tables%' or text like '%ALL_TAB_COLUMNS%' or text like '%ALL_tab_columns%' or text like '%ALL%TABLES%' or text like '%ALL%tables%'); 2  3  4  5  6  7  8 
OWNER   NAME              TYPE     TEXT
---------- ------------------------------ ------------ --------------------------------------------------------------------------------
U1     PROC_CASE1           PROCEDURE  select table_name into v_str from user_tab_columns where table_name='T1';
ZLM    PROC_1             PROCEDURE   SELECT COUNT(*) INTO V_N FROM USER_TAB_COLUMNS;
ZLM    PROC_2             PROCEDURE   select count(*) into v_n from user_tab_columns;

視圖對象

-- 創(chuàng)建測試視圖1
SQL> create view view_1 as select * from user_tables;
View created.
-- 查詢 dba_views 獲取視圖定義
SQL> select owner,view_name,text from dba_views where owner not in('SYS', 'SYSTEM', 'SYSMAN', 'OUTLN', 'DIP', 'TSMSYS', 'DBSNMP',
     'ORACLE_OCM', 'WMSYS', 'EXFSYS', 'XDB', 'ANONYMOUS', 'ORDSYS',
     'ORDPLUGINS', 'SI_INFORMTN_SCHEMA', 'MDSYS', 'MGMT_VIEW', 'PERFSTAT',
     'DMSYS', 'CTXSYS', 'OLAPSYS', 'MDDATA', 'APPQOSSYS', 'XS$NULL',
     'ORDDATA', 'SPATIAL_WFS_ADMIN_USR', 'SPATIAL_CSW_ADMIN_USR',
     'OWBSYS', 'APEX_PUBLIC_USER', 'APEX_030200', 'FLOWS_FILES', 'SCOTT',
     'OMS', 'OWBSYS_AUDIT', 'DSG', 'DBMGR', 'PATROL', 'SPA', 'GOLDENGATE',
     'DBADM') and (text like '%USER_TAB_COLUMNS%' or text like '%user_tab_columns%' or text like '%USER%TABLES%' or text like '%user%tables%' or text like '%ALL_TAB_COLUMNS%' or text like '%ALL_tab_columns%' or text like '%ALL%TABLES%' or text like '%ALL%tables%');
 2  3  4  5  6  7  8     'DBADM') and (text like '%USER_TAB_COLUMNS%' or text like '%user_tab_columns%' or text like '%USER%TABLES%' or text like '%user%tables%' or text like '%ALL_TAB_COLUMNS%' or text like '%ALL_tab_columns%' or text like '%ALL%TABLES%' or text like '%ALL%tables%')
                                                                                                                          *
ERROR at line 8:
ORA-00932: inconsistent datatypes: expected NUMBER got LONG
  • dba_source 視圖中的 text 列是 varchar2 類型的,可以直接使用 like 進行模糊查詢。
  • dba_views 視圖中的 text 列是 long 類型的,無法直接使用 like 進行模糊查詢,會報 ORA-00932 的錯誤。

workaround:先創(chuàng)建一張表,用 to_lob 函數(shù)將 text 字段轉換為 clob 類型,然后將 dba_views 拷貝到該表中,再通過以上 SQL 進行查詢。

-- 創(chuàng)建中間表并將系統(tǒng)視圖 dba_views 內容拷貝到該表
SQL> create table my_views as select owner,view_name,to_lob(text) text from dba_views;
Table created.
-- 查詢中間表捕獲目標視圖對象
SQL> select owner,view_name,text from my_views where owner not in('SYS', 'SYSTEM', 'SYSMAN', 'OUTLN', 'DIP', 'TSMSYS', 'DBSNMP',     'ORACLE_OCM', 'WMSYS', 'EXFSYS', 'XDB', 'ANONYMOUS', 'ORDSYS',     'ORDPLUGINS', 'SI_INFORMTN_SCHEMA', 'MDSYS', 'MGMT_VIEW', 'PERFSTAT',     'DMSYS', 'CTXSYS', 'OLAPSYS', 'MDDATA', 'APPQOSSYS', 'XS$NULL',     'ORDDATA', 'SPATIAL_WFS_ADMIN_USR', 'SPATIAL_CSW_ADMIN_USR',     'OWBSYS', 'APEX_PUBLIC_USER', 'APEX_030200', 'FLOWS_FILES', 'SCOTT',     'OMS', 'OWBSYS_AUDIT', 'DSG', 'DBMGR', 'PATROL', 'SPA', 'GOLDENGATE',     'DBADM') and (text like '%USER_TAB_COLUMNS%' or text like '%user_tab_columns%' or text like '%USER%TABLES%' or text like '%user%tables%' or text like '%ALL_TAB_COLUMNS%' or text like '%ALL_tab_columns%' or text like '%ALL%TABLES%' or text like '%ALL%tables%'); 2  3  4  5  6  7  8 
OWNER   VIEW_NAME           TEXT---------- ------------------------------ --------------------------------------------------------------------------------
ZLM    VIEW_1             select "TABLE_NAME","TABLESPACE_NAME","CLUSTER_NAME","IOT_NAME","STATUS","PCT_FR                     EE","PCT_USED","INI_TRANS","MAX_TRANS","INITIAL_EXTENT","NEXT_EXTENT","MIN_EXTEN                     TS","MAX_EXTENTS","PCT_INCREASE","FREELISTS","FREELIST_GROUPS","LOGGING","BACKED                     _UP","NUM_ROWS","BLOCKS","EMPTY_BLOCKS","AVG_SPACE","CHAIN_CNT","AVG_ROW_LEN","A                     VG_SPACE_FREELIST_BLOCKS","NUM_FREELIST_BLOCKS","DEGREE","INSTANCES","CACHE","TA                     BLE_LOCK","SAMPLE_SIZE","LAST_ANALYZED","PARTITIONED","IOT_TYPE","TEMPORARY","SE                     CONDARY","NESTED","BUFFER_POOL","ROW_MOVEMENT","GLOBAL_STATS","USER_STATS","DURA                     TION","SKIP_CORRUPT","MONITORING","CLUSTER_OWNER","DEPENDENCIES","COMPRESSION","                     DROPPED" from user_tables

該方法可以滿足需求,但每次有新的視圖被創(chuàng)建時,需要 drop 并重建表,比較繁瑣。

workaround:創(chuàng)建物化視圖來代替中間表。

-- 創(chuàng)建物化視圖
SQL> create materialized view my_mviews 
refresh force 
on demand 
start with sysdate
next sysdate + 10 /(24*60)
as 
select owner,view_name,to_lob(text) text from dba_views; 2  3  4  5  6  7 
Materialized view created.
-- 創(chuàng)建測試視圖2
SQL> CREATE VIEW VIEW_2 AS SELECT * FROM USER_TABLES;
View created.
-- 查看是否捕獲到 view_2 視圖
SQL> select owner,view_name,text from my_mviews where owner not in('SYS', 'SYSTEM', 'SYSMAN', 'OUTLN', 'DIP', 'TSMSYS', 'DBSNMP',
     'ORACLE_OCM', 'WMSYS', 'EXFSYS', 'XDB', 'ANONYMOUS', 'ORDSYS',
     'ORDPLUGINS', 'SI_INFORMTN_SCHEMA', 'MDSYS', 'MGMT_VIEW', 'PERFSTAT',
     'DMSYS', 'CTXSYS', 'OLAPSYS', 'MDDATA', 'APPQOSSYS', 'XS$NULL',
     'ORDDATA', 'SPATIAL_WFS_ADMIN_USR', 'SPATIAL_CSW_ADMIN_USR',
     'OWBSYS', 'APEX_PUBLIC_USER', 'APEX_030200', 'FLOWS_FILES', 'SCOTT',
     'OMS', 'OWBSYS_AUDIT', 'DSG', 'DBMGR', 'PATROL', 'SPA', 'GOLDENGATE',
     'DBADM') and (text like '%USER_TAB_COLUMNS%' or text like '%user_tab_columns%' or text like '%USER%TABLES%' or text like '%user%tables%' or text like '%ALL_TAB_COLUMNS%' or text like '%ALL_tab_columns%' or text like '%ALL%TABLES%' or text like '%ALL%tables%'); 2  3  4  5  6  7  8 
OWNER   VIEW_NAME           TEXT
---------- ------------------------------ --------------------------------------------------------------------------------
ZLM    VIEW_1             select "TABLE_NAME","TABLESPACE_NAME","CLUSTER_NAME","IOT_NAME","STATUS","PCT_FR
                     EE","PCT_USED","INI_TRANS","MAX_TRANS","INITIAL_EXTENT","NEXT_EXTENT","MIN_EXTEN
                     TS","MAX_EXTENTS","PCT_INCREASE","FREELISTS","FREELIST_GROUPS","LOGGING","BACKED
                     _UP","NUM_ROWS","BLOCKS","EMPTY_BLOCKS","AVG_SPACE","CHAIN_CNT","AVG_ROW_LEN","A
                     VG_SPACE_FREELIST_BLOCKS","NUM_FREELIST_BLOCKS","DEGREE","INSTANCES","CACHE","TA
                     BLE_LOCK","SAMPLE_SIZE","LAST_ANALYZED","PARTITIONED","IOT_TYPE","TEMPORARY","SE
                     CONDARY","NESTED","BUFFER_POOL","ROW_MOVEMENT","GLOBAL_STATS","USER_STATS","DURA
                     TION","SKIP_CORRUPT","MONITORING","CLUSTER_OWNER","DEPENDENCIES","COMPRESSION","
                     DROPPED" from user_tables
-- 查看物化視圖刷新時間  
SQL> select owner,mview_name,last_refresh_type,last_refresh_date from user_mviews;
OWNER   MVIEW_NAME           LAST_REF LAST_REFRESH_DATE
---------- ------------------------------ -------- -------------------
ZLM    MY_MVIEWS           COMPLETE 2023-08-03 16:07:15
-- 手動刷新物化視圖
SQL> exec dbms_mview.refresh('my_mviews');
PL/SQL procedure successfully completed.
SQL> select owner,mview_name,last_refresh_type,last_refresh_date from user_mviews;
OWNER   MVIEW_NAME           LAST_REF LAST_REFRESH_DATE
---------- ------------------------------ -------- -------------------
ZLM    MY_MVIEWS           COMPLETE 2023-08-03 16:21:45
-- 再次查詢物化視圖,此時 view_2 也能被捕獲到了,這樣就無需重復建表,當有新視圖被創(chuàng)建的時候,只需手動刷新物化視圖即可
SQL> select owner,view_name,text from my_mviews where owner not in('SYS', 'SYSTEM', 'SYSMAN', 'OUTLN', 'DIP', 'TSMSYS', 'DBSNMP',
     'ORACLE_OCM', 'WMSYS', 'EXFSYS', 'XDB', 'ANONYMOUS', 'ORDSYS',
     'ORDPLUGINS', 'SI_INFORMTN_SCHEMA', 'MDSYS', 'MGMT_VIEW', 'PERFSTAT',
     'DMSYS', 'CTXSYS', 'OLAPSYS', 'MDDATA', 'APPQOSSYS', 'XS$NULL',
     'ORDDATA', 'SPATIAL_WFS_ADMIN_USR', 'SPATIAL_CSW_ADMIN_USR',
     'OWBSYS', 'APEX_PUBLIC_USER', 'APEX_030200', 'FLOWS_FILES', 'SCOTT',
     'OMS', 'OWBSYS_AUDIT', 'DSG', 'DBMGR', 'PATROL', 'SPA', 'GOLDENGATE',
     'DBADM') and (text like '%USER_TAB_COLUMNS%' or text like '%user_tab_columns%' or text like '%USER%TABLES%' or text like '%user%tables%' or text like '%ALL_TAB_COLUMNS%' or text like '%ALL_tab_columns%' or text like '%ALL%TABLES%' or text like '%ALL%tables%'); 2  3  4  5  6  7  8 
OWNER   VIEW_NAME           TEXT
---------- ------------------------------ --------------------------------------------------------------------------------
ZLM    VIEW_1             select "TABLE_NAME","TABLESPACE_NAME","CLUSTER_NAME","IOT_NAME","STATUS","PCT_FR
                     EE","PCT_USED","INI_TRANS","MAX_TRANS","INITIAL_EXTENT","NEXT_EXTENT","MIN_EXTEN
                     TS","MAX_EXTENTS","PCT_INCREASE","FREELISTS","FREELIST_GROUPS","LOGGING","BACKED
                     _UP","NUM_ROWS","BLOCKS","EMPTY_BLOCKS","AVG_SPACE","CHAIN_CNT","AVG_ROW_LEN","A
                     VG_SPACE_FREELIST_BLOCKS","NUM_FREELIST_BLOCKS","DEGREE","INSTANCES","CACHE","TA
                     BLE_LOCK","SAMPLE_SIZE","LAST_ANALYZED","PARTITIONED","IOT_TYPE","TEMPORARY","SE
                     CONDARY","NESTED","BUFFER_POOL","ROW_MOVEMENT","GLOBAL_STATS","USER_STATS","DURA
                     TION","SKIP_CORRUPT","MONITORING","CLUSTER_OWNER","DEPENDENCIES","COMPRESSION","
                     DROPPED" from user_tables
ZLM    VIEW_2             select "TABLE_NAME","TABLESPACE_NAME","CLUSTER_NAME","IOT_NAME","STATUS","PCT_FR
                     EE","PCT_USED","INI_TRANS","MAX_TRANS","INITIAL_EXTENT","NEXT_EXTENT","MIN_EXTEN
                     TS","MAX_EXTENTS","PCT_INCREASE","FREELISTS","FREELIST_GROUPS","LOGGING","BACKED
                     _UP","NUM_ROWS","BLOCKS","EMPTY_BLOCKS","AVG_SPACE","CHAIN_CNT","AVG_ROW_LEN","A
                     VG_SPACE_FREELIST_BLOCKS","NUM_FREELIST_BLOCKS","DEGREE","INSTANCES","CACHE","TA
                     BLE_LOCK","SAMPLE_SIZE","LAST_ANALYZED","PARTITIONED","IOT_TYPE","TEMPORARY","SE
                     CONDARY","NESTED","BUFFER_POOL","ROW_MOVEMENT","GLOBAL_STATS","USER_STATS","DURA
                     TION","SKIP_CORRUPT","MONITORING","CLUSTER_OWNER","DEPENDENCIES","COMPRESSION","
                     DROPPED" from USER_TABLES

解決方案

將存儲過程中的 user_tab_columns 視圖替換成 all_tab_columns,雖然可作為臨時方案,不過存在以下缺點:

  • 需要修改業(yè)務代碼,即替換存儲過程中查詢相關系統(tǒng)視圖的部分。
  • 使用同義詞來訪問對象的用戶,需要有 SELECT ANY TABLE 的系統(tǒng)權限,否則即便使用 all_ 的視圖,也查詢不到目標對象。
  • 賦予執(zhí)行用戶 dba 權限,并修改原有查詢 SQL,增加 owner='XXX' 的條件(存在安全隱患,不推薦)。
  • OB 能提供一個 hotfix patch 來徹底解決該問題。

問題總結

在 OB 中,普通用戶查詢 USER_TAB_COLUMNS 系統(tǒng)視圖權限的邏輯與 Oracle 并不一致,導致查詢結果有差異。

除了 USER_TAB_COLUMNS 視圖,還有其他以 USER_ 開頭的視圖,也存在類似的問題,比如:USER_SYNONYMS、USER_TABLES 等。

對于系統(tǒng)中已有的對象,應盡快排查并確認在哪些對象中用到了這些系統(tǒng)視圖,在該問題被徹底修復前,建議先對相關代碼進行臨時修改,使其能繼續(xù)完成后續(xù)的功能驗證。

以上就是OB Oracle系統(tǒng)視圖權限導致的故障解決案例的詳細內容,更多關于OB Oracle視圖權限故障解決的資料請關注腳本之家其它相關文章!

相關文章

  • Oracle查看執(zhí)行計劃的實現(xiàn)

    Oracle查看執(zhí)行計劃的實現(xiàn)

    查看Oracle 的執(zhí)行計劃的目的是為了了解 SQL 查詢或語句在數(shù)據(jù)庫中的執(zhí)行方式和性能表現(xiàn),本文主要介紹了Oracle查看執(zhí)行計劃的實現(xiàn),感興趣的可以了解一下
    2024-02-02
  • Oracle Decode()函數(shù)使用技巧分享

    Oracle Decode()函數(shù)使用技巧分享

    decode()函數(shù)是ORACLE PL/SQL是功能強大的函數(shù)之一,目前還只有ORACLE公司的SQL提供了此函數(shù),其他數(shù)據(jù)庫廠商的SQL實現(xiàn)還沒有此功能
    2013-05-05
  • Oracle登錄時忘記用戶名或密碼該如何解決

    Oracle登錄時忘記用戶名或密碼該如何解決

    這篇文章主要介紹了如何在Oracle?12c中忘記用戶名和密碼時找回或重置用戶賬戶信息,文中通過代碼介紹的非常詳細,對同樣遇到這個問題的同學具有一定的參考借鑒價值,需要的朋友可以參考下
    2025-03-03
  • Oracle數(shù)據(jù)庫創(chuàng)建本地用戶、授予權限、創(chuàng)建表并插入數(shù)據(jù)實例代碼

    Oracle數(shù)據(jù)庫創(chuàng)建本地用戶、授予權限、創(chuàng)建表并插入數(shù)據(jù)實例代碼

    這篇文章主要介紹了Oracle多租戶架構中用戶類型的分類、創(chuàng)建用戶的方法、表空間管理、用戶權限分配、登錄配置以及腳本創(chuàng)建等操作的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • Oracle 數(shù)據(jù)庫自動存儲管理-安裝配置

    Oracle 數(shù)據(jù)庫自動存儲管理-安裝配置

    關于ASM的討論很多,但是到底什么是ASM?ASM是一個有效的抽象層,使你的Oracle數(shù)據(jù)庫可以與叫做diskgroups的抽象空間一起使用,而不是直接使用datafiles。
    2009-05-05
  • Oracle使用rownum分頁方式實例代碼

    Oracle使用rownum分頁方式實例代碼

    ROWNUM是一個序列,是oracle數(shù)據(jù)庫從數(shù)據(jù)文件或緩沖區(qū)中讀取數(shù)據(jù)的順序,這篇文章主要給大家介紹了關于Oracle使用rownum分頁的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Oracle 數(shù)據(jù)顯示 橫表轉縱表

    Oracle 數(shù)據(jù)顯示 橫表轉縱表

    橫表轉縱表亦可用與decode意義相似的case語句實現(xiàn),原理同該語句,這里不再過多描述。
    2009-07-07
  • Oracle數(shù)據(jù)庫密碼復雜度校驗腳本utlpwdmg.sql詳細解析

    Oracle數(shù)據(jù)庫密碼復雜度校驗腳本utlpwdmg.sql詳細解析

    我們都知道密碼策略加固的參數(shù)一般包括密碼長度、復雜度檢測、最大最小使用時間、過期警報時間、最大登錄失敗次數(shù)以及鎖定時間等設置,下面這篇文章主要給大家介紹了關于Oracle數(shù)據(jù)庫密碼復雜度校驗腳本utlpwdmg.sql詳細解析的相關資料,需要的朋友可以參考下
    2024-04-04
  • 使用PLSQL查看表屬性亂碼的解決方法

    使用PLSQL查看表屬性亂碼的解決方法

    PL/SQL是Oracle數(shù)據(jù)庫的編程語言,用于編寫存儲過程、觸發(fā)器、函數(shù)等,今天用plsql想查看表的屬性,看看各個字段的注釋,可是打開一看,居然是亂碼的,所以接下來本文給大家介紹了使用PLSQL查看表屬性亂碼的解決方法,需要的朋友可以參考下
    2024-03-03
  • Oracle中Union與Union All的區(qū)別(適用多個數(shù)據(jù)庫)

    Oracle中Union與Union All的區(qū)別(適用多個數(shù)據(jù)庫)

    如果我們需要將兩個select語句的結果作為一個整體顯示出來,我們就需要用到union或者union all關鍵字。union(或稱為聯(lián)合)的作用是將多個結果合并在一起顯示出來
    2012-07-07

最新評論