【发布时间】:2016-02-19 19:31:48
【问题描述】:
我在使用存储过程中的立即执行命令创建表时遇到问题。但是我得到“权限不足”的错误。我检查了其他线程并确保用户已授予它“CREATE TABLE”权限。但是我仍然看到同样的错误。
SQL> select * from USER_SYS_PRIVS;
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
MYUSER CREATE VIEW NO
MYUSER UNLIMITED TABLESPACE NO
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE VIEW
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
11 rows selected.
我创建的 Dummy 程序是:
create or replace procedure sp_dummy
as
begin
execute immediate 'Create table Dummy99_99 (Dummy_Field number)';
end sp_dummy;
/
详细错误:
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "MYUSER.SP_DUMMY", line 4
ORA-06512: at line 1
我做错了什么吗?
【问题讨论】:
-
请注意,PL/SQL 过程默认使用定义者的权限,即它以编译该过程的用户的权限运行,而不是以运行/调用该过程的用户的权限运行。这可能与您的情况相关,也可能不相关。
-
此错误与“CREATE TABLE”权限无关,因为 CREATE TABLE Priv 只会在运行时执行。这与 CREATE PROCEDURE 权限有关。尝试 GRANT CREATE PROCEDUTE TO MYUSER;并再次测试。让我知道这是否有帮助
-
@AvrajitRoy - 错误来自程序的执行,而不是它的创建 - 尽管问题中没有明确说明。错误堆栈具有来自代码块的 PL/SQL 错误。如果
create procedurepriv 丢失(实际上没有,您可以在session_privs中看到它),您只需从create procedure获取 ORA-01031,而没有 ORA-06512 跟踪。 -
yupps 错过了那个痕迹:P。在这种情况下,它应该运行良好,因为存在 CREATE TABLE Priv。仅当尝试在另一个模式中创建表时才会发生这种情况。在这种情况下,CREATE ANY TABLE priv 必须这样做。
-
@AvrajitRoy - 但它并没有尝试在另一个模式中创建表;这是因为权限是通过角色授予的。
标签: oracle plsql oracle11g grant execute-immediate