【顯式授權】Procedure中無法完成DDL的建表操作的原因探查

secooler發表於2009-10-15
透過這篇文章,演示一下在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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章