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


    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;
  • 相关阅读:
    Django内置的响应类
    Django的路由规则
    Django中的中间件
    celery_2:异步任务简单使用
    celery_1:简介及定时任务简单使用
    mac系统 redis安装及常用命令
    redis连接:Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    千分位函数percentile()和percentile_approx()
    模型评估_1—回归模型:mse、rmse、mae、r2
    Spark_4_2:Spark函数之collect、toArray和collectAsMap
  • 原文地址:https://www.cnblogs.com/badboy200800/p/12667650.html
Copyright © 2020-2023  润新知