非典型ORA-01720: grant option does not exist2020-08-20

現(xiàn)象

這個(gè)問(wèn)題來(lái)自于朋友工作中遇到的一個(gè)真實(shí)場(chǎng)景:
Oracle 11.2.0.4數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)用戶A:create any view颇蜡,select any table
數(shù)據(jù)庫(kù)用戶B:select any table
數(shù)據(jù)庫(kù)用戶C: 只讀用戶价说,有且僅有create session權(quán)限

執(zhí)行步驟:

  1. 數(shù)據(jù)庫(kù)用戶A在數(shù)據(jù)庫(kù)用戶B中創(chuàng)建了一張VIEW辆亏,VIEW的基表來(lái)自于多個(gè)數(shù)據(jù)庫(kù)用戶。
  2. 使用SYS用戶將VIEW的select權(quán)限授權(quán)給數(shù)據(jù)庫(kù)用戶C鳖目。
  3. 數(shù)據(jù)庫(kù)用戶B和數(shù)據(jù)庫(kù)用戶C均可正常查詢?cè)揤IEW扮叨。
  4. 數(shù)據(jù)庫(kù)用戶A再次執(zhí)行:create or replace view語(yǔ)句,結(jié)果報(bào)出:
    ORA-01720: grant option does not exist for 'TEST.T_OBJ'领迈。
  5. 數(shù)據(jù)庫(kù)用戶A新建一個(gè)VIEW(和老VIEW定義完全一致)彻磁,可以成功執(zhí)行。

重演過(guò)程

創(chuàng)建測(cè)試用戶

SQL> create user test0 identified by test;
grant create session to test0;
grant select any table to test0;
grant create any view to test0;

User created.

SQL> 
Grant succeeded.

SQL> 
Grant succeeded.

SQL> 
Grant succeeded.

SQL>create user test2 identified by test;
grant create session to test2;
grant select any table to test2;

SQL> 
User created.

SQL> 
Grant succeeded.

SQL> 
Grant succeeded.

SQL> create user test3 identified by test;
grant create session to test3;

SQL> 
Grant succeeded.

SQL> 
User created.

系統(tǒng)權(quán)限查詢:

SQL> select * from dba_sys_privs where grantee like 'TEST%' order by grantee,privilege;

GRANTEE                        PRIVILEGE                                ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
TEST0                          CREATE ANY VIEW                          NO
TEST0                          CREATE SESSION                           NO
TEST0                          SELECT ANY TABLE                         NO
TEST2                          CREATE SESSION                           NO
TEST2                          SELECT ANY TABLE                         NO
TEST3                          CREATE SESSION                           NO

為簡(jiǎn)化測(cè)試狸捅,測(cè)試視圖僅僅引用了test.t_obj表衷蜓,記錄有800多萬(wàn)條。

SQL> connect test0/test;
Connected.
SQL> create or replace view test2.v_t_obj as select * from test.t_obj;

View created.

SQL> connect test2/test;
Connected.
SQL> select count(*) from v_t_obj;

  COUNT(*)
----------
   8053248


SQL> connect /as sysdba;
Connected.
SQL> grant select on test2.v_t_obj to test3;

Grant succeeded.

SQL> connect test3/test
Connected.
SQL> select count(*) from test2.v_t_obj;

  COUNT(*)
----------
   8053248

至此尘喝,一切看起來(lái)均很正常磁浇。

表的權(quán)限如下:

SQL> select * from dba_tab_privs where grantee like 'TEST%';

GRANT OWNER TABLE_NAME                     GRANT PRIVILEGE  GRANTABLE HIERARCHY
----- ----- ------------------------------ ----- ---------- --------- ---------
TEST3 TEST2 V_T_OBJ                        TEST2 SELECT     NO        NO

SQL> select * from dba_sys_privs where grantee like 'TEST%' order by grantee,privilege;

GRANT PRIVILEGE                      ADMIN_OPTION
----- ------------------------------ ------------
TEST0 CREATE ANY VIEW                NO
TEST0 CREATE SESSION                 NO
TEST0 SELECT ANY TABLE               NO
TEST2 CREATE SESSION                 NO
TEST2 SELECT ANY TABLE               NO
TEST3 CREATE SESSION                 NO

重建視圖,問(wèn)題發(fā)生了:

SQL> connect test0/test;
Connected.
SQL> create or replace view test2.v_t_obj as select * from test.t_obj;
create or replace view test2.v_t_obj as select * from test.t_obj
                                                           *
ERROR at line 1:
ORA-01720: grant option does not exist for 'TEST.T_OBJ'

SQL> create view test2.v_t_obj_new as select * from test.t_obj;

View created.

測(cè)試到這里朽褪,結(jié)合常規(guī)場(chǎng)景中的視圖授權(quán)問(wèn)題置吓,初步可以斷定和表的select grant option策略有關(guān)。
進(jìn)一步繼續(xù)測(cè)試:

