首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >存储过程中的Execute Immediate不断出现权限不足错误

存储过程中的Execute Immediate不断出现权限不足错误
EN

Stack Overflow用户
提问于 2009-06-15 05:45:31
回答 3查看 115.1K关注 0票数 40

下面是存储过程的定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR) IS
BEGIN
  DECLARE v_cnt NUMBER;
  BEGIN
    SELECT COUNT(*) 
      INTO v_cnt 
      FROM all_tables 
     WHERE owner = schema
       AND table_name = tblToDrop;

     IF v_cnt > 0 THEN 
        EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
     END IF;
   END;
END;

下面是调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CALL usp_dropTable('SOMESCHEMA', 'SOME_TABLE');

由于某些原因,我一直收到EXECUTE IMMEDIATE命令的权限不足错误。我在网上查看了一下,发现权限不足错误通常意味着oracle用户帐户对case查询中使用的命令没有权限,在本例中是DROP。但是,我有drop特权。我真的很困惑,我似乎找不到一个适合我的解决方案。

提前感谢你。

解决方案:

正如Steve在下面提到的,Oracle安全模型很奇怪,因为它需要在过程中的某个位置显式地知道要使用哪种权限。让Oracle知道这一点的方法是在CREATE OR REPLACE语句中使用AUTHID关键字。如果您希望与过程的创建者具有相同级别的权限,则可以使用AUTHID定义者。如果希望Oracle使用当前运行存储过程的用户的权限,则需要使用AUTHID CURRENT_USER。过程声明如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR) 
AUTHID CURRENT_USER IS
BEGIN
  DECLARE v_cnt NUMBER;
  BEGIN
    SELECT COUNT(*) 
      INTO v_cnt 
      FROM all_tables 
     WHERE owner = schema
       AND table_name = tblToDrop;

     IF v_cnt > 0 THEN 
        EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
     END IF;
   END;
END;

感谢大家的回复。这绝对是一个非常烦人的问题,要找到解决方案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-15 07:16:56

Oracle的安全模型是这样的:在使用Execute Immediate (在PL/SQL块或过程的上下文中)执行动态SQL时,用户对通过角色成员身份授予的对象或命令没有权限。您的用户可能具有"DBA“角色或类似角色。您必须显式授予此用户"drop table“权限。如果您试图从另一个模式(如sys或system)中的表中进行选择,情况也是如此-您需要向该用户授予对该表的显式select权限。

票数 21
EN

Stack Overflow用户

发布于 2016-08-21 09:07:06

您可以在过程定义的主体中使用"AUTHID CURRENT_USER“来满足您的需求。

票数 5
EN

Stack Overflow用户

发布于 2011-06-04 09:54:44

或者,如果需要,可以授予用户DROP_ANY_TABLE特权,该过程将按原样运行,不需要任何更改。也许是危险的,但这取决于你在做什么:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/996198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文