非root用户调用存储过程无法INSERT...SELECT同库下的表

【 使用环境 】测试环境
【 OB or 其他组件 】OB社区版
【 使用版本 】5.7.25-OceanBase_CE-v4.3.5.2
【问题描述】使用非root用户创建存储过程,执行后报错:(SQL 错误 [1142] [42000]: SELECT command denied to user 'yvt'@'%' for table 'a')
存储过程内容如下:

CREATE DEFINER = `yvt`@`%` PROCEDURE `test_p`.`TEST1`()
    MODIFIES SQL DATA
BEGIN
    insert into test_p.b select * from test_p.a;
end

【复现路径】
创建测试库(root用户下执行):

create database test_p CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
GRANT all PRIVILEGES ON test_p.* TO 'yvt'@'%';

存储过程涉及的两张表都是简单建表语句(yvt用户下执行):

create table test_p.a(id int);
create table test_p.b(id int);

创建和调用存储过程语句(yvt用户下执行):

CREATE PROCEDURE TEST_P.TEST1()
BEGIN
  insert into test_p.b select * from test_p.a;
end
call TEST_P.TEST1();

执行后报错:SQL 错误 [1142] [42000]: SELECT command denied to user 'yvt'@'%' for table 'a'
给yvt用户赋权grant CREATE,DROP,INSERT ON *.* to 'yvt';仍然无法调用成功
类似的,创建以下存储过程并调用,可正常运行:

CREATE PROCEDURE TEST_P.TEST2()
BEGIN
    insert into test_p.testtable select * from ybt.YBT_WJFLZT;
end

ybt库是同租户下另一库,同样是root下创建后赋权GRANT all PRIVILEGES ON ybt.* TO 'yvt'@'%';反而可以执行成功,不知道这是什么原因?

不知道是否有什么解决办法,或者说存储过程只能在root用户下调用?

2 个赞

查一下 这个用户的权限 show grants for yvt;


其它就是一些无关的库和存过,有关的应该有:

GRANT CREATE, DROP, INSERT ON *.* TO 'yvt'
GRANT ALL PRIVILEGES ON `ybt`.* TO 'yvt'
GRANT ALL PRIVILEGES ON `test_p`.* TO 'yvt'
GRANT SELECT ON `mysql`.`proc` TO 'yvt'
GRANT EXECUTE, ALTER ROUTINE ON PROCEDURE `test_p`.`TEST1` TO 'yvt'
GRANT EXECUTE, ALTER ROUTINE ON PROCEDURE `test_p`.`TEST2` TO 'yvt'
GRANT EXECUTE, ALTER ROUTINE ON PROCEDURE `test_p`.`TEST` TO 'yvt'

在产品库里内容有点多,其它应该都是无关的,都是其它库和其他库里的存过

1 个赞


我们测试了一下 这样是可以执行的