Oracle數(shù)據(jù)庫視圖與權(quán)限問題

字號:


    有三個用戶test1,test2,test3, 三個用戶都具有DBA色色權(quán)限。
    用TEST1用戶創(chuàng)建一個表T1,并將其查詢權(quán)限授予TEST2:
    SQL> create table t1 as select * from all_objects;
    表已創(chuàng)建。
    SQL> grant select on t1 to test2;
    授權(quán)成功。
    SQL> create table t1 as select * from all_objects;
    表已創(chuàng)建。
    SQL> grant select on t1 to test2;
    授權(quán)成功。
    用TEST2用戶創(chuàng)建一個視圖,視圖的基表是TEST1.T1,并將查詢權(quán)限授予TEST3:
    SQL> create view v_t1 as select * from test1.t1;
    視圖已建立。
    SQL> grant select on v_t1 to test3;
    授權(quán)成功。
    SQL> create view v_t1 as select * from test1.t1;
    視圖已建立。
    SQL> grant select on v_t1 to test3;
    授權(quán)成功。
    TEST3用戶查詢視圖TEST2.V_T1:
    SQL> select * from test2.v_t1 where rownum<1;
    select * from test2.v_t1 where rownum<1
    *
    ERROR 位于第 1 行:
    ORA-01031: 權(quán)限不足
    SQL> select * from test2.v_t1 where rownum<1;
    select * from test2.v_t1 where rownum<1
    *
    ERROR 位于第 1 行:
    ORA-01031: 權(quán)限不足
    可以看到報了權(quán)限不足的錯誤,就算這里TEST3用戶有DBA權(quán)限。
    這到底是怎么回事呢?
    其實(shí)視圖的權(quán)限,有兩點(diǎn)需要引起注意:
    1. 視圖中,類似于定義者權(quán)限的存儲過程,是屏蔽了角色權(quán)限的。比如如果TEST1沒有顯式地將T1表的SELECT權(quán)限給予TEST2,那么TEST2在創(chuàng)建視圖V_T1時也會報ORA-01031錯誤,即使TEST2用戶擁有DBA角色權(quán)限。
    2.如果在用戶A的視圖中,引用了其他用戶B的表,用戶A將視圖的訪問權(quán)限給予用戶C,那么就變相地將用戶B的表的訪問權(quán)限給予了用戶C,因此,用戶A必須有將用戶B的表的訪問權(quán)限轉(zhuǎn)授用戶C的權(quán)限,也就是用戶B在授予A權(quán)限時,必須使用with grant option。
    顯然這里正是由于第2點(diǎn)的原因,導(dǎo)致用戶TEST3不能訪問視圖。用戶TEST1執(zhí)行下面的操作,將解決這個問題:
    SQL> grant select on t1 to test2 with grant option;
    授權(quán)成功。
    SQL> grant select on t1 to test2 with grant option;
    授權(quán)成功。
    對于視圖的UPDATE,DELETE權(quán)限,同樣是如此。
    在測試時,有一個現(xiàn)象,有點(diǎn)意思。就是如果用戶TEST2沒有顯式地把V_T1的SELECT權(quán)限授予TEST3,而TEST3在有SELECT ANY TABLE或DBA權(quán)限時,則查詢這個視圖時不會報權(quán)限不足的錯誤。由于有SELECT ANY TABLE權(quán)限的存在,所有的用戶表都可以被訪問。但是顯式授予表的權(quán)限時,似乎表的權(quán)限有更高的優(yōu)先級,并且沒有跟系統(tǒng)權(quán)限和角色權(quán)限進(jìn)行結(jié)合?;蛘甙姹静煌憩F(xiàn)得不一樣,在我的測試中,是Oracle 9.2.0.8 for Windows。