PL 权限不足,错误代码 ORA-00942时应该怎么处理?

,

本文介绍执行存储过程报 ORA-00942 错误提示 PL 权限不足的原因和解决方法。

适用版本

OceanBase V2.x 及后续版本

问题现象

Oracle 模式下,执行以下语句:

  • sys

    租户:

obclient> CREATE USER test1 IDENTIFIED BY 123456; obclient> CREATE USER test2 IDENTIFIED BY 123456; obclient> GRANT CREATE SESSION TO test1,test2; obclient> GRANT CREATE TABLE TO test2; obclient> GRANT CREATE PROCEDURE TO test1;

  • test2

    租户:

obclient> CREATE TABLE loghistory(userid VARCHAR(20),logdate DATE);

  • test1

    租户:

obclient> CREATE OR REPLACE PROCEDURE userlogin AUTHID DEFINER IS BEGIN INSERT INTO loghistory (userid) VALUES (USER); END;

使用

test2

用户登录到

test2

库,执行存储过程

userlogin

错误,错误信息如下:

obclient> begin test1.userlogin; end;/ ORA-00942: table or view does not exist

可能原因

OceanBase 数据库 Oracle 模式具有与 Oracle 数据库相同的特性,每个 PL 在创建时都可以指定

AUTHID

子句,用于控制存储过程是按所有者权限调用还是按当前用户权限执行,默认是按所有者的权限进行调用。因此,默认情况下,用户拥有的 ROLE 权限不能在存储过程中使用。

其中,

AUTHID

可选

DEFINER

CURRENT_USER

,默认为

DEFIENER

DEFINER

表示存储过程是按所有者权限调用,

CURRENT_USER

表示按当前用户权限执行。

解决方式

有两种解决方式:

  • test1

    用户授予相应的权限解决该问题。

  • 存储过程中需要什么权限,就需要向定义者授予什么权限,本例向

    test1

    用户授予

    INSERT ANY TABLE

    权限。

obclient> GRANT INSERT ANY TABLE TO test1; 或 obclient> GRANT DBA TO test1;

  • 创建 PL 时指定

    AUTHID

    CURRENT_USER

obclient> CREATE OR REPLACE PROCEDURE userlogin AUTHID CURRENT_USER IS BEGIN INSERT INTO loghistory (userid) VALUES (USER); END;

赞!