CREATE ROW POLICY
Создает ROW POLICY, т. е. фильтр, используемый для определения того, какие строки пользователь может читать из таблицы.
ROW POLICY имеет смысл только для пользователей с доступом только на чтение. Если пользователь может изменять таблицу или копировать партиции между таблицами, это сводит на нет ограничения ROW POLICY.
Синтаксис:
Предложение USING
Позволяет задать условие для фильтрации строк. Пользователь увидит строку, если при вычислении условия для этой строки получается ненулевое значение.
предложение TO
В разделе TO вы можете указать список пользователей и ролей, для которых должна действовать эта политика. Например, CREATE ROW POLICY ... TO accountant, john@localhost.
Ключевое слово ALL означает всех пользователей ClickHouse, включая текущего пользователя. Ключевое слово ALL EXCEPT позволяет исключить некоторых пользователей из списка всех пользователей, например, CREATE ROW POLICY ... TO ALL EXCEPT accountant, john@localhost
Оператор AS
Допускается одновременное включение нескольких политик для одной и той же таблицы и одного и того же пользователя. Поэтому нужен способ комбинировать условия из нескольких политик.
По умолчанию политики комбинируются с использованием логического оператора OR. Например, следующие политики:
разрешить пользователю peter просматривать строки, в которых выполняется условие b=1 или c=2.
Оператор AS задаёт, как следует объединять политики с другими политиками. Политики могут быть либо разрешающими, либо ограничивающими. По умолчанию политики являются разрешающими, то есть они объединяются с использованием логического оператора OR.
Политику также можно определить как ограничивающую. Ограничивающие политики объединяются с использованием логического оператора AND.
Общая формула выглядит так:
Например, следующие политики:
разрешить пользователю peter просматривать строки только в том случае, если одновременно выполняются условия b=1 И c=2.
Политики на уровне базы данных объединяются с политиками на уровне таблиц.
Например, следующие политики:
разрешить пользователю peter видеть строки таблицы table1 только при одновременном выполнении условий b=1 И c=2, тогда как
для всех остальных таблиц в mydb для этого пользователя будет применяться только политика b=1.
Предложение ON CLUSTER
Позволяет создавать ROW POLICY на кластере, см. 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