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