zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Teradata复杂视图跨库访问权限问题

权限 访问 视图 复杂 Teradata 问题 跨库
2023-09-14 09:00:03 时间

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;