SQL> connect /as sysdba              
Connected.
SQL> revoke select on test2.v_t_obj from test3;

Revoke succeeded.

SQL> connect test0/test
Connected.
SQL> create or replace view test2.v_t_obj as select * from test.t_obj;

View created.

到這里時(shí)鞍匾,可以思考一下,以上的操作里骑科,有一步操作值得關(guān)注:

SQL> connect /as sysdba;
Connected.
SQL> grant select on test2.v_t_obj to test3;

Grant succeeded.

按照正常操作橡淑,一般view的授權(quán)會(huì)以VIEW的owner登錄數(shù)據(jù)庫(kù),然后直接grant咆爽。

SQL> connect test2/test
Connected.
SQL> grant select on test2.v_t_obj to test3;
grant select on test2.v_t_obj to test3
                      *
ERROR at line 1:
ORA-01720: grant option does not exist for 'TEST.T_OBJ'

問(wèn)題還是出在多用戶的級(jí)聯(lián)授權(quán)上梁棠,繼續(xù)往下探:

SQL> connect system
Enter password: 
Connected.
SQL> grant select on test2.v_t_obj to test3;
grant select on test2.v_t_obj to test3
                      *
ERROR at line 1:
ORA-01720: grant option does not exist for 'TEST.T_OBJ'

SQL> select * from dba_sys_privs where grantee like 'SYS%' and privilege = 'SELECT ANY TABLE' order by grantee,privilege;

GRANTEE    PRIVILEGE                      ADMIN_OPTION
---------- ------------------------------ ------------
SYS        SELECT ANY TABLE               YES
SYSTEM     SELECT ANY TABLE               NO

到了這里,問(wèn)題原因浮出水面:

with admin option

根據(jù)查詢官方文檔斗埂,發(fā)現(xiàn)有這么一段話:

You will get this ORA-1720 error when REPLACING a view that selects from some other user's tables and both of the following conditions are true:
 
- you have already granted select or other privileges on the VIEW to some other user
- the view owner does not have the GRANT option on the tables being selected from (or view owner may have some privilege with grant option but not others)
- 

The code was changed in 11.2.0.4 so that create view behavior is similar to grant. If you try to make a GRANT on an existing view and the view owner does not have the grant option, then ORA-1720 is the expected result (even in 11.2.0.3). In 11.2.0.4, we have simply made CREATE VIEW consistent with the GRANT behavior, i.e. if an incompatible grant exists, then the new view definition must not be allowed (even with FORCE). In other words, we do not allow incompatible grants to coexist with the view definition and so an error must be thrown. The behavior in release 11.2.0.3 (and earlier) was incorrect; the new behavior in 11.2.0.4 is intentional and correct. 

為了解決這一問(wèn)題符糊,建議對(duì)多用戶表或者視圖進(jìn)行級(jí)聯(lián)授權(quán)時(shí):

1. 不要使用SYS用戶執(zhí)行類(lèi)似操作
2. 使用常規(guī)方式進(jìn)行相關(guān)授權(quán)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市呛凶,隨后出現(xiàn)的幾起案子男娄,更是在濱河造成了極大的恐慌,老刑警劉巖漾稀,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件模闲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡崭捍,警方通過(guò)查閱死者的電腦和手機(jī)尸折,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)夯尽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)旷太,“玉大人孙乖,你說(shuō)我怎么就攤上這事访递。” “怎么了亮航?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荸实,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我塞赂,道長(zhǎng)泪勒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任宴猾,我火速辦了婚禮圆存,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仇哆。我一直安慰自己沦辙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布讹剔。 她就那樣靜靜地躺著油讯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪延欠。 梳的紋絲不亂的頭發(fā)上陌兑,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音由捎,去河邊找鬼兔综。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狞玛,可吹牛的內(nèi)容都是我干的软驰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼心肪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锭亏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起硬鞍,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤慧瘤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后固该,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碑隆,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年蹬音,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了上煤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡著淆,死狀恐怖劫狠,靈堂內(nèi)的尸體忽然破棺而出拴疤,到底是詐尸還是另有隱情,我是刑警寧澤独泞,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布呐矾,位于F島的核電站,受9級(jí)特大地震影響懦砂,放射性物質(zhì)發(fā)生泄漏蜒犯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一荞膘、第九天 我趴在偏房一處隱蔽的房頂上張望罚随。 院中可真熱鬧,春花似錦羽资、人聲如沸淘菩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)潮改。三九已至,卻和暖如春腹暖,著一層夾襖步出監(jiān)牢的瞬間汇在,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工脏答, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糕殉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓以蕴,卻偏偏與公主長(zhǎng)得像糙麦,于是被迫代替她去往敵國(guó)和親辛孵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丛肮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354