Oracle-11g

為什麼我不能在 dbms_lock.sleep() 上授予 exec 或使用它創建一個過程(但我可以自己執行它)

  • March 9, 2014

我正在嘗試編寫一小段 PL/SQL,其中包含非 CPU 燃燒睡眠。

以下工作在 sqldeveloper

begin
 dbms_lock.sleep(5);
end;

但是(作為同一使用者),我不能執行以下操作:

create or replace
procedure sleep(seconds in number)
is
begin
 dbms_lock.sleep(seconds);
end;

沒有錯誤“必須聲明標識符“DBMS_LOCK”……很有趣,因為我可以在沒有過程的情況下執行它。

同樣奇怪的是,當我以 DBA 身份登錄時,我可以執行命令

grant exec on dbms_lock to public;

我得到

ERROR at line 1:
ORA-00990: missing or invalid privilege

這是 oracle 版本“Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production”

[richard@f1 ~]$ sqlplus /nolog 

SQL*Plus: Release 11.2.0.2.0 Production on Fri Sep 14 13:33:18 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

SQL> connect sys@xe as sysdba

Enter password: ******

Connected.
SQL> grant execute on sys.dbms_lock to richard;

Grant succeeded.

根據http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9013.htm

GRANT EXECUTE ON "object" TO PUBLIC;

要創建獨立的過程或函式,或包規範或主體,您必須滿足以下先決條件:

  • 您必須具有 CREATE PROCEDURE 系統特權才能在您的模式中創建過程或包,或者俱有 CREATE ANY PROCEDURE 系統特權才能在其他使用者的模式中創建過程或包。

注意:要創建無錯誤,即成功編譯過程或包,需要以下附加權限: 過程或包的所有者必須已明確授予程式碼主體中引用的所有對象所需的對象權限; 所有者無法通過角色獲得所需的權限。

  • 如果過程或包所有者的權限發生變化,則必須在執行該過程之前重新對其進行身份驗證。如果從過程(或包)的所有者撤消了對引用對象的必要特權,則無法執行該過程。

引用自:https://serverfault.com/questions/427177