本文介绍执行存储过程报 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;