ParserRowPolicyNames acepta tres formas de empaquetado (no un producto cartesiano completo):
- Varios nombres, un destino —
pol1, pol2 ON table1crea cada uno de los nombres indicados en esa única tabla (odb.*). - Un nombre, varios destinos —
pol1 ON table1, table2crea el mismo nombre corto en cada destino indicado. - Pares mixtos —
p1 ON t1, p2 ON t2crea cada nombre únicamente en el destino con el que está emparejado.
ON de varias tablas en un mismo grupo: se rechaza p1, p2 ON t1, t2. Después de un grupo de varios nombres, tampoco se puede añadir otro grupo name ON target separado por comas en la misma sentencia.
El ON CLUSTER opcional se aplica a toda la sentencia (un nombre de clúster). ClickHouse no acepta un ON CLUSTER distinto para cada nombre de política empaquetado en una sola creación; ejecute sentencias CREATE ROW POLICY independientes cuando las ROW POLICY deban crearse en clústeres distintos.
CREATE ROW POLICY requiere el privilegio CREATE ROW POLICY en la tabla en la que se crea la política. OR REPLACE descarta una política existente con el mismo nombre, incluidos los roles a los que se aplica, por lo que también requiere el privilegio DROP ROW POLICY en esa tabla. El privilegio DROP ROW POLICY es necesario tanto si la política ya existe como si no, por lo que la sentencia no puede utilizarse para averiguar qué políticas existen.
Varios nombres y tablas
Válido:Cláusula USING
Permite especificar una condición para filtrar filas. Un usuario verá una fila si la condición se evalúa como distinta de cero para esa fila.Cláusula TO
En la secciónTO puedes indicar una lista de usuarios y roles a los que se aplicará esta política. Por ejemplo, CREATE ROW POLICY ... TO accountant, john@localhost.
La palabra clave ALL significa todos los usuarios de ClickHouse, incluido el usuario actual. La palabra clave ALL EXCEPT permite excluir algunos usuarios de la lista de todos los usuarios; por ejemplo, CREATE ROW POLICY ... TO ALL EXCEPT accountant, john@localhost
Los roles indicados en la sección TO, incluidos los que aparecen después de ALL EXCEPT, se comparan con los roles habilitados del usuario actual (system.enabled_roles), y no con todos los roles concedidos al usuario, por lo que SET ROLE puede cambiar qué políticas se aplican.
Cláusula AS
Se permite que haya más de una política habilitada en la misma tabla para el mismo usuario al mismo tiempo. Por lo tanto, necesitamos una forma de combinar las condiciones de varias políticas. De forma predeterminada, las políticas se combinan mediante el operador booleanoOR. Por ejemplo, las siguientes políticas:
peter ver las filas con b=1 o c=2.
La cláusula AS especifica cómo deben combinarse las políticas entre sí. Las políticas pueden ser permisivas o restrictivas. De forma predeterminada, las políticas son permisivas, lo que significa que se combinan mediante el operador booleano OR.
Como alternativa, una política puede definirse como restrictiva. Las políticas restrictivas se combinan mediante el operador booleano AND.
Esta es la fórmula general:
access_control_improvements.users_without_row_policies_can_read_rows está habilitado de forma predeterminada. Por lo tanto, un usuario al que no se le aplique ninguna condición ve todas las filas, y access_control_improvements.throw_on_unmatched_row_policies, deshabilitado de forma predeterminada, lanza en su lugar una excepción cuando la tabla sí tiene condiciones y ninguna de ellas se aplica.
Por ejemplo, las siguientes políticas:
peter ver filas solo si b=1 Y c=2.
Las políticas de base de datos se combinan con las políticas de tabla.
Por ejemplo, las siguientes políticas:
peter vea las filas de table1 solo si se cumplen tanto b=1 COMO c=2, aunque
cualquier otra tabla de mydb tendría aplicada únicamente la política b=1 para el usuario.
Tablas Distributed y con respaldo remoto
Una ROW POLICY filtra las filas en el lugar donde se leen realmente los datos de la tabla. Una tabla que delega la lectura en servidores remotos, como una tabla Distributed o un envoltorio de una de ellas (por ejemplo, una vista materializada con un destinoDistributed), solo envía el texto de la consulta a los servidores remotos y no puede aplicar el filtro de la ROW POLICY a la lectura remota. Para evitar que el filtro se omita silenciosamente, las consultas a este tipo de tabla realizadas por usuarios a los que se aplica la ROW POLICY se rechazan con el error ILLEGAL_PREWHERE.
En su lugar, defina la ROW POLICY en las tablas locales subyacentes de cada servidor remoto; se aplicará allí cuando la consulta enviada las lea:
Cláusula ON CLUSTER
Permite crear políticas de fila en un clúster; consulta DDL distribuido. También es una forma práctica de crear la política en las tablas locales de cada servidor del clúster.Ejemplos
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