- Запросы на чтение данных:
SELECT,SHOW,DESCRIBE,EXISTS. - Запросы на запись данных:
INSERT,OPTIMIZE,DELETE,UPDATE,ALTER TABLE ... DELETE,ALTER TABLE ... UPDATE. - Запросы на изменение настроек:
SET,USE. - DDL DDL-запросы:
CREATE,ALTER,RENAME,EXCHANGE,ATTACH,DETACH,DROP,TRUNCATE. - Запросы управления доступом:
GRANT,REVOKE, а такжеCREATE,ALTERиDROPпользователей, ролей, политик строк, политик маскирования, квот и профилей настроек. См. систему управления доступом и учётными записями. KILL QUERY.
ALTER TABLE ... DELETE и ALTER TABLE ... UPDATE изменяют данные, а не метаданные таблицы, поэтому
выше они отнесены к запросам на запись данных. Для них требуются привилегии ALTER DELETE и
ALTER UPDATE — те же самые привилегии, которые требуются для автономных операторов DELETE и UPDATE.
Эти привилегии относятся к группе привилегий ALTER TABLE, поэтому при allow_ddl = 0
все четыре оператора для постоянной таблицы отклоняются.
Следующие настройки определяют права пользователя в зависимости от типа запроса:
readonly
Ограничивает, какие запросы может выполнять сеанс. Значения этой настройки, значение по умолчанию и то, какие настройки позволяет изменять каждое значение, описаны в справочнике по настройкам; в этом разделе описано, какие классы запросов разрешает каждое значение. При значении 1 разрешены такие запросы, как:- Запросы на чтение (например,
SELECTи эквивалентные ему запросы). - Запросы, изменяющие только контекст сеанса (например,
USE).
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,
вставлять в неё данные и удалять её.
При работе через HTTP interface запрос, метод которого отличается от
POST, выполняется
с readonly = 2, если иначе действующее значение было бы равно 0. Более строгое значение, уже заданное
настройками пользователя или профилем настроек, сохраняется. Исключение составляют PUT и DELETE, когда они попадают в
обработчик, определённый через SQL, который их принимает: такой запрос может
изменять данные, если действующее значение readonly равно 0; в остальных случаях для изменения данных используйте метод POST.Для запроса, к которому применено такое повышение, параметр readonly в query string отклоняется с сообщением
Cannot modify 'readonly' setting in readonly mode, если только он не задаёт то же значение, которое запрос уже имеет.Существует способ запретить пользователю изменять только определённые настройки, а также способ разрешить изменять
только определённые настройки в условиях ограничений readonly = 1. Подробнее см.
ограничения на настройки, где также
не рекомендуется делать саму настройку readonly
изменяемой в режиме только для чтения.allow_ddl
Разрешает или запрещает DDL-запросы к базам данных, таблицам, представлениям, словарям, пользовательским функциям, рабочим нагрузкам, ресурсам и обработчикам, определённым через 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 — эта настройка ничего не блокирует.
Выполнить
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.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 не допускают.Другие связанные настройки
allow_introspection_functions— третья настройка, которая наряду сreadonlyиallow_ddlучаствует непосредственно в принятии решения о доступе. Если она отключена, выполнение функции интроспекции блокируется, а вот выдача привилегииINTROSPECTION— нет.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, это не распространяется.