使用AUTHID CURRENT_USER只能运行PL / SQL包中的一个过程吗?

时间:2011-09-29 13:59:21

标签: oracle security plsql

我有一个PL / SQL包,指定AUTHID(实际上是AUTHID DEFINER)。但是,此程序包中只有一个程序需要以AUTHID CURRENT_USER运行。这是可能的,还是我必须创建一个单独的顶级程序?

4 个答案:

答案 0 :(得分:4)

非常确定需要一个新的包,因为AUTHID只能在PACKAGE级别指定(据我所知)

答案 1 :(得分:2)

虽然这个链接的问题稍微偏离主题,但JulesLt提供的答案解释说,您不能在包级别以下的级别指定AUTHID:

Executing an Oracle Stored Proc as Another User

答案 2 :(得分:0)

Oracle不允许在包或类型的子程序中使用authid子句。您将收到以下错误:

Error: PLS-00157: AUTHID only allowed on schema-level programs

答案 3 :(得分:0)

可能的解决方案可能如下:

  1. 您使用AUTHID CURRENT_USER选项创建包;
  2. 您将select,insert等授予驻留在您要使用的 DEFINER 架构中的对象;
  3. 您使用DEFINER对象的完全限定名称
  4. 以下是一个例子:

    CREATE PACKAGE pkg1 AUTHID CURRENT_USER
    IS
      procedure insert_current_user;
      procedure insert_definer;
    END pkg1;
    /
    CREATE OR REPLACE PACKAGE BODY pkg1
    IS
      procedure insert_current_user
      is
      begin
        insert into table1 values(1);
      end insert_current_user;
    
      procedure insert_definer
      is
      begin
        insert into DEFINER.table1 values(1);
      end insert_definer;
    END pkg1;
    /
    

    DEFINER 是该表的所有者。

    作为改进,您可以为DEFINER.table1表创建同义词,然后使用包中的同义词。