oracle数据库权限之二――定义者权限与调用者权限
参考: http://blog.itpub.net/7607759/viewspace-166557/ http://blog.itpub.net/7607759/viewspace-166558 http://blog.163.com/l_yongfei/blog/static/265673042009420103210297/ 正如大家所知,Oracle从8i开始引入了调用者权限体系结构,之前一直使用定义者权限体系结构。 一、简单介绍一下二者的使用方法 oracle创建存储过程时,若不指定authid参数,则调用权限验证默认是definer,也就是存储过程执行时,以这个存储过程的创建者的身份来验 证存取权限;可以在创建存储过程时指定authid为current_user,从而在执行存储过程时根据当前调用存储过程的用户权限来验证。 二、定义者权限与调用者权限之间差异 关于定义者权限与调用者权限之间的相通点或者是各自优势本文不做探讨,这里仅描述调用者权限与定义者权限之间的差异,在我看来,主要有三个方面: 1、执行的schema不同,操作的对象也不同 l在定义者(definer)权限下,执行的用户操作的schema为定义者,所操作的对象是定义者在编译时指定的对象。 l在调用者(invoker)权限下,执行的用户操作的schema为当前用户,所操作的对象是当前模式下的对象。 例如: E:ora10g>sqlplus"/assysdba" 连接到: OracleDatabase10gEnterpriseEditionRelease10.2.0.3.0-Production WiththePartitioning,OLAPandDataMiningoptions SQL>createusertmpaidentifiedbytmpa; 用户已创建。 SQL>grantconnect,resourcetotmpa; 授权成功。 SQL>createusertmpbidentifiedbytmpb; SQL>conntmpa/tmpa 已连接。 SQL>setsqlpromptTMPA> TMPA>createtabletmptbl(strvarchar2(50)); 表已创建。 TMPA>insertintotmptblvalues('I''mowneredbyuser:tmpa'); 已创建1行。 TMPA>commit; 提交完成。 TMPA>createorreplaceproceduredefiner_procas 2begin 3forxin(selectsys_context('userenv','current_user')current_user, 4sys_context('userenv','session_user')session_user,230);">5sys_context('userenv','current_schema')current_schema,230);">6str 7fromtmptbl)loop 8dbms_output.put_line('CurrentUser:'||x.current_user); 9dbms_output.put_line('SessionUser:'||x.session_user); 10dbms_output.put_line('CurrentSchema:'||x.current_schema); 11dbms_output.put_line('TablesValue:'||x.str); 12endloop; 13end; 14/ 过程已创建。 TMPA>createorreplaceprocedureinvoker_procAUTHIDCURRENT_USERas TMPA>setserveroutputon TMPA>grantexecuteondefiner_proctotmpb; TMPA>grantexecuteoninvoker_proctotmpb; TMPA>execdefiner_proc; CurrentUser:TMPA SessionUser:TMPA CurrentSchema:TMPA TablesValue:I'mowneredbyuser:tmpa PL/SQL过程已成功完成。 TMPA>execinvoker_proc; 可以看到,对于owner所拥有的对象,当前用户和session用户都是当前执行过程的用户; 新开一个连接,以tmpb用户登陆再执行看看: E:ora10g>sqlplustmpb/tmpb SQL>setsqlpromptTMPB> TMPB>createtabletmptbl(strvarchar2(50)); TMPB>insertintotmptblvalues('I''mowneredbyuser:tmpb'); TMPB>commit; TMPB>setserveroutputon TMPB>exectmpa.definer_proc; SessionUser:TMPB TMPB>exectmpa.invoker_proc; CurrentUser:TMPB CurrentSchema:TMPB TablesValue:I'mowneredbyuser:tmpb 调用非owner的过程,对于定义者权限的过程,虽然session是tmpb,但当前用户仍然是tmpa,访问的对象也是tmpa的表,而对于调用者权限的过程,当前session和用户都是当前执行过程的用户tmpb,而且访问的对象也是当前用户的对象。 2、执行的权限不同 l在定义者(definer)权限下,当前用户的权限为角色无效情况下所拥有的权限。 l在调用者(invoker)权限下,当前用户的权限为当前所拥有的权限(含角色)。 仍用前文中的用户 TMPA>createorreplaceprocedurecreatetbl_defineras 3executeimmediate'createtabletmptbl2(idnumber)'; 4end; 5/ TMPA>createorreplaceprocedurecreatetbl_invokerAUTHIDCURRENT_USERas 首先执行定义者权限过程: TMPA>execcreatetbl_definer; BEGINcreatetbl_definer;END; * 第1行出现错误: ORA-01031:权限不足 ORA-06512:在"TMPA.CREATETBL_DEFINER",line3 ORA-06512:在line1 由于角色无效,相当于当前用户没有了建表权限,因此创建失败,这也正是为什么过程中执行DDL语句需要显示授权的原因。 TMPA>execcreatetbl_invoker; TMPA>desctmptbl2 名称是否为空?类型 ----------------------------------------------------------------------------- IDNUMBER 执行调用者权限过程,能够成功创建! 3、执行的效率不同 l在定义者(definer)权限下,过程被静态编译静态执行(相对而言),所执行sql语句在共享区池中是可被共享使用的 l在调用者(invoker)权限下,过程静态编译,但动态执行,虽然执行的语句相同,但不同用户执行,其sql语句在共享池中并不能共享。 归根结底,正如tom所说,调用者权限体系结构的确拥有非常强大的功能,但只有当你使用得当时才能感受到其优势。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |