2013年(350)
分类: Mysql/postgreSQL
2013-04-24 16:32:15
接上篇~~~
2、执行的权限不同
l 在定义者(definer)权限下,当前用户的权限为角色无效情况下所拥有的权限。
l 在调用者(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、执行的效率不同
l 在定义者(definer)权限下,过程被静态编译静态执行(相对而言),所执行语句在共享区池中是可被共享使用的
l 在调用者(invoker)权限下,过程静态编译,但动态执行,虽然执行的语句相同,但不同用户执行,其sql语句在共享池中并不能共享。
归根结底,正如tom所说,调用者权限体系结构的确拥有非常强大的功能,但只有当你使用得当时才能感受到其优势。