> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Настройки прав для запросов.

# Права для запросов

Запросы в ClickHouse можно разделить на несколько типов:

1. Запросы на чтение данных: `SELECT`, `SHOW`, `DESCRIBE`, `EXISTS`.
2. Запросы на запись данных: `INSERT`, `OPTIMIZE`, [`DELETE`](/ru/reference/statements/delete), [`UPDATE`](/ru/reference/statements/update), `ALTER TABLE ... DELETE`, `ALTER TABLE ... UPDATE`.
3. Запросы на изменение настроек: `SET`, `USE`.
4. [DDL](https://en.wikipedia.org/wiki/Data_definition_language) DDL-запросы: `CREATE`, `ALTER`, `RENAME`, `EXCHANGE`, `ATTACH`, `DETACH`, `DROP`, `TRUNCATE`.
5. Запросы управления доступом: [`GRANT`](/ru/reference/statements/grant), [`REVOKE`](/ru/reference/statements/revoke), а также `CREATE`, `ALTER` и `DROP` пользователей, ролей, политик строк, политик маскирования, квот и профилей настроек. См. [систему управления доступом и учётными записями](/ru/concepts/features/security/access-rights).
6. `KILL QUERY`.

`ALTER TABLE ... DELETE` и `ALTER TABLE ... UPDATE` изменяют данные, а не метаданные таблицы, поэтому
выше они отнесены к запросам на запись данных. Для них требуются привилегии `ALTER DELETE` и
`ALTER UPDATE` — те же самые привилегии, которые требуются для автономных операторов `DELETE` и `UPDATE`.
Эти привилегии относятся к группе привилегий `ALTER TABLE`, поэтому при `allow_ddl = 0`
все четыре оператора для постоянной таблицы отклоняются.

Следующие настройки определяют права пользователя в зависимости от типа запроса:

<h2 id="readonly">
  readonly
</h2>

Ограничивает, какие запросы может выполнять сеанс. Значения этой настройки, значение по умолчанию и то,
какие настройки позволяет изменять каждое значение, описаны в
[справочнике по настройкам](/ru/reference/settings/session-settings/other#readonly); в этом разделе описано, какие
классы запросов разрешает каждое значение.

При значении 1 разрешены такие запросы, как:

* Запросы на чтение (например, `SELECT` и эквивалентные ему запросы).
* Запросы, изменяющие только контекст сеанса (например, `USE`).

При значении 2 дополнительно разрешены `SET`, `CREATE TEMPORARY TABLE` и `RESTORE`. `RESTORE` может
создать таблицу и загрузить в неё данные, поэтому `readonly = 2` сам по себе не препятствует записи из
сеанса; при `readonly = 1` такой запрос отклоняется.

`BACKUP` не ограничивается настройкой `readonly` ни при каком её значении: сеанс, обладающий привилегиями
на резервное копирование таблицы, может создать backup даже при `readonly = 1`. Не полагайтесь на
`readonly` для запрета резервного копирования.

Большинству табличных функций требуется привилегия `CREATE TEMPORARY TABLE`, поэтому `SELECT`, читающий
из такой функции, отклоняется при `readonly = 1`, но не при `readonly = 2`. Некоторые из них, например
`numbers`, разрешены в режиме только для чтения.

При любом значении больше 0 для постоянной таблицы не допускаются ни запросы на запись данных
(`INSERT`, `OPTIMIZE`, `DELETE`, `UPDATE`, `ALTER TABLE ... DELETE`, `ALTER TABLE ... UPDATE`), ни DDL-запросы
(`CREATE`, `ALTER TABLE`, `ALTER VIEW`, `RENAME`, `EXCHANGE`, `ATTACH`, `DETACH`, `DROP`,
`TRUNCATE TABLE`). Команды `SYSTEM`, требующие привилегии из группы `SYSTEM`, а также `CREATE`, `ALTER`
и `DROP` пользователей, ролей, политик строк, политик маскирования, квот и профилей настроек также
не допускаются. Исключением является управление именованными коллекциями: `readonly` не ограничивает
`CREATE NAMED COLLECTION`, `ALTER NAMED COLLECTION` и `DROP NAMED COLLECTION`.

Выдача привилегии с помощью `GRANT` также отклоняется, но не каждый оператор управления доступом: локальный
`REVOKE` и `GRANT CURRENT GRANTS` не ограничиваются настройкой `readonly`, поэтому сеанс только для чтения
по-прежнему может отозвать привилегию, которой он владеет с grant option, и передать собственные привилегии другому пользователю.
Отзыв привилегии с предложением `ON CLUSTER` отклоняется.

Обе настройки не распространяются на временные таблицы: сеанс, которому разрешено создать такую таблицу, может также выполнять для неё `ALTER`,
вставлять в неё данные и удалять её.

<Note>
  При работе через [HTTP interface](/ru/concepts/features/interfaces/http) запрос, метод которого отличается от `POST`, выполняется
  с `readonly = 2`, если иначе действующее значение было бы равно 0. Более строгое значение, уже заданное
  настройками пользователя или профилем настроек, сохраняется. Исключение составляют `PUT` и `DELETE`, когда они попадают в
  [обработчик](/ru/reference/statements/create/handler), определённый через SQL, который их принимает: такой запрос может
  изменять данные, если действующее значение `readonly` равно 0; в остальных случаях для изменения данных используйте метод `POST`.

  Для запроса, к которому применено такое повышение, параметр `readonly` в query string отклоняется с сообщением
  `Cannot modify 'readonly' setting in readonly mode`, если только он не задаёт то же значение, которое запрос уже имеет.

  Существует способ запретить пользователю изменять только определённые настройки, а также способ разрешить изменять
  только определённые настройки в условиях ограничений `readonly = 1`. Подробнее см.
  [ограничения на настройки](/ru/concepts/features/configuration/settings/constraints-on-settings), где также
  не рекомендуется делать саму настройку `readonly`
  [изменяемой в режиме только для чтения](/ru/concepts/features/configuration/settings/constraints-on-settings#readonly-changeable-in-readonly).
</Note>

<h2 id="allow_ddl">
  allow\_ddl
</h2>

Разрешает или запрещает [DDL](https://en.wikipedia.org/wiki/Data_definition_language)-запросы к базам данных,
таблицам, представлениям, словарям, пользовательским функциям, рабочим нагрузкам, ресурсам и обработчикам, определённым через SQL.

Возможные значения:

* 0 — выполнение запроса к постоянному объекту, требующего любой из следующих привилегий, блокируется:
  `CREATE DATABASE`, `DROP DATABASE`, `CREATE TABLE`, `CREATE VIEW`, `ALTER TABLE`,
  `ALTER VIEW`, `DROP TABLE`, `DROP VIEW`, `TRUNCATE`, `CREATE DICTIONARY`, `DROP DICTIONARY`,
  `CREATE FUNCTION`, `DROP FUNCTION`, `CREATE WORKLOAD`, `DROP WORKLOAD`, `CREATE RESOURCE`,
  `DROP RESOURCE`, `CREATE HANDLER`, `ALTER HANDLER`, `DROP HANDLER`. Запросам `RENAME`, `EXCHANGE`,
  `ATTACH` и `DETACH` эти привилегии тоже нужны, поэтому они также блокируются — за исключением
  `ALTER TABLE ... ATTACH PARTITION` и `ATTACH PART`, которым достаточно только `INSERT`, поэтому
  эта настройка их не блокирует (хотя `readonly` блокирует их для постоянной таблицы).
  Запросу `ATTACH PARTITION ... FROM` дополнительно требуется `ALTER DELETE`, поэтому он блокируется. Выдача и отзыв
  этих привилегий не блокируются.
* 1 — эта настройка ничего не блокирует.

Значение по умолчанию: 1

<Note>
  Выполнить `SET allow_ddl = 1` нельзя, если в текущем сеансе установлено `allow_ddl = 0`.

  `allow_ddl` не ограничивает запросы управления доступом: на `GRANT`, `REVOKE`, а также на `CREATE`, `ALTER` и
  `DROP` пользователей, ролей, политик строк, политик маскирования, квот и профилей настроек эта настройка не влияет.
  `CREATE TEMPORARY TABLE` и управление именованными коллекциями она также не затрагивает,
  равно как и `ALTER DATABASE ... MODIFY SETTING`, `ALTER DATABASE ... MODIFY COMMENT` и `UNDROP TABLE`,
  которые не ограничивает и `readonly`. Внутри `CREATE` или `ALTER` пользователя, роли или профиля настроек
  предложение `SETTINGS allow_ddl = 1` отклоняется, пока в текущем сеансе действует `allow_ddl = 0`,
  а предложение `SETTINGS allow_ddl = 0` принимается. Встроенная настройка проверяется на соответствие собственным
  ограничениям настроек сеанса — по этой же причине отклоняется и `SET allow_ddl = 1`.
</Note>

<Info>
  **KILL QUERY**

  Завершение собственных запросов не требует привилегии `KILL QUERY`, поэтому оно работает при любом сочетании
  `readonly` и `allow_ddl`. Однако требуется привилегия `SELECT` на `system.processes` — за исключением запроса
  `KILL QUERY WHERE query_id = '<id>'`, который отменяет ваш собственный запрос с этим ID, не читая эту
  таблицу. Завершение запроса, принадлежащего другому пользователю, а также любой `KILL QUERY ... ON CLUSTER` требуют
  привилегии `KILL QUERY`, которую `readonly = 1` и `readonly = 2` не допускают.
</Info>

<h2 id="other-relevant-settings">
  Другие связанные настройки
</h2>

* [`allow_introspection_functions`](/ru/reference/settings/session-settings/allow#allow_introspection_functions)
  — третья настройка, которая наряду с `readonly` и `allow_ddl` участвует непосредственно в
  принятии решения о доступе. Если она отключена, выполнение функции интроспекции блокируется, а вот
  выдача привилегии `INTROSPECTION` — нет.
* [`allow_non_metadata_alters`](/ru/reference/settings/session-settings/allow#allow_non_metadata_alters)
  не является настройкой разрешений, но дополнительно ограничивает `ALTER TABLE`: если она отключена, команда,
  изменяющая определение таблицы, отклоняется для таблиц семейства `MergeTree` в случае, когда её применение привело бы к
  перезаписи данных на диске (`DROP COLUMN`, `RENAME COLUMN`, изменение типа через `MODIFY COLUMN`, `MODIFY TTL`).
  `CLEAR COLUMN`, `CLEAR INDEX` и `CLEAR PROJECTION` также отклоняются, хотя они и оставляют
  определение без изменений. На команды, которые сами по себе являются мутациями, такие как `ALTER TABLE ... DELETE`,
  `ALTER TABLE ... UPDATE` и `ALTER TABLE ... MATERIALIZE INDEX`, это не распространяется.
