Oracle 即使使用CREATE table grant,立即执行也会失败

Oracle 即使使用CREATE table grant,立即执行也会失败,oracle,plsql,oracle11g,grant,execute-immediate,Oracle,Plsql,Oracle11g,Grant,Execute Immediate,我在存储过程中使用executeimmediate命令创建表时遇到了一个问题。然而,我得到的错误是“权限不足”。我检查了其他线程,并确保用户具有“创建表”权限。然而,我仍然看到同样的错误 SQL> select * from USER_SYS_PRIVS; USERNAME PRIVILEGE ADM ------------------------------ ----------

我在存储过程中使用executeimmediate命令创建表时遇到了一个问题。然而,我得到的错误是“权限不足”。我检查了其他线程,并确保用户具有“创建表”权限。然而,我仍然看到同样的错误

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.
我创建的虚拟过程是:

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

我做错什么了吗?

如果您以
myuser
user的身份连接,您应该能够创建过程,并执行它来创建表

执行此任务所需的唯一权限是:

  • 创建会话
  • 创建表格
  • 创建过程
然后在连接到用户后执行以下过程:

SQL> CREATE USER TEST IDENTIFIED BY TEST;

User created.

SQL> GRANT CREATE SESSION, CREATE TABLE, CREATE PROCEDURE TO TEST;

Grant succeeded.

SQL> conn TEST/TEST@pdborcl;
Connected.
SQL> show user
USER is "TEST"
SQL> CREATE OR REPLACE PROCEDURE sp_dummy
  2  AS
  3  BEGIN
  4    EXECUTE immediate 'Create table Dummy99_99 (Dummy_Field number)';
  5  END sp_dummy;
  6  /

Procedure created.

SQL> EXEC sp_dummy;

PL/SQL procedure successfully completed.

SQL> select * from dummy99_99;

no rows selected

您只有直接授予用户的
create view
。您可以看到的其他系统权限来自角色,以及。在
user\u role\u privs
中查看您被授予的角色,您可以在
role\u sys\u privs
中查看每个角色赋予您的权限(角色名称为被授予者)。也可能有多个角色层次

如果在尝试静态创建表之前设置了角色无,则会看到相同的错误。以最少的设置进行演示:

create role myrole;
grant create session, create table, create procedure to myrole;
create user myuser identified by mypasswd;
grant myrole to myuser;
grant create view, unlimited tablespace to myuser;
然后作为该用户:

SQL> connect myuser/mypasswd
Connected.
SQL> select * from user_sys_privs;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
MYUSER                         UNLIMITED TABLESPACE                     NO
MYUSER                         CREATE VIEW                              NO

2 rows selected.

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE VIEW
CREATE PROCEDURE

5 rows selected.

SQL> Create table Dummy99_99 (Dummy_Field number);

Table created.

SQL> drop table Dummy99_99 purge;

Table dropped.

SQL> set role none;

Role set.

SQL> Create table Dummy99_99 (Dummy_Field number);
Create table Dummy99_99 (Dummy_Field number)
*
ERROR at line 1:
ORA-01031: insufficient privileges
对于您的存储过程版本:

SQL> connect myuser/mypasswd
Connected.
SQL> create or replace procedure sp_dummy
  2  as
  3  begin
  4    execute immediate 'Create table Dummy99_99 (Dummy_Field number)';
  5  end sp_dummy;
  6  /

Procedure created.

SQL> exec sp_dummy;
BEGIN sp_dummy; END;

*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "MYUSER.SP_DUMMY", line 4
ORA-06512: at line 1
为了能够从存储过程动态创建表,DBA需要直接向用户授予
create table

grant create table to myuser;
然后重试该过程:

SQL> connect myuser/mypasswd
Connected.
SQL> select * from user_sys_privs;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
MYUSER                         UNLIMITED TABLESPACE                     NO
MYUSER                         CREATE TABLE                             NO
MYUSER                         CREATE VIEW                              NO

SQL> exec sp_dummy;

PL/SQL procedure successfully completed.

SQL> desc Dummy99_99
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DUMMY_FIELD                                        NUMBER
请注意,
user\u sys\u privs
现在显示,
create table
已经被直接授予了权限,这在以前或问题中是没有的


但是,您不太可能真正想要动态创建对象,因为模式应该定义良好且稳定—这种类型的更改应该得到控制,并且是发布过程的一部分。但作为练习,您需要直接授权。

使用execute immediate时,过程必须明确告诉oracle它必须以特定用户的权限运行

AUTHID CURRENT_USER,以使用运行该过程的用户的权限。 AUTHID DEFINER,以使用过程所有者的权限

CREATE OR REPLACE PROCEDURE PROC_NAME AUTHID CURRENT_USER
IS
.....
这是在创建过程时使用AUTHID选项完成的

CREATE OR REPLACE PROCEDURE PROC_NAME AUTHID CURRENT_USER
IS
.....
我遇到了类似的问题,并从以下方面得到了理解:
必要的优惠如下:

GRANT CREATE TABLE TO "USER";
GRANT EXECUTE ANY PROCEDURE TO "USER" ;

请注意,默认情况下,PL/SQL过程使用定义者的权限,即它使用编译该过程的用户的权限运行,而不是使用运行/调用该过程的用户的权限运行。这可能与您的情况有关,也可能与您的情况无关。此错误与“创建表”权限无关,因为创建表Priv将仅在运行时执行。这与创建过程权限有关。尝试将创建过程授予MYUSER;然后再次测试。如果这是真的,请告诉我helps@AvrajitRoy-错误来自程序的执行,而不是程序的创建-尽管问题中没有明确说明。错误堆栈有来自代码块的PL/SQL错误。如果
create procedure
priv丢失(并且它没有丢失,您可以在
session\u privs
中看到它),您只需从
create procedure
中获取ORA-01031,而不需要ORA-06512跟踪。yupps缺少该跟踪:P。在这种情况下,它应该可以正常运行,因为存在create TABLE PRVI。只有在尝试在另一个架构中创建表时,才会发生这种情况。在这种情况下,必须创建任何表priv才能做到这一点。@AvrajitRoy-但它并没有试图在另一个架构中创建表;这是因为特权是通过角色授予的。欢迎使用堆栈溢出!虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,因为这会降低代码和解释的可读性!