【问题标题】:ORACLE PL/SQL procedure requires AUTHID CURRENT_USER for EXECUTE IMMEDIATE with DDL [duplicate]ORACLE PL/SQL 过程需要 AUTHID CURRENT_USER 才能使用 DDL 立即执行 [重复]
【发布时间】:2019-10-14 07:33:41
【问题描述】:

我有一个 PL/SQL 过程想用EXECUTE IMMEDIATE 创建一个视图。

我使用具有CONNECTRESOURCEDBA角色的用户执行代码。

默认情况下,我得到错误:

ORA-01031:权限不足。

我必须显式添加AUTHID CURRENT_USER 才能使代码成功执行。

我想我理解 AUTHID 子句的目的,但由于我正在使用同一个 DBA 用户执行代码,我想知道为什么我必须添加 AUTHID CURRENT_USER 子句...

使用 Oracle 18c (18.3.0.0.0)。

用户创建如下:

CREATE USER zzz IDENTIFIED BY ...
GRANT connect, resource, dba TO zzz

代码如下:

CREATE TABLE tab1 ( pk INT PRIMARY KEY, name VARCHAR2(50) );

CREATE OR REPLACE PROCEDURE proc1
--AUTHID CURRENT_USER
IS
BEGIN
   EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW v1 AS SELECT * FROM tab1';
END;
/

BEGIN
    proc1();
END;
/

DROP VIEW v1;
DROP TABLE tab1;

代码应该在没有 AUTHID CURRENT_USER 子句的情况下工作,即使(对我而言)最好始终使用该子句。

【问题讨论】:

  • 无论如何你都不应该使用connectresource。这两个角色在很久以前就被弃用了。

标签: oracle stored-procedures plsql authid


【解决方案1】:

基本上,您应该避免授予预定义角色。 CONNECTRESOURCE 在 7.x Oracle 版本中很流行。现在他们只有非常有限的特权列表。

另一方面,DBA 对于用户zzz 来说可能太强大了。如果我是你,我会完全撤销它(并在必要时和必要时授予所需的一组特权)。

对我来说,您的用户似乎应该被授予以下权限:

grant create view to zzz;

明确。尝试这样做(从过程中删除AUTHID 行)并再次运行该过程。

【讨论】:

    【解决方案2】:

    默认情况下(即AUTHID DEFINER)在 PL/SQL 块中,您只有 直接 授予用户的权限。 ROLE 授予的特权(例如DBA)不适用于 PL/SQL 块内。唯一的例外是角色PUBLIC,此角色也适用于 PL/SQL 块内。

    运行

    grant create view to zzz;
    

    然后它就会工作。

    【讨论】:

    • 感谢您的提示,授予用户创建视图权限可避免使用 AUTHID CURRENT_USER。不过,我不明白为什么它只使用角色的间接权限并指定 AUTHID CURRENT_USER(相对于 AUTHID DEFINER,默认值),因为定义者是用户 zzz ...
    • 可能读到Using Invoker's Rights or Definer's Rights (AUTHID Clause)。这可能很奇怪,但这就是 Oracle 设计它的方式。一个原因可能是:PROCEDURE、FUNCTION 或 PACKAGE 不会因删除 ROLE 而变得无效。
    猜你喜欢
    • 1970-01-01
    • 2011-11-27
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多