Crée une ROW POLICY, c’est-à-dire un filtre servant à déterminer quelles lignes un utilisateur peut lire dans une table.
Les ROW POLICY n’ont de sens que pour les utilisateurs disposant d’un accès readonly. Si un utilisateur peut modifier une table ou copier des partitions d’une table à une autre, cela contourne les restrictions des ROW POLICY.
Syntaxe :
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 ...]}]
Permet de spécifier une condition pour filtrer les lignes. Un utilisateur voit une ligne si la condition, appliquée à cette ligne, renvoie une valeur non nulle.
Dans la section TO, vous pouvez indiquer une liste d’utilisateurs et de rôles auxquels cette politique doit s’appliquer. Par exemple, CREATE ROW POLICY ... TO accountant, john@localhost.
Le mot-clé ALL désigne tous les utilisateurs ClickHouse, y compris l’utilisateur actuel. Le mot-clé ALL EXCEPT permet d’exclure certains utilisateurs de la liste de tous les utilisateurs, par exemple, CREATE ROW POLICY ... TO ALL EXCEPT accountant, john@localhost
Il est possible d’avoir plusieurs politiques activées sur la même table pour un même utilisateur en même temps. Il faut donc un moyen de combiner les conditions de plusieurs politiques.
Par défaut, les politiques sont combinées à l’aide de l’opérateur booléen OR. Par exemple, les politiques suivantes :
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
permettre à l’utilisateur peter de voir les lignes où b=1 ou c=2.
La clause AS indique comment les politiques doivent être combinées avec d’autres politiques. Les politiques peuvent être permissives ou restrictives. Par défaut, les politiques sont permissives, ce qui signifie qu’elles sont combinées à l’aide de l’opérateur booléen OR.
Une politique peut aussi être définie comme restrictive. Les politiques restrictives sont combinées à l’aide de l’opérateur booléen AND.
Voici la formule générale :
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)
Par exemple, les politiques suivantes :
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
permet à l’utilisateur peter de voir des lignes uniquement si b=1 AND c=2.
Les politiques au niveau de la base de données sont combinées avec celles de la table.
Par exemple, les politiques suivantes :
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
permettre à l’utilisateur peter de voir les lignes de table1 uniquement si b=1 AND c=2, bien que
pour toute autre table de mydb, seule la politique b=1 s’appliquerait à l’utilisateur.
Permet de créer des ROW POLICY sur un cluster, voir DDL distribué.
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