通过这篇文章,演示一下在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博客 ” ,链接:https://blog.itpub.net/70034820/viewspace-2994320/
,如需转载,请注明出处,否则将追究法律责任。