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>