跳转到主要内容
创建行策略,即一种用于确定用户可从表中读取哪些行的过滤器。
行策略仅适用于具有只读访问权限的用户。如果用户可以修改表,或在表之间复制分区,就会绕过行策略的限制。
语法:
CREATE [ROW] POLICY [IF NOT EXISTS | OR REPLACE] policy_name1 [ON CLUSTER cluster_name1] ON [db1.]table1|db1.*
        [, policy_name2 [ON CLUSTER cluster_name2] ON [db2.]table2|db2.* ...]
    [IN access_storage_type]
    [FOR SELECT] USING condition
    [AS {PERMISSIVE | RESTRICTIVE}]
    [TO {role1 [, role2 ...] | ALL | ALL EXCEPT role1 [, role2 ...]}]

USING 子句

允许指定用于过滤行的条件。若某一行上的该条件计算结果非零,用户就能看到该行。

TO 子句

TO 部分中,您可以指定此策略适用的用户和 roles 列表。例如,CREATE ROW POLICY ... TO accountant, john@localhost 关键字 ALL 表示所有 ClickHouse 用户,包括当前用户。关键字 ALL EXCEPT 允许从所有用户列表中排除某些用户,例如 CREATE ROW POLICY ... TO ALL EXCEPT accountant, john@localhost

AS 子句

允许同一用户在同一张表上同时启用多个策略。因此,我们需要一种方式来组合多个策略中的条件。 默认情况下,策略通过布尔 OR 运算符进行组合。例如,以下策略:
CREATE ROW POLICY pol1 ON mydb.table1 USING b=1 TO mira, peter
CREATE ROW POLICY pol2 ON mydb.table1 USING c=2 TO peter, antonio
允许用户 peter 查看满足 b=1c=2 的行。 AS 子句指定策略应如何与其他策略组合。策略可以是宽松型或限制型。默认情况下,策略为宽松型,这意味着它们会通过布尔 OR 运算符组合。 或者,也可以将策略定义为限制型。限制型策略会通过布尔 AND 运算符组合。 以下是通用公式:
row_is_visible = (one or more of the permissive policies' conditions are non-zero) AND
                 (all of the restrictive policies's conditions are non-zero)
例如,以下策略:
CREATE ROW POLICY pol1 ON mydb.table1 USING b=1 TO mira, peter
CREATE ROW POLICY pol2 ON mydb.table1 USING c=2 AS RESTRICTIVE TO peter, antonio
仅当 b=1c=2 两个条件同时满足时,才允许用户 peter 查看这些行。 数据库策略会与表策略组合生效。 例如,以下策略:
CREATE ROW POLICY pol1 ON mydb.* USING b=1 TO mira, peter
CREATE ROW POLICY pol2 ON mydb.table1 USING c=2 AS RESTRICTIVE TO peter, antonio
使用户 peter 只有在同时满足 b=1c=2 时才能看到 table1 的行,尽管 mydb 中的任何其他表对该用户都只会应用 b=1 策略。

ON CLUSTER 子句

允许在集群中创建行策略,参见 Distributed DDL

示例

CREATE ROW POLICY filter1 ON mydb.mytable USING a<1000 TO accountant, john@localhost CREATE ROW POLICY filter2 ON mydb.mytable USING a<1000 AND b=5 TO ALL EXCEPT mira CREATE ROW POLICY filter3 ON mydb.mytable USING 1 TO admin CREATE ROW POLICY filter4 ON mydb.* USING 1 TO admin
最后修改于 2026年6月10日