根据当前用户组动态更改数据库视图

时间:2016-02-02 09:16:03

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

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

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

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

例如,假设我有一个名为 users_london 的用户组,另一个名为 users_berlin 的用户组。两者都可以访问名为 v_employee_master_data 的视图,其中包含 employee_name employee_job_title employee_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。底层数据库运行时是否提供了开箱即用的功能,以某种方式将当前记录的用户组捕获为全局变量的形式,并根据该变量的值更改SQL语句?

1 个答案:

答案 0 :(得分:0)

可以这样做:

  1. 获取当前用户
  2. select current_user

    1. 找到它所属的群组
    2. select groname from pg_group where current_user_id = any(grolist);

      1. 提取城市并将其资本化:
      2. select initcap(substring(groname from 'users_(.*)')) from pg_group where current_user_id = any(grolist);

        现在您的城市基于"用户"。所以只需在视图中注入它

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