【问题标题】:Changing a DB View dynamically according the current user-group根据当前用户组动态更改数据库视图
【发布时间】:2016-02-02 09:16:02
【问题描述】:

我们目前正在深入研究 Amazon Redshift 并测试不同的功能。

我们的一个基本要求是我们将定义不同的用户组,而这些用户组又将被授予访问不同视图的权限。

解决此问题的一种方法是为每个用户组分别实现一个视图。但是,由于我们有很多用户组对信息的需求几乎完全相同,因此我正在寻找一种在 Redshift 中更动态地实现这一点的方法。

例如,假设我有一个名为 users_london 的用户组和另一个名为 users_berlin 的用户组。两者都可以访问名为 v_employee_master_data 的视图,其中包含 employee_nameemployee_job_titleemployee_city 列。 两个组共享相同范围的信息,但有一个例外 - employee_city 列。

本质上,视图应该根据当前登录的用户组在employee_city列中预先过滤出某个值。

在 SQL 中 - 类似这样:

对于用户组 users_london

SELECT * FROM v_employee_master_data WHERE employee_city = 'London';

对于用户组users_berlin

SELECT * FROM v_employee_master_data WHERE employee_city = 'Berlin';

现在重新连接到 Amazon Redshift。底层 DB 运行时是否提供了开箱即用的功能,以某种方式将当前记录的用户组捕获为 全局变量 的形式,并根据该变量的值更改 SQL 语句?

【问题讨论】:

    标签: postgresql amazon-web-services amazon-redshift


    【解决方案1】:

    可以这样做:

    1. 获取当前用户

    select current_user

    1. 找出它属于哪个组

    select groname from pg_group where current_user_id = any(grolist);

    1. 提取城市并将其大写:

    select initcap(substring(groname from 'users_(.*)')) from pg_group where current_user_id = any(grolist);

    现在您有了基于“用户”的城市。所以只需将它注入到视图中

    ... WHERE employee_city = initcap(substring(groname from 'users_(.*)') ...

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 2014-01-17
      • 2019-06-21
      相关资源
      最近更新 更多