暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 奇怪的行为与execute立即。

ASKTOM 2018-11-12
314

问题描述

嗨,

有问题SQLLive,(500响应),因此例子是她。

我有一个奇怪的行为与执行立即,它的行为与PL/SQL过程中的行为不同,而不是独立运行时的行为。

以下是示例:
我创建了一个简单的表格
CREATE TABLE TEST01 
(
  ID NUMBER 
, TEXT VARCHAR2(100 CHAR) 
);
复制


然后我创建一个非常简单的过程,它将根据原始表创建一个表
CREATE OR REPLACE PROCEDURE test02 AS
    
BEGIN
    EXECUTE IMMEDIATE 'create table ABCD as select * from TEST01' ;
    COMMIT ;
   
END test02;
复制


当我运行这个:
begin
    test02();
end;
复制


我收到以下错误:
ORA-01031: 权限不足
ORA-06512: 在 “INGIMUNDUR.TEST02”,第4行
ORA-06512: 在2号线
01031. 00000-“特权不足”

但是如果我运行:
BEGIN
    EXECUTE IMMEDIATE 'create table ABCD as select * from TEST01' ;
    COMMIT ;
   
END;
复制


一切运行良好,没有错误。

为什么会出现这种差异?

问候,
Ingimundur K. Gudmundsson。

p.s.我还在Oracle XE 11g上进行了测试,其行为是相同的。

专家解答

那是因为您需要向用户授予 “create table”。不通过角色继承它:

CREATE TABLE TEST01 (
  ID NUMBER 
, TEXT VARCHAR2(100 CHAR) 
);

CREATE OR REPLACE PROCEDURE test02 AS   
BEGIN
    EXECUTE IMMEDIATE 'create table ABCD as select * from TEST01' ;
    COMMIT ;
   
END test02;
/

exec test02();

ORA-01031: insufficient privileges

grant create table to chris;

exec test02();

desc ABCD;

Name   Null?   Type                 
ID             NUMBER               
TEXT           VARCHAR2(100 CHAR)   
复制


运行匿名块时不需要这个。仅编译PL/SQL。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论