天天看點

oracle授權視圖資料庫,Oracle資料庫視圖與權限問題

【IT168 評論】前幾天客戶遇上這樣一個問題,某個使用者A将視圖的SELECT給予另一個使用者B,但是使用者B查詢這個視圖時,仍然報錯:ORA-01031: 權限不足。這是怎麼一回事呢?下面來模拟一下這個過程:

有三個使用者test1,test2,test3, 三個使用者都具有DBA色色權限。

用TEST1使用者建立一個表T1,并将其查詢權限授予TEST2:

SQL>createtablet1asselect*fromall_objects;

表已建立。

SQL>grantselectont1totest2;

授權成功。

SQL>createtablet1asselect*fromall_objects;

表已建立。

SQL>grantselectont1totest2;

授權成功。

用TEST2使用者建立一個視圖,視圖的基表是TEST1.T1,并将查詢權限授予TEST3:

SQL>createviewv_t1asselect*fromtest1.t1;

視圖已建立。

SQL>grantselectonv_t1totest3;

授權成功。

SQL>createviewv_t1asselect*fromtest1.t1;

視圖已建立。

SQL>grantselectonv_t1totest3;

授權成功。

TEST3使用者查詢視圖TEST2.V_T1:

SQL>select*fromtest2.v_t1whererownum<1;select*fromtest2.v_t1whererownum<1*ERROR 位于第1行:

ORA-01031: 權限不足

SQL>select*fromtest2.v_t1whererownum<1;select*fromtest2.v_t1whererownum<1*ERROR 位于第1行:

ORA-01031: 權限不足

可以看到報了權限不足的錯誤,就算這裡TEST3使用者有DBA權限。

這到底是怎麼回事呢?

其實視圖的權限,有兩點需要引起注意:

1. 視圖中,類似于定義者權限的存儲過程,是屏蔽了角色權限的。比如如果TEST1沒有顯式地将T1表的SELECT權限給予TEST2,那麼TEST2在建立視圖V_T1時也會報ORA-01031錯誤,即使TEST2使用者擁有DBA角色權限。

2.如果在使用者A的視圖中,引用了其他使用者B的表,使用者A将視圖的通路權限給予使用者C,那麼就變相地将使用者B的表的通路權限給予了使用者C,是以,使用者A必須有将使用者B的表的通路權限轉授使用者C的權限,也就是使用者B在授予A權限時,必須使用with grant option。

顯然這裡正是由于第2點的原因,導緻使用者TEST3不能通路視圖。使用者TEST1執行下面的操作,将解決這個問題:

SQL>grantselectont1totest2withgrantoption;

授權成功。

SQL>grantselectont1totest2withgrantoption;

授權成功。

對于視圖的UPDATE,DELETE權限,同樣是如此。

在測試時,有一個現象,有點意思。就是如果使用者TEST2沒有顯式地把V_T1的SELECT權限授予TEST3,而TEST3在有SELECT ANY TABLE或DBA權限時,則查詢這個視圖時不會報權限不足的錯誤。由于有SELECT ANY TABLE權限的存在,所有的使用者表都可以被通路。但是顯式授予表的權限時,似乎表的權限有更高的優先級,并且沒有跟系統權限和角色權限進行結合。或者版本不同,表現得不一樣,在我的測試中,是Oracle 9.2.0.8 for Windows。