什么是调用程序';s对Oracle PL/SQL函数的权限?

什么是调用程序';s对Oracle PL/SQL函数的权限?,oracle,plsql,Oracle,Plsql,第一个结果缓存使用限制-未在具有调用方权限的模块或匿名块中定义 “调用方权利”是什么意思?这是否意味着user_procedures.AUTHID不应该是此函数的“定义者”?执行Oracle PL/SQL代码时的调用者和定义者权限 您正在解释的规则限制存储在数据库缓存中的某些类型的PL/SQL代码的使用。包含的PL/SQL代码类型为以下代码段: 匿名块(即,这些是通过SQL Plus或其他一些输入运行的代码片段,实际上不是数据库中持久对象(如存储过程、函数或包)的一部分) 使用调用方权限定义的:

第一个结果缓存使用限制-未在具有调用方权限的模块或匿名块中定义

“调用方权利”是什么意思?这是否意味着user_procedures.AUTHID不应该是此函数的“定义者”?

执行Oracle PL/SQL代码时的调用者和定义者权限 您正在解释的规则限制存储在数据库缓存中的某些类型的PL/SQL代码的使用。包含的PL/SQL代码类型为以下代码段:

  • 匿名块
    (即,这些是通过SQL Plus或其他一些输入运行的代码片段,实际上不是数据库中持久对象(如存储过程、函数或包)的一部分)
  • 使用调用方权限定义的
    :(请参见下面的说明)
  • 调用方
    意味着无论执行PL/SQL对象的是什么
    用户
    帐户,该过程都以该用户帐户的权限而不是
    定义方(对象所有者)的常规权限运行

    Tom Kyte在他的Ask Tom网站上发表了关于定义者与调用者权利的文章

    上述参考中最值得注意的注释是以下代码示例块:

    In the above, if user1 created:
    
    create or replace procedure proc1
    authid current_user
    as
    begin
       for x in ( select * from my_table ) loop 
         null;
       end loop;
    end;
    /
    
    在下一行:
    authid current_user
    ,这是用于设置调用方权限的注释。参考中的表
    my_表
    有多种可能性:

    • 在定义者和调用者相同的情况下执行
      PROC1
      (即
      OWNER
      USER1
      )时,此表将为:
      USER1.MY_表
    • 当过程
      PROC1
      OWNER
      以外的调用方或用户执行
      PROC1
      (即
      USER2
      )时,此表可以是以下可能的目标之一:
      • 名为MY_table的
        PUBLIC
        拥有的表
      • 私有或公有的
        同义词
        ,用于名为
        MY\u table
      • 属于
        USER2
        (即
        USER2.MY_TABLE
        )的本地表,其名称与
        MY_TABLE
        相同
    如果上述情况属实,那么与过程
    USER1.PROC1
    相关的引用存在大量歧义。根据调用用户标识的上下文和别名指针(
    同义词
    )的可访问性/存在性,实际使用的物理表是不同的

    结果是,鉴于内部引用的变量性质,对于启用了调用方权限的过程,缓存值的有用性值得怀疑