ParserRowPolicyNames aceita três formas de agrupamento (não um produto cartesiano completo):
- Vários nomes, um destino —
pol1, pol2 ON table1cria cada nome listado nessa única tabela (oudb.*). - Um nome, vários destinos —
pol1 ON table1, table2cria o mesmo nome curto em cada destino listado. - Pares mistos —
p1 ON t1, p2 ON t2cria cada nome apenas no destino ao qual está associado.
ON de várias tabelas em um grupo: p1, p2 ON t1, t2 é rejeitada. Após um grupo com vários nomes, você também não pode acrescentar outro grupo name ON target separado por vírgulas na mesma instrução.
O ON CLUSTER opcional se aplica a toda a instrução (um nome de cluster). O ClickHouse não aceita um ON CLUSTER diferente para cada nome de política agrupado em uma única criação — execute instruções CREATE ROW POLICY separadas quando as políticas precisarem ser criadas em clusters diferentes.
CREATE ROW POLICY exige o privilégio CREATE ROW POLICY na tabela em que a política é criada. OR REPLACE descarta uma política existente de mesmo nome, incluindo os roles aos quais ela se aplica, e por isso exige também o privilégio DROP ROW POLICY nessa tabela. O privilégio DROP ROW POLICY é exigido independentemente de a política já existir ou não, de modo que a instrução não pode ser usada para descobrir quais políticas existem.
Vários nomes e tabelas
Válido:Cláusula USING
Permite especificar uma condição para filtrar linhas. Um usuário verá uma linha se a condição resultar em um valor diferente de zero para essa linha.Cláusula TO
Na seçãoTO, você pode informar uma lista de usuários e roles para os quais esta política deve se aplicar. Por exemplo, CREATE ROW POLICY ... TO accountant, john@localhost.
A palavra-chave ALL significa todos os usuários do ClickHouse, incluindo o usuário atual. A palavra-chave ALL EXCEPT permite excluir alguns usuários da lista de todos os usuários, por exemplo, CREATE ROW POLICY ... TO ALL EXCEPT accountant, john@localhost
As roles indicadas na seção TO, incluindo aquelas após ALL EXCEPT, são comparadas com as roles habilitadas do usuário atual (system.enabled_roles), e não com todas as roles concedidas ao usuário, de modo que SET ROLE pode alterar quais políticas se aplicam.
Cláusula AS
É possível ter mais de uma política habilitada na mesma tabela para o mesmo usuário ao mesmo tempo. Portanto, precisamos de uma forma de combinar as condições de várias políticas. Por padrão, as políticas são combinadas usando o operador booleanoOR. Por exemplo, as seguintes políticas:
peter ver linhas com b=1 ou c=2.
A cláusula AS especifica como as políticas devem ser combinadas com outras políticas. As políticas podem ser permissivas ou restritivas. Por padrão, as políticas são permissivas, o que significa que são combinadas usando o operador booleano OR.
Como alternativa, uma política pode ser definida como restritiva. As políticas restritivas são combinadas usando o operador booleano AND.
Aqui está a fórmula geral:
access_control_improvements.users_without_row_policies_can_read_rows está habilitado por padrão. Portanto, um usuário ao qual nenhuma condição se aplica vê todas as linhas, e access_control_improvements.throw_on_unmatched_row_policies, desabilitado por padrão, gera uma exceção nesse caso, quando a tabela possui condições e nenhuma delas se aplica.
Por exemplo, as seguintes políticas:
peter veja linhas apenas se b=1 E c=2.
As políticas de banco de dados são combinadas com as políticas da tabela.
Por exemplo, as seguintes políticas:
peter ver as linhas da table1 somente se b=1 AND c=2, embora
qualquer outra tabela em mydb tenha apenas a política b=1 aplicada ao usuário.
Tabelas Distributed e com dados remotos
Uma política de linha filtra as linhas no local em que os dados da tabela são efetivamente lidos. Uma tabela que delega a leitura a servidores remotos, como uma tabela Distributed ou um wrapper dela (por exemplo, uma visão materializada com destinoDistributed), apenas envia o texto da consulta aos servidores remotos e não consegue aplicar o filtro da política à leitura remota. Para evitar que o filtro seja silenciosamente descartado, as consultas a essa tabela feitas por usuários aos quais a política se aplica são rejeitadas com o erro ILLEGAL_PREWHERE.
Em vez disso, defina a política nas tabelas locais subjacentes de cada servidor remoto; ela será aplicada quando a consulta enviada as ler:
Cláusula ON CLUSTER
Permite criar políticas de linha em um cluster. Consulte DDL distribuído. Essa também é uma maneira prática de criar a política nas tabelas locais de cada servidor do cluster.Exemplos
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