查詢沒有許可權但資料字典中顯示有許可權
系統中可能會碰到查詢資料沒有許可權,但是從資料字典中檢視卻顯示包含查詢許可權的情況。
先看一下問題:
SQL> CONN U3/U3@YTK已連線。
SQL> SELECT SYNONYM_NAME, TABLE_OWNER, TABLE_NAME FROM USER_SYNONYMS
2 WHERE SYNONYM_NAME = 'V_T2';
SYNONYM_NAME TABLE_OWNER TABLE_NAME
------------------------------ ------------------------------ ----------------
V_T2 U2 V_T2
SQL> SELECT COUNT(*) FROM V_T2;
SELECT COUNT(*) FROM V_T2
*第 1 行出現錯誤:
ORA-01031: 許可權不足
SQL> SELECT GRANTEE, OWNER, TABLE_NAME, GRANTOR, PRIVILEGE
2 FROM USER_TAB_PRIVS
3 WHERE TABLE_NAME = 'V_T2';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE
-------- ------ ------------------------------ -------- ----------------------
U3 U2 V_T2 U2 SELECT
SQL> CONN U2/U2@YTK已連線。
SQL> SELECT COUNT(*) FROM V_T2;
COUNT(*)
----------
40834
現在問題已經出來了,U2可以正常訪問,而且U2也對U3進行了授權,但是U3無法進行訪問。
其實問題的產生很簡單,V_T2本身並不是一個表,而是一個檢視,這個檢視訪問其他使用者的物件。這個時候U2不僅需要SELECT許可權,為了讓U3可以訪問自己建立的檢視,U2需要SELECT WITH GRANT OPTION。
如果U2使用者丟失了這個許可權,且在重現獲取許可權時只獲取到SELECT許可權,而沒有WITH GRANT OPTION,就會造成上面的問題。
透過一個例子來描述這個問題:
SQL> CONN YANGTK/YANGTK@YTK已連線。
SQL> DROP USER U1 CASCADE;
使用者已刪除。
SQL> DROP USER U2 CASCADE;
使用者已刪除。
SQL> DROP USER U3 CASCADE;
使用者已刪除。
SQL> CREATE USER U1 IDENTIFIED BY U1 DEFAULT TABLESPACE YANGTK;
使用者已建立。
SQL> CREATE USER U2 IDENTIFIED BY U2 DEFAULT TABLESPACE YANGTK;
使用者已建立。
SQL> CREATE USER U3 IDENTIFIED BY U3 DEFAULT TABLESPACE YANGTK;
使用者已建立。
SQL> GRANT CONNECT, RESOURCE TO U1;
授權成功。
SQL> GRANT CONNECT, RESOURCE TO U2;
授權成功。
SQL> GRANT CONNECT, RESOURCE TO U3;
授權成功。
SQL> GRANT CREATE VIEW TO U1;
授權成功。
SQL> GRANT CREATE VIEW, CREATE SYNONYM TO U2;
授權成功。
SQL> GRANT CREATE VIEW, CREATE SYNONYM TO U3;
授權成功。
SQL> CONN U1/U1@YTK已連線。
SQL> CREATE TABLE T AS SELECT * FROM ALL_OBJECTS;
表已建立。
SQL> GRANT SELECT ON T TO U2 WITH GRANT OPTION;
授權成功。
SQL> CONN U2/U2@YTK已連線。
SQL> CREATE SYNONYM T FOR U1.T;
同義詞已建立。
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
40834
SQL> CREATE VIEW V_T2 AS SELECT * FROM U1.T;
檢視已建立。
SQL> GRANT SELECT ON T TO U3;
授權成功。
SQL> GRANT SELECT ON V_T2 TO U3;
授權成功。
SQL> CONN U3/U3@YTK已連線。
SQL> CREATE SYNONYM T FOR U2.T;
同義詞已建立。
SQL> CREATE SYNONYM V_T2 FOR U2.V_T2;
同義詞已建立。
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
40834
SQL> SELECT COUNT(*) FROM V_T2;
COUNT(*)
----------
40834
現在就將測試的環境建立好了,使用者U1建立T表並對U2授權查詢同時執行T2將T表的訪問許可權授權給其他使用者。
U2建立一個同義詞指向T表,同時建立了一個檢視查詢T表。
U2將T表的查詢許可權和檢視V_T2的查詢許可權授權給U3。
U3可以訪問T表和V_T2檢視。
下面看看資料字典中的許可權:
SQL> CONN YANGTK/YANGTK@YTK已連線。
SQL> SELECT GRANTEE, OWNER, TABLE_NAME, GRANTOR, PRIVILEGE, GRANTABLE
2 FROM DBA_TAB_PRIVS
3 WHERE OWNER IN ('U1', 'U2');
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA
-------- ------ ---------- -------- ---------- ---
U2 U1 T U1 SELECT YES
U3 U1 T U2 SELECT NO
U3 U2 V_T2 U2 SELECT NO
刪除T表,重建後只賦予U2使用者SELECT許可權:
SQL> CONN U1/U1@YTK已連線。
SQL> DROP TABLE T PURGE;
表已刪除。
SQL> CREATE TABLE T AS SELECT * FROM ALL_OBJECTS;
表已建立。
SQL> GRANT SELECT ON T TO U2;
授權成功。
SQL> CONN YANGTK/YANGTK@YTK已連線。
SQL> SELECT GRANTEE, OWNER, TABLE_NAME, GRANTOR, PRIVILEGE, GRANTABLE
2 FROM DBA_TAB_PRIVS
3 WHERE OWNER IN ('U1', 'U2');
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA
-------- ------ ---------- -------- ---------- ---
U3 U2 V_T2 U2 SELECT NO
U2 U1 T U1 SELECT NO
可以看到U3從U2出獲取的T表的查詢許可權被連帶刪除,但是U3仍然有U2授權的V_T2的查詢許可權,不過這個時候U3已經無法查詢U2的V_T2檢視了:
SQL> CONN U3/U3@YTK已連線。
SQL> SELECT COUNT(*) FROM V_T2;
SELECT COUNT(*) FROM V_T2
*第 1 行出現錯誤:
ORA-01031: 許可權不足
SQL> CONN U2/U2@YTK已連線。
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
40834
SQL> SELECT COUNT(*) FROM V_T2;
COUNT(*)
----------
40834
這就是開始看到的現象,雖然資料字典中顯示U3有訪問U2物件的許可權,且U2的物件可以正常訪問,但是U3實際上已經沒有訪問物件的許可權了。
而且,這個時候U2也無法再次授權給U3了:
SQL> GRANT SELECT ON V_T2 TO U3;
GRANT SELECT ON V_T2 TO U3
*第 1 行出現錯誤:
ORA-01720: 不存在 'U1.T' 的授權選項
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69461/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Laravel 日誌有時候有許可權有時候沒有許可權?Laravel
- MySQL如何查詢all有哪些許可權?MySql
- win10複製檔案顯示沒有許可權怎麼辦_win10複製檔案顯示沒有許可權解決方法Win10
- Linux 特殊許可權a,i,t,s以及查詢帶有特殊許可權的所有檔案Linux
- 許可權系統:一文搞懂功能許可權、資料許可權
- UserService 查詢使用者沒許可權的索引,增加臨時許可權queryIndicesNoPermission分析索引
- mongoDB安裝時提示沒有許可權MongoDB
- Nginx報錯:Permission denied,沒有許可權!Nginx
- 有贊許可權系統
- ubuntu 安裝onethink沒有目錄許可權Ubuntu
- 許可權之選單許可權
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- 為什麼win10沒有管理員許可權_win10沒有管理員許可權的解決方法Win10
- MySql查詢使用者許可權MySql
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- mac安裝swoole的時候沒有許可權Mac
- mysql 給了使用者所有許可權ALL PRIVILEGES,但是該使用者沒有grant許可權MySql
- 使用LDAP查詢快速提升域許可權LDA
- 【專案實踐】一文帶你搞定頁面許可權、按鈕許可權以及資料許可權
- SpringSecurity許可權管理系統實戰—九、資料許可權的配置SpringGse
- UserService 查詢使用者有許可權的關聯索引 queryIndexPatternByUserName分析索引Index
- UserService 查詢使用者查詢許可權 isGlobalQuery分析
- 新建外掛,提示沒有許可權,請大家幫看看。
- Linux特殊許可權之suid、sgid、sbit許可權LinuxUI
- win10賬號沒有管理員許可權如何解決_win10賬號沒有管理員許可權解決步驟Win10
- 協同平臺檢視許可權開啟業務物件提示"當前使用者沒有許可權!請檢查使用者[BOS設計器]的[編輯]許可權與應用的編輯許可權!"物件
- Linux雜記 查詢與特殊許可權位Linux
- mysql許可權MySql
- 許可權控制
- Linux許可權Linux
- 資料庫的許可權管理資料庫
- 資料分析的許可權控制
- android動態許可權到自定義許可權框架Android框架
- 選單許可權和按鈕許可權設定
- Linux的檔案存取許可權和0644許可權Linux
- OA管理系統,有哪些許可權管理?
- 讓root使用者有super許可權
- odoo提示你沒有檢視此類文件的許可權Odoo
- win11解除安裝軟體提示沒有許可權