Отозвать привилегию можно с помощью выражения [REVOKE](revoke.md). Чтобы вывести список присвоенных привилегий, воспользуйтесь выражением [SHOW GRANTS](show.md#show-grants-statement).
GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION]
`WITH GRANT OPTION` разрешает пользователю или роли выполнять запрос `GRANT`. Пользователь может выдавать только те привилегии, которые есть у него, той же или меньшей области действий.
Для использования `GRANT` пользователь должен иметь привилегию `GRANT OPTION`. Пользователь может выдавать привилегии только внутри области действий назначенных ему самому привилегий.
Это означает, что пользователю `john` разрешено выполнять:
-`SELECT x,y FROM db.table`.
-`SELECT x FROM db.table`.
-`SELECT y FROM db.table`.
`john` не может выполнить `SELECT z FROM db.table` или `SELECT * FROM db.table`. После обработки данных запросов ClickHouse ничего не вернет — даже `x` или `y`. Единственное исключение — если таблица содержит только столбцы `x` и `y`. В таком случае ClickHouse вернет все данные.
Также у`john` есть привилегия `GRANT OPTION`. `john` может выдать другим пользователям привилегии той же или меньшей области действий из тех, которые есть у него.
При присвоении привилегий допускается использовать астериск (`*`) вместо имени таблицы или базы данных. Например, запрос `GRANT SELECT ON db.* TO john` позволит пользователю `john` выполнять `SELECT` над всеми таблицам в базе данных `db`. Также вы можете опускать имя базы данных. В таком случае привилегии позволят совершать операции над текущей базой данных. Например, запрос `GRANT SELECT ON * TO john` выдаст привилегию на выполнение `SELECT` над всеми таблицами в текущей базе данных; `GRANT SELECT ON mytable TO john` — только над таблицей `mytable` в текущей базе данных.
Доступ к базе данных `system` разрешен всегда (данная база данных используется при обработке запросов).
Вы можете присвоить несколько привилегий нескольким пользователям в одном запросе. Запрос `GRANT SELECT, INSERT ON *.* TO john, robin` позволит пользователям `john` и `robin` выполнять `INSERT` и `SELECT` над всеми таблицами всех баз данных на сервере.
## Привилегии {#grant-privileges}
Привилегия — это разрешение на выполнение определенного типа запросов.
Привилегии имеют иерархическую структуру. Набор разрешенных запросов зависит от области действия привилегии.
Иерархия привилегий:
- [SELECT](#grant-select)
- [INSERT](#grant-insert)
- [ALTER](#grant-alter)
-`ALTER TABLE`
-`ALTER UPDATE`
-`ALTER DELETE`
-`ALTER COLUMN`
-`ALTER ADD COLUMN`
-`ALTER DROP COLUMN`
-`ALTER MODIFY COLUMN`
-`ALTER COMMENT COLUMN`
-`ALTER CLEAR COLUMN`
-`ALTER RENAME COLUMN`
-`ALTER INDEX`
-`ALTER ORDER BY`
-`ALTER ADD INDEX`
-`ALTER DROP INDEX`
-`ALTER MATERIALIZE INDEX`
-`ALTER CLEAR INDEX`
-`ALTER CONSTRAINT`
-`ALTER ADD CONSTRAINT`
-`ALTER DROP CONSTRAINT`
-`ALTER TTL`
-`ALTER MATERIALIZE TTL`
-`ALTER SETTINGS`
-`ALTER MOVE PARTITION`
-`ALTER FETCH PARTITION`
-`ALTER FREEZE PARTITION`
-`ALTER VIEW`
-`ALTER VIEW REFRESH `
-`ALTER VIEW MODIFY QUERY`
- [CREATE](#grant-create)
-`CREATE DATABASE`
-`CREATE TABLE`
-`CREATE VIEW`
-`CREATE DICTIONARY`
-`CREATE TEMPORARY TABLE`
- [DROP](#grant-drop)
-`DROP DATABASE`
-`DROP TABLE`
-`DROP VIEW`
-`DROP DICTIONARY`
- [TRUNCATE](#grant-truncate)
- [OPTIMIZE](#grant-optimize)
- [SHOW](#grant-show)
-`SHOW DATABASES`
-`SHOW TABLES`
-`SHOW COLUMNS`
-`SHOW DICTIONARIES`
- [KILL QUERY](#grant-kill-query)
- [ACCESS MANAGEMENT](#grant-access-management)
-`CREATE USER`
-`ALTER USER`
-`DROP USER`
-`CREATE ROLE`
-`ALTER ROLE`
-`DROP ROLE`
-`CREATE ROW POLICY`
-`ALTER ROW POLICY`
-`DROP ROW POLICY`
-`CREATE QUOTA`
-`ALTER QUOTA`
-`DROP QUOTA`
-`CREATE SETTINGS PROFILE`
-`ALTER SETTINGS PROFILE`
-`DROP SETTINGS PROFILE`
-`SHOW ACCESS`
-`SHOW_USERS`
-`SHOW_ROLES`
-`SHOW_ROW_POLICIES`
-`SHOW_QUOTAS`
-`SHOW_SETTINGS_PROFILES`
-`ROLE ADMIN`
- [SYSTEM](#grant-system)
-`SYSTEM SHUTDOWN`
-`SYSTEM DROP CACHE`
-`SYSTEM DROP DNS CACHE`
-`SYSTEM DROP MARK CACHE`
-`SYSTEM DROP UNCOMPRESSED CACHE`
-`SYSTEM RELOAD`
-`SYSTEM RELOAD CONFIG`
-`SYSTEM RELOAD DICTIONARY`
-`SYSTEM RELOAD EMBEDDED DICTIONARIES`
-`SYSTEM MERGES`
-`SYSTEM TTL MERGES`
-`SYSTEM FETCHES`
-`SYSTEM MOVES`
-`SYSTEM SENDS`
-`SYSTEM DISTRIBUTED SENDS`
-`SYSTEM REPLICATED SENDS`
-`SYSTEM REPLICATION QUEUES`
-`SYSTEM SYNC REPLICA`
-`SYSTEM RESTART REPLICA`
-`SYSTEM FLUSH`
-`SYSTEM FLUSH DISTRIBUTED`
-`SYSTEM FLUSH LOGS`
- [INTROSPECTION](#grant-introspection)
-`addressToLine`
-`addressToSymbol`
-`demangle`
- [SOURCES](#grant-sources)
-`FILE`
-`URL`
-`REMOTE`
-`MYSQL`
-`ODBC`
-`JDBC`
-`HDFS`
-`S3`
- [dictGet](#grant-dictget)
Примеры того, как трактуется данная иерархия:
- Привилегия `ALTER` включает все остальные `ALTER*` привилегии.
-`ALTER CONSTRAINT` включает `ALTER ADD CONSTRAINT` и `ALTER DROP CONSTRAINT`.
Привилегии применяются на разных уровнях. Уровень определяет синтаксис присваивания привилегии.
Уровни (от низшего к высшему):
-`COLUMN` — Привилегия присваивается для столбца, таблицы, базы данных или глобально.
-`TABLE` — Привилегия присваивается для таблицы, базы данных или глобально.
-`VIEW` — Привилегия присваивается для представления, базы данных или глобально.
-`DICTIONARY` — Привилегия присваивается для словаря, базы данных или глобально.
-`DATABASE` — Привилегия присваивается для базы данных или глобально.
-`GLOBAL` — Привилегия присваивается только глобально.
-`GROUP` — Группирует привилегии разных уровней. При присвоении привилегии уровня `GROUP` присваиваются только привилегии из группы в соответствии с используемым синтаксисом.
Примеры допустимого синтаксиса:
-`GRANT SELECT(x) ON db.table TO user`
-`GRANT SELECT ON db.* TO user`
Примеры недопустимого синтаксиса:
-`GRANT CREATE USER(x) ON db.table TO user`
-`GRANT CREATE USER ON db.* TO user`
Специальная привилегия [ALL](#grant-all) присваивает все привилегии пользователю или роли.
По умолчанию пользователь или роль не имеют привилегий.
Отсутствие привилегий у пользователя или роли отображается как привилегия [NONE](#grant-none).
Выполнение некоторых запросов требует определенного набора привилегий. Например, чтобы выполнить запрос [RENAME](misc.md#misc_operations-rename), нужны следующие привилегии: `SELECT`, `CREATE TABLE`, `INSERT` и `DROP TABLE`.
Пользователь с данной привилегией может выполнять запросы `SELECT` над определенными столбцами из определенной таблицы и базы данных. При включении в запрос других столбцов запрос ничего не вернет.
Данная привилегия позволяет пользователю `john` выполнять выборку данных из столбцов `x` и/или `y` в `db.table`, например, `SELECT x FROM db.table`. `john` не может выполнить `SELECT z FROM db.table` или `SELECT * FROM db.table`. После обработки данных запросов ClickHouse ничего не вернет — даже `x` или `y`. Единственное исключение — если таблица содержит только столбцы `x` и `y`. В таком случае ClickHouse вернет все данные.
Пользователь с данной привилегией может выполнять запросы `INSERT` над определенными столбцами из определенной таблицы и базы данных. При включении в запрос других столбцов запрос не добавит никаких данных.
- Для остановки мутации с помощью [KILL MUTATION](../../sql-reference/statements/kill.md#kill-mutation), необходима привилегия на выполнение данной мутации. Например, чтобы остановить запрос `ALTER UPDATE`, необходима одна из привилегий: `ALTER UPDATE`, `ALTER TABLE` или `ALTER`.
Разрешает выполнять DDL-запросы [CREATE](../../sql-reference/statements/create/index.md) и [ATTACH](misc.md#attach) в соответствии со следующей иерархией привилегий:
Разрешает использовать внешние источники данных. Применяется к [движкам таблиц](../../engines/table-engines/index.md) и [табличным функциям](../table-functions/index.md#table-functions).
Привилегия `SOURCES` разрешает использование всех источников. Также вы можете присвоить привилегию для каждого источника отдельно. Для использования источников необходимы дополнительные привилегии.
- Чтобы создать таблицу с [движком MySQL](../../engines/table-engines/integrations/mysql.md), необходимы привилегии `CREATE TABLE (ON db.table_name)` и `MYSQL`.
- Чтобы использовать [табличную функцию mysql](../table-functions/mysql.md), необходимы привилегии `CREATE TEMPORARY TABLE` и `MYSQL`.