Создаёт ROW POLICY, то есть фильтр, который определяет, какие строки пользователь может читать из таблицы.
ROW POLICY имеют смысл только для пользователей с доступом только на чтение. Если пользователь может изменять таблицу или копировать партиции между таблицами, это сводит на нет ограничения, задаваемые ROW POLICY.
Синтаксис:
ParserRowPolicyNames поддерживает три формы группировки (не полный декартов продукт):
- Несколько имён, одна цель —
pol1, pol2 ON table1 создаёт каждую указанную политику для одной таблицы (или db.*).
- Одно имя, несколько целей —
pol1 ON table1, table2 создаёт одну и ту же политику с кратким именем для каждой указанной цели.
- Смешанные пары —
p1 ON t1, p2 ON t2 создаёт каждую политику только для соответствующей ей цели.
Список из нескольких имён нельзя объединить со списком из нескольких таблиц после ON в одной группе: p1, p2 ON t1, t2 не принимается. После группы с несколькими именами также нельзя добавить другую разделённую запятыми группу name ON target в том же операторе.
Необязательное предложение ON CLUSTER применяется ко всему оператору (одно имя кластера). ClickHouse не поддерживает отдельное ON CLUSTER для каждого имени политики, сгруппированного в одном операторе создания — если политики необходимо создать в разных кластерах, выполните отдельные операторы CREATE ROW POLICY.
Допустимо:
Недопустимо:
Позволяет задать условие для фильтрации строк. Пользователь увидит строку, если значение условия для этой строки не равно нулю.
В секции TO можно указать список пользователей и ролей, для которых должна действовать эта политика. Например, CREATE ROW POLICY ... TO accountant, john@localhost.
Ключевое слово ALL означает всех пользователей ClickHouse, включая текущего пользователя. Ключевое слово ALL EXCEPT позволяет исключить отдельных пользователей из списка всех пользователей, например: CREATE ROW POLICY ... TO ALL EXCEPT accountant, john@localhost
Допускается, чтобы для одной и той же таблицы и одного и того же пользователя одновременно было включено несколько политик. Поэтому нужен способ объединять условия из нескольких политик.
По умолчанию политики объединяются с помощью булева оператора OR. Например, следующие политики:
разрешить пользователю peter видеть строки, где либо b=1, либо c=2.
Предложение AS указывает, как политики должны сочетаться с другими политиками. Политики могут быть либо разрешающими, либо ограничивающими. По умолчанию политики являются разрешающими, то есть они объединяются с помощью булева оператора OR.
В качестве альтернативы политику можно задать как ограничивающую. Ограничивающие политики объединяются с помощью булева оператора AND.
Вот общая формула:
Например, следующие политики:
разрешить пользователю peter видеть строки только при одновременном выполнении условий b=1 AND c=2.
Политики на уровне базы данных объединяются с политиками на уровне таблицы.
Например, следующие политики:
разрешить пользователю peter видеть строки таблицы table1 только при одновременном выполнении условий b=1 И c=2, хотя
для любой другой таблицы в mydb к пользователю применялась бы только политика b=1.
Распределённые таблицы и таблицы с удалённым доступом к данным
ROW POLICY фильтрует строки там, где фактически читаются данные таблицы. Таблица, делегирующая чтение удалённым серверам, например таблица Distributed или обёртка над ней (например, materialized view с целью Distributed), отправляет удалённым серверам только текст запроса и не может применить фильтр политики при удалённом чтении. Чтобы фильтр не был незаметно отброшен, запросы к такой таблице от пользователей, к которым применяется политика, отклоняются с ошибкой ILLEGAL_PREWHERE.
Вместо этого определите политику для базовых локальных таблиц на каждом удалённом сервере: она будет применяться там, когда переданный запрос читает эти таблицы:
Это работает, пока запрос передаётся в виде текста, что используется по умолчанию. При serialize_query_plan = 1 инициатор вместо этого передаёт уже сформированный план чтения, а удалённый сервер, выполняющий такой план, не применяет собственные ROW POLICY. Поэтому чтение таблицы Distributed через local_table возвращает неотфильтрованные строки. Для пользователей, к которым должны применяться ROW POLICY, сохраняйте значение serialize_query_plan = 0. См. issue #112891.
Позволяет создавать политики строк в кластере, см. 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 Последнее изменение 14 августа 2026 г.