1.问题描述
使用bat_madm用户执行如下语句,语句三执行失败:
语句一(执行成功):replace view madm_view.testA as select * from gdm_view.testB;
语句二(执行成功):select * from gdm_view.testB;
语句三(执行失败):select * from madm_view.testA;
2.原因分析
bat_madm用户存在对madm_view库的查询权限、创建视图和删除视图权限,也存在对gdm_view.testB的查询权限。但是缺少数据库madm_view对数据库gdm_view的查询权限。
3.原理分析
执行语句三,访问权限路径为,用户bat_madm-->数据库madm_view-->数据库gdm_view,当同时具备整个路径上的访问权限时才会执行成功。并且数据库madm_view对数据库gdm_view权限,需要使用with grant option级联。具体权限语句如下:
grant select,create view,drop view on madm_view to bat_madm; grant select on gdm_view to bat_madm; grant select on gdm_view to madm_view with grant option;
特别说明:从原理上讲,访问权限路径为用户bat_madm-->数据库视图madm_view.testA-->数据库视图gdm_view.testB,即可实现数据访问。但从实际实施角度讲,权限控制到视图级,存在维护成本较高问题,所以一般情况下我们权限控制在库级。
4.模拟测试
(1)环境准备(管理员用户citic_edw执行)
--创建目录结构 modify user citic_edw as perm=2E6; create database testdb from citic_edw as perm=2E6 spool=2E6; create user testuser from citic_edw as spool=0 perm=0 password="testuser_123"; --创建数据库madm_view create database madm_view from testdb as perm=1E6 spool=1E6; --创建数据库gdm_view,以及所需表和视图 create database gdm_view from testdb as perm=1E6 spool=1E6; create multiset table gdm_view. tbB , no fallback,no before journal,no after journal( a varchar(10)) no primary index; replace view gdm_view.testB as locking row for access sel * from gdm_view. tbB; --创建bat_madm用户,并赋予相应权限 create user bat_madm from testuser as spool=0 perm=0 password="bat_madm_123"; grant select,create view,drop view on madm_view to bat_madm; grant select on gdm_view to bat_madm;
(2)执行测试语句(bat_madm用户执行)
--语句一(执行成功): replace view madm_view.testA as select * from gdm_view.testB; --语句二(执行成功): select * from gdm_view.testB; --语句三(执行失败): select * from madm_view.testA;
(3)赋予库对库权限(citic_edw用户执行)
grant select on gdm_view to madm_view with grant option;
(4)再次执行测试语句(bat_madm用户执行)
--语句一(执行成功): replace view madm_view.testA as select * from gdm_view.testB; --语句二(执行成功): select * from gdm_view.testB; --语句三(执行成功): select * from madm_view.testA;