Oracle 即使使用CREATE table grant,立即执行也会失败
我在存储过程中使用executeimmediate命令创建表时遇到了一个问题。然而,我得到的错误是“权限不足”。我检查了其他线程,并确保用户具有“创建表”权限。然而,我仍然看到同样的错误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 ------------------------------ ----------
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-但它并没有试图在另一个架构中创建表;这是因为特权是通过角色授予的。欢迎使用堆栈溢出!虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,因为这会降低代码和解释的可读性!