[问题描述]
客户有两套不同的系统分别由不同的供应商维护,其中有一个功能需要让供应商A访问供应商B的表与视图,但不可以实施修改动作只能够读取信息,即供应商A需要针对供应商B的数据有只读权限。
[问题分析]
在默认情况下,每个用户只能查询自已空间下的对象的权限,不能查询其它用户空间下的对象。
[问题步骤]
# 供应商B执行如下构建命令
select 'grant select on 供应商B.' || t.table_name || ' to 供应商A;' from user_tables t;
# SYSDBA执行如上构建命令
# 检查供应商A权限
select * from 供应商B.table01;
我们可以留意到供应商A访问供应商B时,它必须要通过<Schema>.<Object>访问业务。如果希望不需要<Schema>直接访问<Object>,可以通过同义词方式实现。
# 供应商B创建同义词对象
select 'create synonym '|| table_name || ' for 供应商B.' || table_name || ';' from user_tables;
# 供应商A执行如上构建命令
# 检查供应商A权限
select * from table01;
此时,方法弊端是供应商A之下无法创建同名的表对象。
如果我们需要对供应商B相关对象实施增、删、改动作,只需要将select关键字变更为insert、delete、update。
如果希望省事一些,可以通过如下方法(不推荐,外审可能不通过的)
grant select any table to 供应商A;
grant select any dictionary to 供应商A;
grant select any TRANSACTION to 供应商A;
grant select any sequence to 供应商A;