扫地不过是我表面上的工作,我真正的身份其实是无名老僧-----------手里那根扫把~

明确定义者权限与调用者权限(2)

上一篇 / 下一篇  2008-01-31 13:37:31 / 个人分类:三思笔记

接上篇~~~

2、执行的权限不同

在定义者(definer)权限下,当前用户的权限为角色无效情况下所拥有的权限。

在调用者(invoker)权限下,当前用户的权限为当前所拥有的权限(含角色)。

例如:

仍用前文中的用户

TMPA>create or replace procedure createtbl_definer as

  2  begin

  3    execute immediate 'create table tmptbl2 (id number)';

  4  end;

  5  /

过程已创建。

TMPA>create or replace procedure createtbl_invoker AUTHID CURRENT_USER as

  2  begin

  3    execute immediate 'create table tmptbl2 (id number)';

  4  end;

  5  /

过程已创建。

首先执行定义者权限过程:

TMPA>exec createtbl_definer;

BEGIN createtbl_definer; END;

*

第 1 行出现错误:

ORA-01031: 权限不足

ORA-06512: 在 "TMPA.CREATETBL_DEFINER", line 3

ORA-06512: 在 line 1

由于角色无效,相当于当前用户没有了建表权限,因此创建失败,这也正是为什么过程中执行DDL语句需要显示授权的原因。

TMPA>exec createtbl_invoker;

PL/SQL 过程已成功完成。

TMPA>desc tmptbl2

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER

执行调用者权限过程,能够成功创建!

3、执行的效率不同

在定义者(definer)权限下,过程被静态编译静态执行(相对而言),所执行sql语句在共享区池中是可被共享使用的

在调用者(invoker)权限下,过程静态编译,但动态执行,虽然执行的语句相同,但不同用户执行,其sql语句在共享池中并不能共享。

归根结底,正如tom所说,调用者权限体系结构的确拥有非常强大的功能,但只有当你使用得当时才能感受到其优势。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar