OB 运维| OB Oracle 系统视图权限导致的故障一例

作者:赵黎明,爱可生 MySQL DBA 团队成员,熟悉 Oracle、MySQL 等数据库,擅长数据库性能问题诊断、事务与锁问题的分析等,负责处理客户 MySQL 及我司自研 DMP 平台日常运维中的问题,对开源数据库相关技术非常感兴趣。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 3100 字,预计阅读需要 10 分钟。


1背景

最近在客户这边遇到一个故障,在 Oracle 和 OB Oracle 租户下调用存储过程时,两者表现并不一致,导致获取到的 SQL 文本拼接不完整,影响到了业务侧的功能测试。

客户的存储过程逻辑并不复杂,就是通过查询系统视图 user_tab_columns
来获取用户的表名,然后再进行 SQL 拼接,完成后续的业务逻辑。

本文将针对这个问题进行相关的测试和验证。

2问题复现

Oracle 环境中验证

-- 创建测试用户并赋权<br>[root@localhost ~]# sqlplus / as sysdba<br>SQL> create user u1 identified by u1;<br>User created.<br>SQL> create user u2 identified by u2;<br>User created.<br>SQL> grant connect,resource to u1;<br>Grant succeeded.<br>SQL> grant create procedure to u1;<br>Grant succeeded.<br>SQL> grant connect,resource to u2;<br>Grant succeeded.<br>SQL> grant create synonym to u2;<br>Grant succeeded.<br>SQL> grant select any table to u2;<br>Grant succeeded.<br><br>-- 创建测试表并赋权<br>SQL> conn u1/u1<br>Connected.<br>SQL> create table t1(id int);<br>Table created.<br>SQL> insert into t1(id) values(1);<br>1 row created.<br><br>-- 创建表的同义词<br>SQL> conn u2/u2<br>Connected.<br>SQL> create synonym t1 for u1.t1;<br>Synonym created.<br><br>SQL> set lin 200<br>SQL> col owner for a5<br>SQL> col table_owner for a5<br>SQL> col db_link for a10<br>SQL> select * from all_synonyms where owner='U2';<br><br>OWNER SYNONYM_NAME          TABLE TABLE_NAME           DB_LINK<br>----- ------------------------------ ----- ------------------------------ ----------<br>U2  T1               U1  T1<br><br>-- 创建存储过程并赋权<br>SQL> conn u1/u1<br>Connected.<br>SQL> create or replace procedure proc_case1 as<br>v_str varchar2(10);<br>begin<br>select table_name into v_str from user_tab_columns where table_name='T1';<br>dbms_output.put_line(v_str);<br>end;<br>/  2    3    4    5    6    7  <br><br>Procedure created.<br>SQL> grant execute on proc_case1 to u2;<br>Grant succeeded.<br><br>-- 创建存储过程同义词<br>SQL> conn u2/u2<br>Connected.<br>SQL> create synonym proc_case1 for u1.proc_case1;<br>Synonym created.<br><br>SQL> select * from all_synonyms where owner='U2';<br>OWNER SYNONYM_NAME                   TABLE TABLE_NAME                     DB_LINK<br>----- ------------------------------ ----- ------------------------------ ----------<br>U2    PROC_CASE1                     U1    PROC_CASE1<br>U2    T1                             U1    T1<br><br>-- 验证<br>SQL> conn u1/u1<br>Connected.<br>SQL> select * from t1;<br>        ID<br>----------<br>         1<br><br>SQL> set serveroutput on;<br>SQL> call proc_case1();<br>T1<br>Call completed.<br><br>SQL> conn u2/u2<br>Connected.<br>SQL> select * from t1;<br>        ID<br>----------<br>         1<br><br>SQL> set serveroutput on;<br>SQL> call proc_case1();<br>T1<br>Call completed.<br>SQL><br>