ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【显式授权】Procedure中无法完成DDL的建表操作的原因探查

【显式授权】Procedure中无法完成DDL的建表操作的原因探查

原创 Linux操作系统 作者:secooler 时间:2009-10-15 12:22:14 0 删除 编辑
通过这篇文章,演示一下在PL/SQL中如何实现DDL建表功能。同时再次确认用户仅仅具有DBA角色不是万能的。
很多情况下显示的授予是非常必须的,例如在文章《【SQL_TRACE】解决普通用户无法执行SQL_TRACE跟踪其他会话问题》http://space.itpub.net/519536/viewspace-616481中提到的问题也如出一辙。

1.为了防止大篇幅的代码干扰视线,这里使用一个尽量简单的Procedure p来进行演示。在procedure中实现DDL建表命令是需要一些技巧的。
create or replace procedure p is
v_SqlString varchar2(500);
begin
   v_SqlString:= 'create   table   t(x int, y int)';
      EXECUTE   IMMEDIATE   v_SqlString;
end p;
/

2.我们在普通用户sec中执行上面的procedure。创建成功,没有语法问题
sec@ora10g> create or replace procedure p is
  2  v_SqlString varchar2(500);
  3  begin
  4     v_SqlString:= 'create   table   t(x int, y int)';
  5        EXECUTE   IMMEDIATE   v_SqlString;
  6  end p;
  7  /

Procedure created.

3.在使用p进行建表的时候,系统提示权限不足“insufficient privileges”
sec@ora10g> exec p;
BEGIN p; END;

*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "SEC.P", line 5
ORA-06512: at line 1

4.我们尝试给sec用户授予DBA角色,再尝试执行一下p这个procedure,结果很显然,仍然不可以完成任务
sec@ora10g> conn / as sysdba
Connected.
sys@ora10g> grant dba to sec;

Grant succeeded.

sec@ora10g> exec p;
BEGIN p; END;

*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "SEC.P", line 5
ORA-06512: at line 1

5.真实的原因是:如果想使用这个procedure建表,必须“显示”的给sec用户授予建表的权限
sys@ora10g> grant create table to sec;

Grant succeeded.

sys@ora10g> conn sec/sec
Connected.
sec@ora10g> exec p;

PL/SQL procedure successfully completed.

sec@ora10g> desc t;
 Name   Null?    Type
 ------ -------- --------------
 X               NUMBER(38)
 Y               NUMBER(38)

6.OK,到此,我们实现了在普通用户中使用procedure完成表的创建任务。

7.小结
通过这个实验,再一次提醒我们,Oracle的权限控制是很严谨的,没有真正意义上的God权限(比如DBA角色)。

-- The End --

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/519536/viewspace-616625/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE 总监,阿里云MVP,北京大学理学硕士,恩墨学院创始人,教育专家,中国区 Cloudera 首位官方授权大数据讲师,金牌培训专家,BDA大数据联盟创始人,OCM联盟创始人,ACCUG创始人、ACOUG核心专家,Blogger。

注册时间:2008-03-16

  • 博文量
    797
  • 访问量
    7974221