【问题标题】:Getting Insufficient Privilege while creating Oracle sequence using procedure but not using plsql block使用过程但不使用 plsql 块创建 Oracle 序列时获得足够的权限
【发布时间】:2019-05-08 11:05:37
【问题描述】:
Begin
Execute immediate 'CREATE SEQUENCE seq1 MINVALUE 1 MAXVALUE 99 START WITH 1INCREMENT BY 1 CACHE 20';
End;
Sequence creating successfully.

Create or replace procedure proc_seq as
Begin
Execute immediate 'CREATE SEQUENCE seq2 MINVALUE 1 MAXVALUE 99 START WITH 1INCREMENT BY 1 CACHE 20';
End;

Exec proc_seq();
Error: Insufficient Privilege...

【问题讨论】:

    标签: oracle stored-procedures plsql dynamic-sql


    【解决方案1】:

    这是一个invokers/definers rights 问题。默认情况下,存储过程具有定义者的权利(DR - 强调):

    在服务器调用期间,当 DR 单元被推送到调用堆栈时,数据库会存储当前启用的角色以及 CURRENT_USERCURRENT_SCHEMA 的当前值。然后它将 CURRENT_USER 和 CURRENT_SCHEMA 更改为 DR 单元的所有者,并仅启用角色 PUBLIC

    如果您创建序列的权限是通过某个角色授予您的,那么由于该角色将被禁用,因此该权限无效。您可以通过运行 set role none 来验证是否是这种情况,这将导致您的匿名块失败并出现相同的错误。

    正如@Littlefoot 所说,您可以拥有直接授予您的权限,而不是(或同样)通过角色授予。

    或者,您可以指定该过程应该具有调用者的权限:

    Create or replace procedure proc_seq
    authid current_user
    as
    Begin
    Execute immediate 'CREATE SEQUENCE seq2 MINVALUE 1 MAXVALUE 99 START WITH 1INCREMENT BY 1 CACHE 20';
    End;
    /
    
    exec proc_seq;
    
    PL/SQL procedure successfully completed.
    
    select seq2.nextval from dual;
    
       NEXTVAL
    ----------
             1
    

    希望这是一个人为的例子;无论如何,您通常不会在运行时创建数据库对象...


    对这种方法的警告是,它可能不适合您打算如何调用该过程。如果您以自己的身份运行它,那很好,但如果您将授予其他用户执行权限,那么 他们 必须拥有相关权限(直接或通过角色授予);并将在自己的模式中创建对象。这可能正是您想要的。但如果不是,并且您不想将create sequence 授予调用者或让他们创建自己的对象,那么您可以保留具有定义者权限的过程并直接将权限授予您的用户。

    【讨论】:

    • 感谢您的帮助。根据您的回答,现在添加“authid current_user”后它可以工作了。主要是我在包中调用此过程。我尝试在包中添加相同但它不工作。错误:AUTHID 只允许在 cshema 级别。
    • @Munu - 不,您必须通过将 authid current_user 添加到包规范而不是特定过程来获得整个包调用者的权限。还要确保您了解所有含义,无论是包还是独立过程,都基于它将如何调用 - 以及由谁调用。将 create sequence priv 直接授予 proc/package 所有者可能更合适 - 这取决于您的情况。
    【解决方案2】:

    如果您通过角色获得了CREATE SEQUENCE 权限(显然,您做到了),它将在 SQL 层以及匿名 PL/SQL 块(您的第一个代码)中工作。

    但是,它在命名的 PL/SQL 过程(您的第二个代码)中不起作用 - 为此,您(这意味着:运行该代码的用户)必须直接授予该权限,而不是通过角色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-04
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多