Skip to main content
Создаёт ROW POLICY, то есть фильтр, который определяет, какие строки пользователь может читать из таблицы.
ROW POLICY имеют смысл только для пользователей с доступом только на чтение. Если пользователь может изменять таблицу или копировать партиции между таблицами, это сводит на нет ограничения, задаваемые ROW POLICY.
Синтаксис:
ParserRowPolicyNames поддерживает три формы группировки (не полный декартов продукт):
  1. Несколько имён, одна цельpol1, pol2 ON table1 создаёт каждую указанную политику для одной таблицы (или db.*).
  2. Одно имя, несколько целейpol1 ON table1, table2 создаёт одну и ту же политику с кратким именем для каждой указанной цели.
  3. Смешанные парыp1 ON t1, p2 ON t2 создаёт каждую политику только для соответствующей ей цели.
Список из нескольких имён нельзя объединить со списком из нескольких таблиц после ON в одной группе: p1, p2 ON t1, t2 не принимается. После группы с несколькими именами также нельзя добавить другую разделённую запятыми группу name ON target в том же операторе. Необязательное предложение ON CLUSTER применяется ко всему оператору (одно имя кластера). ClickHouse не поддерживает отдельное ON CLUSTER для каждого имени политики, сгруппированного в одном операторе создания — если политики необходимо создать в разных кластерах, выполните отдельные операторы CREATE 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 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.

Предложение ON CLUSTER

Позволяет создавать политики строк в кластере, см. 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 г.