Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1114406
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Mysql/postgreSQL

2013-04-24 16:32:15

接上篇~~~


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)权限下,过程被静态编译静态执行(相对而言),所执行语句在共享区池中是可被共享使用的

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

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

阅读(669) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~