创建行访问策略
CREATE ACCESS POLICY 可以为给定的表创建单行访问策略。此策略允许您为不同的用户和角色指定对表行数据的不同级别的访问权限。当用户启动查询时,Vertica 会对所有表行上访问策略的 WHERE 表达式求值。查询仅返回当前用户或角色的表达式求值结果为 true 的行。
例如,您可能希望为四个角色指定对表 store.store_store_sales
的不同访问级别:
-
employee
:具有此角色的用户只能访问employee_key
列中将他们标识为员工的销售记录。以下查询显示有多少销售记录(在store.store_sales_fact
中)与每个用户(在public.emp_dimension
中)相关联:=> SELECT COUNT(sf.employee_key) AS 'Total Sales', sf.employee_key, ed.user_name FROM store.store_sales_fact sf JOIN emp_dimension ed ON sf.employee_key=ed.employee_key WHERE ed.job_title='Sales Associate' GROUP BY sf.employee_key, ed.user_name ORDER BY sf.employee_key Total Sales | employee_key | user_name -------------+--------------+------------- 533 | 111 | LucasLC 442 | 124 | JohnSN 487 | 127 | SamNS 477 | 132 | MeghanMD 545 | 140 | HaroldON ... 563 | 1991 | MidoriMG 367 | 1993 | ThomZM (318 rows)
-
regional_manager
:具有此角色 (public.emp_dimension
) 的用户只能访问他们管理的销售区域 (store.store_dimension
) 的销售记录:=> SELECT distinct sd.store_region, ed.user_name, ed.employee_key, ed.job_title FROM store.store_dimension sd JOIN emp_dimension ed ON sd.store_region=ed.employee_region WHERE ed.job_title = 'Regional Manager'; store_region | user_name | employee_key | job_title --------------+-----------+--------------+------------------ West | JamesGD | 1070 | Regional Manager South | SharonDM | 1710 | Regional Manager East | BenOV | 593 | Regional Manager MidWest | LilyCP | 611 | Regional Manager NorthWest | CarlaTG | 1058 | Regional Manager SouthWest | MarcusNK | 150 | Regional Manager (6 rows)
-
dbadmin
和administrator
:具有这些角色的用户可以无限制地访问所有表数据。
给定这些用户以及与他们关联的数据,您可以在 store.store_store_sales
上创建如下所示的行访问策略:
CREATE ACCESS POLICY ON store.store_sales_fact FOR ROWS WHERE
(ENABLED_ROLE('employee')) AND (store.store_sales_fact.employee_key IN
(SELECT employee_key FROM public.emp_dimension WHERE user_name=CURRENT_USER()))
OR
(ENABLED_ROLE('regional_manager')) AND (store.store_sales_fact.store_key IN
(SELECT sd.store_key FROM store.store_dimension sd
JOIN emp_dimension ed ON sd.store_region=ed.employee_region WHERE ed.user_name = CURRENT_USER()))
OR ENABLED_ROLE('dbadmin')
OR ENABLED_ROLE ('administrator')
ENABLE;
重要
在此示例中,行策略仅允许策略的 WHERE 表达式中显式包含的一组角色访问表数据。所有其他角色和用户都被隐式拒绝访问表数据。以下示例指示具有指定角色的用户可以使用的不同访问级别:
-
dbadmin
可以访问store.store_sales_fact
中的所有行:=> \c You are now connected as user "dbadmin". => SELECT count(*) FROM store.store_sales_fact; count --------- 5000000 (1 row)
-
用户
LilyCP
具有regional_manager
角色,因此她可以访问她管理的中西部地区的所有销售数据:=> \c - LilyCP; You are now connected as user "LilyCP". => SET ROLE regional_manager; SET => SELECT count(*) FROM store.store_sales_fact; count -------- 782272 (1 row)
-
用户
SamRJ
具有employee
角色,因此他只能访问与其关联的销售数据:=> \c - SamRJ; You are now connected as user "SamRJ". => SET ROLE employee; SET => SELECT count(*) FROM store.store_sales_fact; count ------- 417 (1 row)
限制
以下限制适用于行访问策略:
-
一个表只能有一个行访问策略。
-
下表中的行访问策略无效:
-
具有聚合投影的表
-
临时表
-
系统表
-
视图
-
-
您不能在具有行访问策略的表上创建定向查询。