日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

使用 Authid Current_User 為調(diào)用者授權(quán)

 隱形的翅膀 2007-12-19
 
我在一些技術(shù)論壇里面,常??吹接信笥褑?wèn)這種問(wèn)題: 為什么我的用戶具有DBA權(quán)限,卻無(wú)法在存儲(chǔ)過(guò)程里面創(chuàng)建一張普通表呢?
 
下面就結(jié)合具體案例來(lái)談?wù)勥@個(gè)問(wèn)題:
 
SQL> conn eric/eric;
Connected.
SQL> select * from dba_role_privs where grantee=‘ERIC‘;
 
GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
ERIC                           DBA                            NO  YES
ERIC                           CONNECT                        NO  YES
ERIC                           RESOURCE                       NO  YES
ERIC                           RECOVERY_CATALOG_OWNER         NO  YES
可以看到,用戶eric擁有 DBA 權(quán)限!
 
 
用此用戶創(chuàng)建一個(gè)存儲(chǔ)過(guò)程:
create or replace procedure p_CreateTable
as
begin
 execute immediate ‘create table test_tb(id number)‘;
end p_CreateTable;
/
Procedure created.

運(yùn)行時(shí)會(huì)發(fā)現(xiàn),系統(tǒng)提示權(quán)限不足(insufficient privileges)!
SQL> exec p_CreateTable;
BEGIN p_CreateTable; END;
 
*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "ERIC.P_CREATETABLE", line 3
ORA-06512: at line 1

 
由上可以看到,即使擁有DBA role,也不能創(chuàng)建表。
role在存儲(chǔ)過(guò)程中不可見(jiàn)!

查閱資料發(fā)現(xiàn):
Oracle8i以前的版本,所有已編譯存儲(chǔ)對(duì)象,包括packages, procedures, functions, triggers, views等,只能以定義者(Definer)身份解析運(yùn)行;
而Oracle8i及其后的新版本,Oracle引入調(diào)用者(invoker)權(quán)限,使得對(duì)象可以以調(diào)用者身份和權(quán)限執(zhí)行。

遇到這種情況,通常解決方法是進(jìn)行顯式的系統(tǒng)權(quán)限: grant create table to eric;
但是,此方法太笨,因?yàn)橛锌赡軋?zhí)行一個(gè)存儲(chǔ)過(guò)程,需要很多不同權(quán)限(oracle對(duì)權(quán)限劃分粒度越來(lái)越細(xì))。
 
最好的方法是,利用 oracle 提供的方法,在創(chuàng)建存儲(chǔ)過(guò)程時(shí),加入 Authid Current_User 條件進(jìn)行權(quán)限分配。
 
create or replace procedure p_CreateTable Authid Current_User
as
begin
 execute immediate ‘create table test_tb(id number)‘;
end p_CreateTable;
/
Procedure created.
 
SQL> exec p_CreateTable;
 
PL/SQL procedure successfully completed.

SQL> desc test_tb
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER

 成功啦?。?!
 

由此可以引申出一個(gè)問(wèn)題:
 
如果用戶B要執(zhí)行A用戶的某存儲(chǔ)過(guò)程,傳統(tǒng)的解決方案是:
 
A用戶將此存儲(chǔ)過(guò)程的執(zhí)行權(quán)限賦予B用戶:
grant execute on p_test to B;
 
在B用戶下創(chuàng)建一個(gè)同義詞:
create synonym p_test for a.p_test;
 
然后B用戶就可以直接執(zhí)行p_test了.

但是,如果使用 Authid Current_User 選項(xiàng),在創(chuàng)建時(shí)給調(diào)用者授權(quán),就簡(jiǎn)單多了!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多