[Документация Yandex Cloud](../../index.md) > [Yandex Managed Service for Trino](../index.md) > [Пошаговые инструкции](index.md) > Правила доступа к объектам > Назначение правил для таблиц

# Назначение правил доступа к таблицам в Managed Service for Trino

Правила доступа к таблицам определяют, какие действия пользователи могут совершать над таблицами в кластере Managed Service for Trino.

Для каждой пары пользователь-таблица правила применяются следующим образом:
* Правила проверяются в порядке их объявления. Применяется первое найденное правило, которое соответствует паре пользователь-таблица.
* Если ни одно из заданных правил не соответствует паре пользователь-таблица, пользователю запрещаются любые действия над таблицей.
* Если не задано ни одно правило доступа к таблицам, каждый пользователь может выполнять любые действия над любой таблицей.
* Правила доступа к таблицам применяются совместно с общими [правилами доступа к объектам каталогов](access-control-catalogs.md).

Общая информация о правилах доступа приведена в разделе [Управление доступом в Managed Service for Trino](../concepts/access-control.md).

## Назначить правила при создании кластера {#set-at-create}

Правила доступа к таблицам можно назначить одновременно с созданием кластера Managed Service for Trino.

{% note warning %}
  
Указанные в правилах имена таблиц и схем не проверяются на валидность. Ошибка в имени таблицы или схемы приведет к некорректной работе правила.
  
{% endnote %}

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, в котором нужно создать кластер Managed Service for Trino.
  1. Перейдите в сервис **Managed Service for&nbsp;Trino**.
  1. Нажмите кнопку **Создать кластер** и задайте параметры кластера.
  1. В блоке **Настройки доступа** нажмите на значок ![image](../../_assets/console-icons/chevron-down.svg).
  1. В поле **Таблицы** нажмите кнопку **Добавить правило**.
  1. В открывшемся окне задайте параметры правила:

     1. (Опционально) В поле **Комментарий** введите описание правила.

     1. (Опционально) В поле **Пользователи** выберите пользователей, на которых распространяется правило:
        1. Нажмите кнопку **Добавить**.
        1. В открывшемся списке выберите нужных пользователей. Чтобы найти пользователя, используйте строку поиска над списком.
        1. Чтобы удалить пользователя, выбранного по ошибке, повторно нажмите на него в списке.
        
        Если не выбран ни один пользователь, правило распространяется на всех пользователей.

     1. (Опционально) В поле **Группы** выберите группы пользователей, на которые распространяется правило:
        1. Нажмите кнопку **Добавить**.
        1. В открывшемся списке выберите нужные группы. Чтобы найти группу, используйте строку поиска над списком.
        1. Чтобы удалить группу, выбранную по ошибке, повторно нажмите на нее в списке.
        
        Если не выбрана ни одна группа, правило распространяется на все группы пользователей.

     1. (Опционально) В поле **Привилегии** выберите разрешенные действия над таблицами:
        * `SELECT` — чтение данных.
        * `INSERT` — вставка данных.
        * `DELETE` — удаление данных.
        * `UPDATE` — обновление данных.
        * `OWNERSHIP` — создание и удаление таблицы, изменение состава столбцов, добавление к ней комментариев.
        * `GRANT_SELECT` — создание `VIEW` с чтением данных из таблицы.

        Если не выбрано ни одно разрешенное действие, правило запрещает выполнение любых действий над таблицами.

        {% note info %}

        Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.

        {% endnote %}

     1. (Опционально) В поле **Фильтр** укажите булево SQL-выражение, определяющее доступ пользователей к строкам таблицы.

        Пользователь получит доступ к строке, только если выражение вернет `TRUE`. Вычисление SQL-выражения происходит от имени пользователя, выполняющего запрос. Если параметр `filter` не указан или содержит пустую строку, пользователям доступны все строки таблицы.

     1. (Опционально) Задайте полные имена таблиц, к которым будет применяться правило, в формате `<имя_каталога>.<имя_схемы>.<имя_таблицы>`. Каждая часть имени задается с помощью отдельного поля.

        1. Выберите, в каком формате указать каталоги:
           * **Имя** — выберите имена каталогов. Можно выбрать только каталоги, добавленные в блоке **Каталоги**.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен каталогов.
           * **Не задано** — в поле `<имя_каталога>` может быть любое значение.

        1. Выберите, в каком формате указать схемы:
           * **Имя** — выберите имена схем.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен схем.
           * **Не задано** — в поле `<имя_схемы>` может быть любое значение.

        1. Выберите, в каком формате указать таблицы:
           * **Имя** — выберите имена таблиц.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен таблиц.
           * **Не задано** — в поле `<имя_таблицы>` может быть любое значение.

     1. (Опционально) В поле **Доступ к столбцам** добавьте список правил, ограничивающих доступ пользователей к столбцам таблицы:
        1. Нажмите кнопку **Добавить столбец**.
        1. Укажите имя столбца.
        1. Выберите, доступен ли столбец: `None` — недоступен, `All` — доступен.
        1. Укажите маску.

           {% note info %}

           Маска — это SQL-выражение для маскирования столбца. При чтении пользователь получит результат выражения вместо значения в этом столбце. SQL-выражение должно иметь тип, совпадающий с типом маскируемой колонки. Если маска не указана, для этого столбца маскирование не будет использоваться.

           {% endnote %}

        1. При необходимости добавьте другие правила аналогичным образом.
        1. Чтобы удалить правило, добавленное по ошибке, в строке этого правила нажмите на значок ![trash-bin](../../_assets/console-icons/trash-bin.svg).

        Если для столбца не задано правило, доступ пользователей к нему не ограничен.

  1. При необходимости добавьте другие правила аналогичным образом.
  1. Чтобы удалить правило, добавленное по ошибке, в строке этого правила нажмите на значок ![trash-bin](../../_assets/console-icons/trash-bin.svg).
  1. Нажмите кнопку **Создать**.

- CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  Чтобы задать правила доступа к таблицам:

  1. Создайте файл `access_control.yaml` и добавьте в него следующее содержимое:

     ```yaml
     tables:
       # Правило 1
       - privileges: [<список_разрешений>]
         catalog:
           name_regexp: <регулярное_выражение>
         schema:
           names:
             any: [<список_имен_схем>]
           name_regexp: <регулярное_выражение>
         table:
           names:
             any: [<список_имен_таблиц>]
           name_regexp: <регулярное_выражение>
         columns:
           # Правило доступа к столбцу 1
           - name: <имя_столбца>
             access: <доступность_столбца>
             mask: <SQL-выражение>
           # Правило доступа к столбцу 2
           - <Параметры_доступа_к_столбцу_2>
           ...
           # Правило доступа к столбцу N
           - <Параметры_доступа_к_столбцу_N>
         filter: <SQL-выражение>           
         groups: [<список_идентификаторов_групп>]
         users: [<список_идентификаторов_пользователей>]
         description: <описание_правила>
       # Правило 2
       - <Параметры_правила_2>
       ...
       # Правило N
       - <Параметры_правила_N>
     ```

     Где:

     * `tables` — список правил для таблиц. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `table`, `columns`, `filter`, `groups`, `users` и `description`.

     * `privileges` — список разрешенных действий над таблицами:
       * `SELECT` — чтение данных.
       * `INSERT` — вставка данных.
       * `DELETE` — удаление данных.
       * `UPDATE` — обновление данных.
       * `OWNERSHIP` — создание и удаление таблицы, изменение состава столбцов, добавление к ней комментариев.
       * `GRANT_SELECT` — создание `VIEW` c чтением данных из таблицы.

       ## Function-ownership {#function-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
       
       {% endnote %}
       
       ## Procedures-privileges {#procedures-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
       
       ## Queries-privileges {#queries-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
       
       {% endnote %}
       
       ## Queries-privileges-REST {#queries-privileges-rest}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
       
       {% endnote %}
       
       ## Tables-privileges {#table-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
       
       {% endnote %}

     * `catalog`, `schema` и `table` — совместно определяют таблицы, к которым будет применяться правило. Каждый из параметров является опциональным.

       * `catalog` — каталоги, задаваемые с помощью параметра `name_regexp` (регулярное выражение для имен каталогов).

         Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

       * `schema` — схемы, задаваемые одним из параметров:
         * `names` — список имен схем.
         * `name_regexp` — регулярное выражение для имен схем.

         Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

       * `table` — таблицы, задаваемые одним из параметров:
         * `names` — список имен таблиц.
         * `name_regexp` — регулярное выражение для имен таблиц.

         Если блок `table` не указан, это равносильно регулярному выражению `.*`.

       {% note info %}

       В Managed Service for Trino полное имя таблицы формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_таблицы>`. Правило применяется к таблице, только если ее полное имя соответствует всем заданным параметрам.

       {% endnote %}

     * `columns` — список правил, ограничивающих доступ пользователей к столбцам таблицы. Каждое правило включает в себя обязательные параметры `name` и `access`, а также опциональный параметр `mask`.
       * `name` — имя столбца.
       * `access` — доступность столбца:
         * `ALL` — столбец доступен.
         * `NONE` — столбец недоступен.
       * `mask` — SQL-выражение для маскирования столбца. При чтении пользователь получит результат выражения вместо значения в этом столбце. SQL-выражение должно иметь тип, совпадающий с типом маскируемой колонки. Если параметр `mask` не указан или содержит пустую строку, для этого столбца маскирование не будет использоваться.

       Если для столбца не задано правило, доступ пользователей к нему не ограничен.

     * `filter` — булево SQL-выражение, определяющее доступ пользователей к строкам таблицы. Пользователь получит доступ к строке, только если выражение вернет `TRUE`. Вычисление SQL-выражения происходит от имени пользователя, выполняющего запрос. Если параметр `filter` не указан или содержит пустую строку, пользователям доступны все строки таблицы.

     * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
     
       * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
     
       * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
     
       Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
     
     * `description` — описание правила.

  2. Посмотрите описание команды CLI для создания кластера:

     ```bash
     yc managed-trino cluster create --help
     ```

  3. Выполните команду:

     ```bash
     yc managed-trino cluster create \
       ...
       --access-control-from-file access_control.yaml
     ```

     Доступные параметры кластера и их описания представлены в [инструкции](cluster-create.md#create-cluster).

- Terraform {#tf}

  1. Создайте конфигурационный файл Terraform с [планом инфраструктуры](cluster-create.md).
  
  1. Добавьте в конфигурационный файл ресурс `yandex_trino_access_control`, содержащий список правил `tables`.
 
     ```hcl
     resource "yandex_trino_cluster" "<имя_кластера>" {
       ...
     }

     resource "yandex_trino_catalog" "<имя_каталога_1>" {
       ...
     }

     resource "yandex_trino_catalog" "<имя_каталога_2>" {
       ...
     }

     ...

     resource "yandex_trino_catalog" "<имя_каталога_N>" {
       ...
     }

     resource "yandex_trino_access_control" "trino_access_control" {
       ...
       cluster_id  = yandex_trino_cluster.<имя_кластера>.id
       tables = [
         # Правило 1
         {
           privileges    = ["<список_разрешений>"]
           catalog       = {
             ids         = [
               yandex_trino_catalog.<имя_каталога_1>.id,
               yandex_trino_catalog.<имя_каталога_2>.id,
               ... 
               yandex_trino_catalog.<имя_каталога_N>.id
             ]
             name_regexp = "<регулярное_выражение>"
           }
           schema        = {
             names       = ["<список_имен_схем>"]
             name_regexp = "<регулярное_выражение>"
           }
           table         = {
             names       = ["<список_имен_таблиц>"]
             name_regexp = "<регулярное_выражение>"
           }
           columns       = [
             # Правило доступа к столбцу 1
             {
               name      = "<имя_столбца>"
               access    = "<доступность_столбца>"
               mask      = "<SQL-выражение>"
             },
             # Правило доступа к столбцу 2
             {
               ...
             },
             ...
             # Правило доступа к столбцу N
             {
               ...
             }                       
           ]
           filter        = "<SQL-выражение>"
           users         = ["<список_идентификаторов_пользователей>"]
           groups        = ["<список_идентификаторов_групп>"]
           description   = "<описание_правила>"
         },
         # Правило 2
         {
           ... 
         },
         ...
         # Правило N
         {
           ... 
         }
       ]
       ...
     }
     ```

     Где:

     * `tables` — список блоков правил для таблиц. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `table`, `columns`, `filter`, `groups`, `users` и `description`.

     * `privileges` — список разрешенных действий над таблицами:
       * `SELECT` — чтение данных.
       * `INSERT` — вставка данных.
       * `DELETE` — удаление данных.
       * `UPDATE` — обновление данных.
       * `OWNERSHIP` — создание и удаление таблицы, изменение состава столбцов, добавление к ней комментариев.
       * `GRANT_SELECT` — создание `VIEW` c чтением данных из таблицы.

       ## Function-ownership {#function-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
       
       {% endnote %}
       
       ## Procedures-privileges {#procedures-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
       
       ## Queries-privileges {#queries-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
       
       {% endnote %}
       
       ## Queries-privileges-REST {#queries-privileges-rest}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
       
       {% endnote %}
       
       ## Tables-privileges {#table-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
       
       {% endnote %}

     * `catalog`, `schema` и `table` — совместно определяют таблицы, к которым будет применяться правило. Каждый из параметров является опциональным.

       * `catalog` — каталоги, задаваемые одним из параметров:
         * `ids` — список идентификаторов каталогов. Указанные каталоги должны создаваться в том же манифесте.
         * `name_regexp` — регулярное выражение для имен каталогов.

         Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

       * `schema` — схемы, задаваемые одним из параметров:
         * `names` — список имен схем.
         * `name_regexp` — регулярное выражение для имен схем.

         Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

       * `table` — таблицы, задаваемые одним из параметров:
         * `names` — список имен таблиц.
         * `name_regexp` — регулярное выражение для имен таблиц.

         Если блок `table` не указан, это равносильно регулярному выражению `.*`.

       {% note info %}

       В Managed Service for Trino полное имя таблицы формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_таблицы>`. Правило применяется к таблице, только если ее полное имя соответствует всем заданным параметрам.

       {% endnote %}

     * `columns` — список блоков правил, ограничивающих доступ пользователей к столбцам таблицы. Каждое правило включает в себя обязательные параметры `name` и `access`, а также опциональный параметр `mask`.
       * `name` — имя столбца.
       * `access` — доступность столбца:
         * `ALL` — столбец доступен.
         * `NONE` — столбец недоступен.
       * `mask` — SQL-выражение для маскирования столбца. При чтении пользователь получит результат выражения вместо значения в этом столбце. SQL-выражение должно иметь тип, совпадающий с типом маскируемой колонки. Если параметр `mask` не указан или содержит пустую строку, для этого столбца маскирование не будет использоваться.

       Если для столбца не задано правило, доступ пользователей к нему не ограничен.

     * `filter` — булево SQL-выражение, определяющее доступ пользователей к строкам таблицы. Пользователь получит доступ к строке, только если выражение вернет `TRUE`. Вычисление SQL-выражения происходит от имени пользователя, выполняющего запрос. Если параметр `filter` не указан или содержит пустую строку, пользователям доступны все строки таблицы.

     * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
     
       * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
     
       * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
     
       Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
     
     * `description` — описание правила.

  2. Проверьте корректность настроек.
  
      1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
      1. Выполните команду:
      
         ```bash
         terraform validate
         ```
      
         Если в файлах конфигурации есть ошибки, Terraform на них укажет.
  
  3. Подтвердите изменение ресурсов.
  
      1. Выполните команду для просмотра планируемых изменений:
      
         ```bash
         terraform plan
         ```
      
         Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
      
      1. Если вас устраивают планируемые изменения, внесите их:
         1. Выполните команду:
      
            ```bash
            terraform apply
            ```
      
         1. Подтвердите изменение ресурсов.
         1. Дождитесь завершения операции.
 
  Подробнее в [документации провайдера Terraform](../../terraform/resources/trino_access_control.md).

- REST API {#api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  1. Создайте файл `body.json` и добавьте в него следующее содержимое:

      ```json
      {
        <Параметры_кластера>
        ...
        "trino": {
          "catalogs": [
            {
              "name": "имя_каталога_1",
              ...
            },
            {
              "name": "имя_каталога_2",
              ...
            },
            ...
            {
              "name": "имя_каталога_N",
              ...
            }
          ]
          ...
          "accessControl": {
            "tables": [
              {
                "privileges": [
                  "<список_разрешений>"
                ],
                "catalog": {
                  "names": {
                    "any": [
                      "<имя_каталога_1>",
                      "<имя_каталога_2>",
                      ...
                      "<имя_каталога_N>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "schema": {
                  "names": {
                    "any": [
                      "<список_имен_схем>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "table": {
                  "names": {
                    "any": [
                      "<список_имен_таблиц>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "columns": [
                  {
                    "name": "<имя_столбца>",
                    "access": "<доступность_столбца>",
                    "mask": "<SQL-выражение>"
                  },
                  {
                    <Правило_доступа_к_столбцу_2>
                  },
                  ...
                  {
                    <Правило_доступа_к_столбцу_N>
                  }
                ],
                "filter": "<SQL-выражение>",
                "users": [
                  "<список_идентификаторов_пользователей>"
                ],
                "groups": [
                  "<список_идентификаторов_групп>"
                ],
                "description": "<описание_правила>"
              },
              {
                <Блок_правила_2>
              },
              ...
              {
                <Блок_правила_N>
              }
            ]
          }
        }
      }
      ```

      Где:

      * `accessControl` — конфигурация прав доступа в рамках кластера.

      * `tables` — список блоков правил для таблиц. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `table`, `columns`, `filter`, `groups`, `users` и `description`.

      * `privileges` — список разрешенных действий над таблицами:
        * `SELECT` — чтение данных.
        * `INSERT` — вставка данных.
        * `DELETE` — удаление данных.
        * `UPDATE` — обновление данных.
        * `OWNERSHIP` — создание и удаление таблицы, изменение состава столбцов, добавление к ней комментариев.
        * `GRANT_SELECT` — создание `VIEW` с чтением данных из таблицы.

        ## Function-ownership {#function-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
        
        {% endnote %}
        
        ## Procedures-privileges {#procedures-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
        
        ## Queries-privileges {#queries-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
        
        {% endnote %}
        
        ## Queries-privileges-REST {#queries-privileges-rest}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
        
        {% endnote %}
        
        ## Tables-privileges {#table-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
        
        {% endnote %}

     * `catalog`, `schema` и `table` — совместно определяют таблицы, к которым будет применяться правило. Каждый из параметров является опциональным.

       * `catalog` — каталоги, задаваемые одним из параметров:
         * `names` — список имен каталогов. Каталоги должны создаваться в этом же вызове [Cluster.Create](../api-ref/Cluster/create.md).
         * `nameRegexp` — регулярное выражение для имен каталогов.

         Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

       * `schema` — схемы, задаваемые одним из параметров:
         * `names` — список имен схем.
         * `nameRegexp` — регулярное выражение для имен схем.

         Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

       * `table` — таблицы, задаваемые одним из параметров:
         * `names` — список имен таблиц.
         * `nameRegexp` — регулярное выражение для имен таблиц.

         Если блок `table` не указан, это равносильно регулярному выражению `.*`.

       {% note info %}

       В Managed Service for Trino полное имя таблицы формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_таблицы>`. Правило применяется к таблице, только если ее полное имя соответствует всем заданным параметрам.

       {% endnote %}

      * `columns` — список блоков правил, ограничивающих доступ пользователей к столбцам таблицы. Каждое правило включает в себя обязательные параметры `name` и `access`, а также опциональный параметр `mask`.
        * `name` — имя столбца.
        * `access` — доступность столбца:
          * `ALL` — столбец доступен.
          * `NONE` — столбец недоступен.
        * `mask` — SQL-выражение для маскирования столбца. При чтении пользователь получит результат выражения вместо значения в этом столбце. SQL-выражение должно иметь тип, совпадающий с типом маскируемой колонки. Если параметр `mask` не указан или содержит пустую строку, для этого столбца маскирование не будет использоваться.

        Если для столбца не задано правило, доступ пользователей к нему не ограничен.

      * `filter` — булево SQL-выражение, определяющее доступ пользователей к строкам таблицы. Пользователь получит доступ к строке, только если выражение вернет `TRUE`. Вычисление SQL-выражения происходит от имени пользователя, выполняющего запрос. Если параметр `filter` не указан или содержит пустую строку, пользователям доступны все строки таблицы.

      * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
      
        * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
      
        * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
      
        Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
      
      * `description` — описание правила.

      Доступные параметры кластера и их описания представлены в [инструкции](cluster-create.md#create-cluster).

  1. Воспользуйтесь методом [Cluster.Create](../api-ref/Cluster/create.md) и выполните запрос, например с помощью [cURL](https://curl.se/):

      ```bash
      curl \
          --request POST \
          --header "Authorization: Bearer $IAM_TOKEN" \
          --url 'https://trino.api.cloud.yandex.net/managed-trino/v1/clusters'
          --data '@body.json'
      ```

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/create.md#yandex.cloud.operation.Operation).

- gRPC API {#grpc-api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  2. Клонируйте репозиторий [cloudapi](https://github.com/yandex-cloud/cloudapi):
     
     ```bash
     cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapi
     ```
     
     Далее предполагается, что содержимое репозитория находится в директории `~/cloudapi/`.

  3. Создайте файл `body.json` и добавьте в него следующее содержимое:

      ```json
      {
        <Параметры_кластера>
        ...
        "trino": {
          "catalogs": [
            {
              "name": "имя_каталога_1",
              ...
            },
            {
              "name": "имя_каталога_2",
              ...
            },
            ...
            {
              "name": "имя_каталога_N",
              ...
            }
          ]
          ...
          "access_control": {
            "tables": [
              {
                "privileges": [
                  "<список_разрешений>"
                ],
                "catalog": {
                  "names": {
                    "any": [
                      "<имя_каталога_1>",
                      "<имя_каталога_2>",
                      ...
                      "<имя_каталога_N>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "schema": {
                  "names": {
                    "any": [
                      "<список_имен_схем>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "table": {
                  "names": {
                    "any": [
                      "<список_имен_таблиц>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "columns": [
                  {
                    "name": "<имя_столбца>",
                    "access": "<доступность_столбца>",
                    "mask": "<SQL-выражение>"
                  },
                  {
                    <Правило_доступа_к_столбцу_2>
                  },
                  ...
                  {
                    <Правило_доступа_к_столбцу_N>
                  }
                ],
                "filter": "<SQL-выражение>",
                "users": [
                  "<список_идентификаторов_пользователей>"
                ],
                "groups": [
                  "<список_идентификаторов_групп>"
                ],
                "description": "<описание_правила>"
              },
              {
                <Блок_правила_2>
              },
              ...
              {
                <Блок_правила_N>
              }
            ]
          }
        }
      }
      ```

      Где:

      * `access_control` — конфигурация прав доступа в рамках кластера.

      * `tables` — список блоков правил для таблиц. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `table`, `columns`, `filter`, `groups`, `users` и `description`.

      * `privileges` — список разрешенных действий над таблицами:
        * `SELECT` — чтение данных.
        * `INSERT` — вставка данных.
        * `DELETE` — удаление данных.
        * `UPDATE` — обновление данных.
        * `OWNERSHIP` — создание и удаление таблицы, изменение состава столбцов, добавление к ней комментариев.
        * `GRANT_SELECT` — создание `VIEW` c чтением данных из таблицы.

        ## Function-ownership {#function-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
        
        {% endnote %}
        
        ## Procedures-privileges {#procedures-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
        
        ## Queries-privileges {#queries-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
        
        {% endnote %}
        
        ## Queries-privileges-REST {#queries-privileges-rest}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
        
        {% endnote %}
        
        ## Tables-privileges {#table-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
        
        {% endnote %}

      * `catalog`, `schema` и `table` — совместно определяют таблицы, к которым будет применяться правило. Каждый из параметров является опциональным.

        * `catalog` — каталоги, задаваемые одним из параметров:
          * `names` — список имен каталогов. Каталоги должны создаваться в этом же вызове [ClusterService/Create](../api-ref/grpc/Cluster/create.md).
          * `name_regexp` — регулярное выражение для имен каталогов.

          Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

        * `schema` — схемы, задаваемые одним из параметров:
          * `names` — список имен схем.
          * `name_regexp` — регулярное выражение для имен схем.

          Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

        * `table` — таблицы, задаваемые одним из параметров:
          * `names` — список имен таблиц.
          * `name_regexp` — регулярное выражение для имен таблиц.

          Если блок `table` не указан, это равносильно регулярному выражению `.*`.

        {% note info %}

        В Managed Service for Trino полное имя таблицы формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_таблицы>`. Правило применяется к таблице, только если ее полное имя соответствует всем заданным параметрам.

        {% endnote %}

      * `columns` — список блоков правил, ограничивающих доступ пользователей к столбцам таблицы. Каждое правило включает в себя обязательные параметры `name` и `access`, а также опциональный параметр `mask`.
        * `name` — имя столбца.
        * `access` — доступность столбца:
          * `ALL` — столбец доступен.
          * `NONE` — столбец недоступен.
        * `mask` — SQL-выражение для маскирования столбца. При чтении пользователь получит результат выражения вместо значения в этом столбце. SQL-выражение должно иметь тип, совпадающий с типом маскируемой колонки. Если параметр `mask` не указан или содержит пустую строку, для этого столбца маскирование не будет использоваться.

        Если для столбца не задано правило, доступ пользователей к нему не ограничен.

      * `filter` — булево SQL-выражение, определяющее доступ пользователей к строкам таблицы. Пользователь получит доступ к строке, только если выражение вернет `TRUE`. Вычисление SQL-выражения происходит от имени пользователя, выполняющего запрос. Если параметр `filter` не указан или содержит пустую строку, пользователям доступны все строки таблицы.

      * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
      
        * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
      
        * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
      
        Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
      
      * `description` — описание правила.

      Доступные параметры кластера и их описания представлены в [инструкции](cluster-create.md#create-cluster).

  4. Воспользуйтесь вызовом [ClusterService/Create](../api-ref/grpc/Cluster/create.md) и выполните запрос, например с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

      ```bash
      grpcurl \
          -format json \
          -import-path ~/cloudapi/ \
          -import-path ~/cloudapi/third_party/googleapis/ \
          -proto ~/cloudapi/yandex/cloud/trino/v1/cluster_service.proto \
          -rpc-header "Authorization: Bearer $IAM_TOKEN" \
          -d @ \
          trino.api.cloud.yandex.net:443 \
          yandex.cloud.trino.v1.ClusterService.Create \
          < body.json
      ```

  5. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/create.md#yandex.cloud.operation.Operation).

{% endlist %}

## Назначить правила для существующего кластера {#set-at-update}

Правила доступа к таблицам можно назначить или обновить в уже существующем кластере Managed Service for Trino.

{% note warning %}
  
Указанные в правилах имена таблиц и схем не проверяются на валидность. Ошибка в имени таблицы или схемы приведет к некорректной работе правила.
  
{% endnote %}

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в нужный каталог.
  1. Перейдите в сервис **Managed Service for&nbsp;Trino**.
  1. Нажмите на имя нужного кластера.
  1. Перейдите в блок **Настройки доступа** → **Таблицы**.
  1. Чтобы добавить правило, нажмите кнопку **Добавить правило** и в открывшемся окне задайте параметры правила:

     1. (Опционально) В поле **Комментарий** введите описание правила.

     1. (Опционально) В поле **Пользователи** выберите пользователей, на которых распространяется правило:
        1. Нажмите кнопку **Добавить**.
        1. В открывшемся списке выберите нужных пользователей. Чтобы найти пользователя, используйте строку поиска над списком.
        1. Чтобы удалить пользователя, выбранного по ошибке, повторно нажмите на него в списке.
        
        Если не выбран ни один пользователь, правило распространяется на всех пользователей.

     1. (Опционально) В поле **Группы** выберите группы пользователей, на которые распространяется правило:
        1. Нажмите кнопку **Добавить**.
        1. В открывшемся списке выберите нужные группы. Чтобы найти группу, используйте строку поиска над списком.
        1. Чтобы удалить группу, выбранную по ошибке, повторно нажмите на нее в списке.
        
        Если не выбрана ни одна группа, правило распространяется на все группы пользователей.

     1. (Опционально) В поле **Привилегии** выберите разрешенные действия над таблицами:
        * `SELECT` — чтение данных.
        * `INSERT` — вставка данных.
        * `DELETE` — удаление данных.
        * `UPDATE` — обновление данных.
        * `OWNERSHIP` — создание и удаление таблицы, изменение состава столбцов, добавление к ней комментариев.
        * `GRANT_SELECT` — создание `VIEW` с чтением данных из таблицы.

        Если не выбрано ни одно разрешенное действие, правило запрещает выполнение любых действий над таблицами.

        {% note info %}

        Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.

        {% endnote %}

     1. (Опционально) В поле **Фильтр** укажите булево SQL-выражение, определяющее доступ пользователей к строкам таблицы.

        Пользователь получит доступ к строке, только если выражение вернет `TRUE`. Вычисление SQL-выражения происходит от имени пользователя, выполняющего запрос. Если параметр `filter` не указан или содержит пустую строку, пользователям доступны все строки таблицы.

     1. (Опционально) Задайте полные имена таблиц, к которым будет применяться правило, в формате `<имя_каталога>.<имя_схемы>.<имя_таблицы>`. Каждая часть имени задается с помощью отдельного поля.

        1. Выберите, в каком формате указать каталоги:
           * **ID** — выберите идентификаторы каталогов. Можно выбрать только те каталоги, которые есть в кластере.
           * **Имя** — выберите имена каталогов. Можно выбрать только те каталоги, которые есть в кластере.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен каталогов.
           * **Не задано** — в поле `<каталог>` может быть любое значение.

        1. Выберите, в каком формате указать схемы:
           * **Имя** — выберите имена схем.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен схем.
           * **Не задано** — в поле `<имя_схемы>` может быть любое значение.

        1. Выберите, в каком формате указать таблицы:
           * **Имя** — выберите имена таблиц.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен таблиц.
           * **Не задано** — в поле `<имя_таблицы>` может быть любое значение.

     1. (Опционально) В поле **Доступ к столбцам** добавьте список правил, ограничивающих доступ пользователей к столбцам таблицы:
        1. Нажмите кнопку **Добавить столбец**.
        1. Укажите имя столбца.
        1. Выберите, доступен ли столбец: `None` — недоступен, `All` — доступен.
        1. Укажите маску.

           {% note info %}

           Маска — это SQL-выражение для маскирования столбца. При чтении пользователь получит результат выражения вместо значения в этом столбце. SQL-выражение должно иметь тип, совпадающий с типом маскируемой колонки. Если маска не указана, для этого столбца маскирование не будет использоваться.

           {% endnote %}

        1. При необходимости добавьте другие правила аналогичным образом.
        1. Чтобы удалить правило, добавленное по ошибке, в строке этого правила нажмите на значок ![trash-bin](../../_assets/console-icons/trash-bin.svg).

        Если для столбца не задано правило, доступ пользователей к нему не ограничен.

  1. При необходимости добавьте другие правила аналогичным образом.
  1. Чтобы отредактировать правило:
     1. В строке этого правила нажмите на значок ![trash-bin](../../_assets/console-icons/pencil.svg).
     1. Измените параметры правила и нажмите кнопку **Обновить**.
  1. Чтобы удалить ненужное правило, в строке этого правила нажмите на значок ![trash-bin](../../_assets/console-icons/trash-bin.svg).
  1. Нажмите кнопку **Сохранить изменения**.

- CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  Чтобы задать правила доступа к таблицам:

  1. Если правила доступа еще не заданы, создайте файл `access_control.yaml` и добавьте в него следующее содержимое:

     ```yaml
     tables:
       # Правило 1
       - privileges: [<список_разрешений>]
         catalog:
           ids:
             any: [<список_идентификаторов_каталогов>]
           names:
             any: [<список_имен_каталогов>]
           name_regexp: <регулярное_выражение>
         schema:
           names:
             any: [<список_имен_схем>]
           name_regexp: <регулярное_выражение>
         table:
           names:
             any: [<список_имен_таблиц>]
           name_regexp: <регулярное_выражение>
         columns:
           # Правило доступа к столбцу 1
           - name: <имя_столбца>
             access: <доступность_столбца>
             mask: <SQL-выражение>
           # Правило доступа к столбцу 2
           - <Параметры_доступа_к_столбцу_2>
           ...
           # Правило доступа к столбцу N
           - <Параметры_доступа_к_столбцу_N>
         filter: <SQL-выражение>           
         groups: [<список_идентификаторов_групп>]
         users: [<список_идентификаторов_пользователей>]
         description: <описание_правила>
       # Правило 2
       - <Параметры_правила_2>
       ...
       # Правило N
       - <Параметры_правила_N>
     ```

     Где:

     * `tables` — список правил для таблиц. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `table`, `columns`, `filter`, `groups`, `users` и `description`.

     * `privileges` — список разрешенных действий над таблицами:
       * `SELECT` — чтение данных.
       * `INSERT` — вставка данных.
       * `DELETE` — удаление данных.
       * `UPDATE` — обновление данных.
       * `OWNERSHIP` — создание и удаление таблицы, изменение состава столбцов, добавление к ней комментариев.
       * `GRANT_SELECT` — создание `VIEW` c чтением данных из таблицы.

       ## Function-ownership {#function-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
       
       {% endnote %}
       
       ## Procedures-privileges {#procedures-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
       
       ## Queries-privileges {#queries-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
       
       {% endnote %}
       
       ## Queries-privileges-REST {#queries-privileges-rest}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
       
       {% endnote %}
       
       ## Tables-privileges {#table-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
       
       {% endnote %}

     * `catalog`, `schema` и `table` — совместно определяют таблицы, к которым будет применяться правило. Каждый из параметров является опциональным.

       * `catalog` — каталоги, задаваемые одним из параметров:
         * `ids` — список идентификаторов каталогов. Указанные каталоги должны существовать.
         * `names` — список имен каталогов. Указанные каталоги должны существовать.
         * `name_regexp` — регулярное выражение для имен каталогов.

         Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

       * `schema` — схемы, задаваемые одним из параметров:
         * `names` — список имен схем.
         * `name_regexp` — регулярное выражение для имен схем.

         Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

       * `table` — таблицы, задаваемые одним из параметров:
         * `names` — список имен таблиц.
         * `name_regexp` — регулярное выражение для имен таблиц.

         Если блок `table` не указан, это равносильно регулярному выражению `.*`.

       {% note info %}

       В Managed Service for Trino полное имя таблицы формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_таблицы>`. Правило применяется к таблице, только если ее полное имя соответствует всем заданным параметрам.

       {% endnote %}

     * `columns` — список правил, ограничивающих доступ пользователей к столбцам таблицы. Каждое правило включает в себя обязательные параметры `name` и `access`, а также опциональный параметр `mask`.
       * `name` — имя столбца.
       * `access` — доступность столбца:
         * `ALL` — столбец доступен.
         * `NONE` — столбец недоступен.
       * `mask` — SQL-выражение для маскирования столбца. При чтении пользователь получит результат выражения вместо значения в этом столбце. SQL-выражение должно иметь тип, совпадающий с типом маскируемой колонки. Если параметр `mask` не указан или содержит пустую строку, для этого столбца маскирование не будет использоваться.

       Если для столбца не задано правило, доступ пользователей к нему не ограничен.

     * `filter` — булево SQL-выражение, определяющее доступ пользователей к строкам таблицы. Пользователь получит доступ к строке, только если выражение вернет `TRUE`. Вычисление SQL-выражения происходит от имени пользователя, выполняющего запрос. Если параметр `filter` не указан или содержит пустую строку, пользователям доступны все строки таблицы.

     * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
     
       * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
     
       * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
     
       Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
     
     * `description` — описание правила.

  2. Если правила доступа уже заданы, откройте файл `access_control.yaml` и внесите в него изменения. Вы можете:

     * добавить новые правила;
     * изменить параметры существующих правил;
     * удалить ненужные правила.

  3. Выполните команду:

     ```bash
     yc managed-trino cluster set-access-control <имя_или_идентификатор_кластера> \
       --from-file access_control.yaml
     ```

     Идентификатор и имя кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).

- Terraform {#tf}

  1. Откройте актуальный конфигурационный файл Terraform с планом инфраструктуры.
  
      Инструкция по созданию файла описана в разделе [Создание кластера](cluster-create.md).
  
  1. Если правила доступа еще не заданы, добавьте ресурс `yandex_trino_access_control`, содержащий список правил `tables`.

     ```hcl
     resource "yandex_trino_cluster" "<имя_кластера>" {
       ...
     }

     resource "yandex_trino_catalog" "<имя_каталога_1>" {
       ...
     }

     resource "yandex_trino_catalog" "<имя_каталога_2>" {
       ...
     }

     ...

     resource "yandex_trino_catalog" "<имя_каталога_N>" {
       ...
     }

     resource "yandex_trino_access_control" "trino_access_control" {
       ...
       cluster_id  = yandex_trino_cluster.<имя_кластера>.id
       tables = [
         # Правило 1
         {
           privileges    = ["<список_разрешений>"]
           catalog       = {
             ids         = [
               yandex_trino_catalog.<имя_каталога_1>.id,
               yandex_trino_catalog.<имя_каталога_2>.id,
               ... 
               yandex_trino_catalog.<имя_каталога_N>.id
             ]
             name_regexp = "<регулярное_выражение>"
           }
           schema        = {
             names       = ["<список_имен_схем>"]
             name_regexp = "<регулярное_выражение>"
           }
           table         = {
             names       = ["<список_имен_таблиц>"]
             name_regexp = "<регулярное_выражение>"
           }
           columns       = [
             # Правило доступа к столбцу 1
             {
               name      = "<имя_столбца>"
               access    = "<доступность_столбца>"
               mask      = "<SQL-выражение>"
             },
             # Правило доступа к столбцу 2
             {
               ...
             },
             ...
             # Правило доступа к столбцу N
             {
               ...
             }                       
           ]
           filter        = "<SQL-выражение>"
           users         = ["<список_идентификаторов_пользователей>"]
           groups        = ["<список_идентификаторов_групп>"]
           description   = "<описание_правила>"
         },
         # Правило 2
         {
           ... 
         },
         ...
         # Правило N
         {
           ... 
         }
       ]
       ...
     }
     ```

     Где:

     * `tables` — список блоков правил для таблиц. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `table`, `columns`, `filter`, `groups`, `users` и `description`.

     * `privileges` — список разрешенных действий над таблицами:
       * `SELECT` — чтение данных.
       * `INSERT` — вставка данных.
       * `DELETE` — удаление данных.
       * `UPDATE` — обновление данных.
       * `OWNERSHIP` — создание и удаление таблицы, изменение состава столбцов, добавление к ней комментариев.
       * `GRANT_SELECT` — создание `VIEW` c чтением данных из таблицы.

       ## Function-ownership {#function-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
       
       {% endnote %}
       
       ## Procedures-privileges {#procedures-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
       
       ## Queries-privileges {#queries-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
       
       {% endnote %}
       
       ## Queries-privileges-REST {#queries-privileges-rest}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
       
       {% endnote %}
       
       ## Tables-privileges {#table-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
       
       {% endnote %}

     * `catalog`, `schema` и `table` — совместно определяют таблицы, к которым будет применяться правило. Каждый из параметров является опциональным.

       * `catalog` — каталоги, задаваемые одним из параметров:
         * `ids` — список идентификаторов каталогов. Указанные каталоги должны существовать или создаваться в том же манифесте.
         * `name_regexp` — регулярное выражение для имен каталогов.

         Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

       * `schema` — схемы, задаваемые одним из параметров:
         * `names` — список имен схем.
         * `name_regexp` — регулярное выражение для имен схем.

         Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

       * `table` — таблицы, задаваемые одним из параметров:
         * `names` — список имен таблиц.
         * `name_regexp` — регулярное выражение для имен таблиц.

         Если блок `table` не указан, это равносильно регулярному выражению `.*`.

       {% note info %}

       В Managed Service for Trino полное имя таблицы формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_таблицы>`. Правило применяется к таблице, только если ее полное имя соответствует всем заданным параметрам.

       {% endnote %}

     * `columns` — список блоков правил, ограничивающих доступ пользователей к столбцам таблицы. Каждое правило включает в себя обязательные параметры `name` и `access`, а также опциональный параметр `mask`.
       * `name` — имя столбца.
       * `access` — доступность столбца:
         * `ALL` — столбец доступен.
         * `NONE` — столбец недоступен.
       * `mask` — SQL-выражение для маскирования столбца. При чтении пользователь получит результат выражения вместо значения в этом столбце. SQL-выражение должно иметь тип, совпадающий с типом маскируемой колонки. Если параметр `mask` не указан или содержит пустую строку, для этого столбца маскирование не будет использоваться.

       Если для столбца не задано правило, доступ пользователей к нему не ограничен.

     * `filter` — булево SQL-выражение, определяющее доступ пользователей к строкам таблицы. Пользователь получит доступ к строке, только если выражение вернет `TRUE`. Вычисление SQL-выражения происходит от имени пользователя, выполняющего запрос. Если параметр `filter` не указан или содержит пустую строку, пользователям доступны все строки таблицы.

     * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
     
       * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
     
       * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
     
       Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
     
     * `description` — описание правила.

  2. Если правила доступа уже заданы, внесите правки в описание ресурса `yandex_trino_access_control`. Вы можете:

     * добавить новые правила;
     * изменить параметры существующих правил;
     * удалить ненужные правила.

  3. Проверьте корректность настроек.
  
      1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
      1. Выполните команду:
      
         ```bash
         terraform validate
         ```
      
         Если в файлах конфигурации есть ошибки, Terraform на них укажет.
  
  4. Подтвердите изменение ресурсов.
  
      1. Выполните команду для просмотра планируемых изменений:
      
         ```bash
         terraform plan
         ```
      
         Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
      
      1. Если вас устраивают планируемые изменения, внесите их:
         1. Выполните команду:
      
            ```bash
            terraform apply
            ```
      
         1. Подтвердите изменение ресурсов.
         1. Дождитесь завершения операции.
 
  Подробнее в [документации провайдера Terraform](../../terraform/resources/trino_access_control.md).

- REST API {#api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  1. Если правила доступа еще не заданы, создайте файл `body.json` и добавьте в него следующее содержимое:

      ```json
      {
        "updateMask": "trino.accessControl.tables",
        "trino": {
          "accessControl": {
            "tables": [
              {
                "privileges": [
                  "<список_разрешений>"
                ],
                "catalog": {
                  "ids": {
                    "any": [
                      "<список_идентификаторов_каталогов>"
                    ]
                  },
                  "names": {
                    "any": [
                      "<имя_каталога_1>",
                      "<имя_каталога_2>",
                      ...
                      "<имя_каталога_N>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "schema": {
                  "names": {
                    "any": [
                      "<список_имен_схем>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "table": {
                  "names": {
                    "any": [
                      "<список_имен_таблиц>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "columns": [
                  {
                    "name": "<имя_столбца>",
                    "access": "<доступность_столбца>",
                    "mask": "<SQL-выражение>"
                  },
                  {
                    <Правило_доступа_к_столбцу_2>
                  },
                  ...
                  {
                    <Правило_доступа_к_столбцу_N>
                  }
                ],
                "filter": "<SQL-выражение>",
                "users": [
                  "<список_идентификаторов_пользователей>"
                ],
                "groups": [
                  "<список_идентификаторов_групп>"
                ],
                "description": "<описание_правила>"
              },
              {
                <Блок_правила_2>
              },
              ...
              {
                <Блок_правила_N>
              }
            ]
          }
        }
      }
      ```

      Где:

      * `updateMask` — перечень изменяемых параметров в строку через запятую.

          {% note warning %}

          При изменении кластера все параметры изменяемого объекта, которые не были явно переданы в запросе, будут переопределены на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `updateMask`.

          {% endnote %}

      * `accessControl` — конфигурация прав доступа в рамках кластера.

      * `tables` — список блоков правил для таблиц. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `table`, `columns`, `filter`, `groups`, `users` и `description`.

      * `privileges` — список разрешенных действий над таблицами:
        * `SELECT` — чтение данных.
        * `INSERT` — вставка данных.
        * `DELETE` — удаление данных.
        * `UPDATE` — обновление данных.
        * `OWNERSHIP` — создание и удаление таблицы, изменение состава столбцов, добавление к ней комментариев.
        * `GRANT_SELECT` — создание `VIEW` с чтением данных из таблицы.

        ## Function-ownership {#function-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
        
        {% endnote %}
        
        ## Procedures-privileges {#procedures-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
        
        ## Queries-privileges {#queries-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
        
        {% endnote %}
        
        ## Queries-privileges-REST {#queries-privileges-rest}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
        
        {% endnote %}
        
        ## Tables-privileges {#table-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
        
        {% endnote %}

      * `catalog`, `schema` и `table` — совместно определяют таблицы, к которым будет применяться правило. Каждый из параметров является опциональным.

        * `catalog` — каталоги, задаваемые одним из параметров:
          * `ids` — список идентификаторов каталогов. Указанные каталоги должны существовать.
          * `names` — список имен каталогов. Указанные каталоги должны существовать.
          * `nameRegexp` — регулярное выражение для имен каталогов.

          Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

        * `schema` — схемы, задаваемые одним из параметров:
          * `names` — список имен схем.
          * `nameRegexp` — регулярное выражение для имен схем.

          Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

        * `table` — таблицы, задаваемые одним из параметров:
          * `names` — список имен таблиц.
          * `nameRegexp` — регулярное выражение для имен таблиц.

          Если блок `table` не указан, это равносильно регулярному выражению `.*`.

        {% note info %}

        В Managed Service for Trino полное имя таблицы формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_таблицы>`. Правило применяется к таблице, только если ее полное имя соответствует всем заданным параметрам.

        {% endnote %}

      * `columns` — список блоков правил, ограничивающих доступ пользователей к столбцам таблицы. Каждое правило включает в себя обязательные параметры `name` и `access`, а также опциональный параметр `mask`.
        * `name` — имя столбца.
        * `access` — доступность столбца:
          * `ALL` — столбец доступен.
          * `NONE` — столбец недоступен.
        * `mask` — SQL-выражение для маскирования столбца. При чтении пользователь получит результат выражения вместо значения в этом столбце. SQL-выражение должно иметь тип, совпадающий с типом маскируемой колонки. Если параметр `mask` не указан или содержит пустую строку, для этого столбца маскирование не будет использоваться.

        Если для столбца не задано правило, доступ пользователей к нему не ограничен.

      * `filter` — булево SQL-выражение, определяющее доступ пользователей к строкам таблицы. Пользователь получит доступ к строке, только если выражение вернет `TRUE`. Вычисление SQL-выражения происходит от имени пользователя, выполняющего запрос. Если параметр `filter` не указан или содержит пустую строку, пользователям доступны все строки таблицы.

      * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
      
        * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
      
        * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
      
        Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
      
      * `description` — описание правила.

  1. Если правила уже заданы, откройте существующий файл `body.json` с правилами и внесите в него правки. Вы можете:

     * добавить новые правила;
     * изменить параметры существующих правил;
     * удалить ненужные правила.

  1. Воспользуйтесь методом [Cluster.Update](../api-ref/Cluster/update.md) и выполните запрос, например с помощью [cURL](https://curl.se/):

      ```bash
      curl \
        --request PATCH \
        --header "Authorization: Bearer $IAM_TOKEN" \
        --url 'https://trino.api.cloud.yandex.net/managed-trino/v1/clusters/<идентификатор_кластера>'
        --data '@body.json'
      ```

      Идентификатор кластера можно получить со [списком кластеров](cluster-list.md#list-clusters) в каталоге.

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/update.md#yandex.cloud.operation.Operation).

- gRPC API {#grpc-api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  1. Клонируйте репозиторий [cloudapi](https://github.com/yandex-cloud/cloudapi):
     
     ```bash
     cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapi
     ```
     
     Далее предполагается, что содержимое репозитория находится в директории `~/cloudapi/`.

  1. Если правила доступа еще не заданы, создайте файл `body.json` и добавьте в него следующее содержимое:

      ```json
      {
        "cluster_id": "<идентификатор_кластера>",
        "update_mask": {
          "paths": [
            "trino.access_control.tables"
          ]
        },
        "trino": {
          "access_control": {
            "tables": [
              {
                "privileges": [
                  "<список_разрешений>"
                ],
                "catalog": {
                  "ids": {
                    "any": [
                      "<список_идентификаторов_каталогов>"
                    ]
                  },
                  "names": {
                    "any": [
                      "<имя_каталога_1>",
                      "<имя_каталога_2>",
                      ...
                      "<имя_каталога_N>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "schema": {
                  "names": {
                    "any": [
                      "<список_имен_схем>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "table": {
                  "names": {
                    "any": [
                      "<список_имен_таблиц>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "columns": [
                  {
                    "name": "<имя_столбца>",
                    "access": "<доступность_столбца>",
                    "mask": "<SQL-выражение>"
                  },
                  {
                    <Правило_доступа_к_столбцу_2>
                  },
                  ...
                  {
                    <Правило_доступа_к_столбцу_N>
                  }
                ],
                "filter": "<SQL-выражение>",
                "users": [
                  "<список_идентификаторов_пользователей>"
                ],
                "groups": [
                  "<список_идентификаторов_групп>"
                ],
                "description": "<описание_правила>"
              },
              {
                <Блок_правила_2>
              },
              ...
              {
                <Блок_правила_N>
              }
            ]
          }
        }
      }
      ```

      Где:

      * `cluster_id` — идентификатор кластера.
          
          Идентификатор кластера можно получить со [списком кластеров](cluster-list.md#list-clusters) в каталоге.

      * `update_mask` — перечень изменяемых параметров в виде массива строк `paths[]`.

          {% cut "Формат перечисления настроек" %}

          ```yaml
          "update_mask": {
            "paths": [
              "<настройка_1>",
              "<настройка_2>",
              ...
              "<настройка_N>"
            ]
          }
          ```

          {% endcut %}

          {% note warning %}

          При изменении кластера все параметры изменяемого объекта, которые не были явно переданы в запросе, будут переопределены на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `update_mask`.

          {% endnote %}

      * `access_control` — конфигурация прав доступа в рамках кластера.

      * `tables` — список блоков правил для таблиц. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `table`, `columns`, `filter`, `groups`, `users` и `description`.

      * `privileges` — список разрешенных действий над таблицами:
        * `SELECT` — чтение данных.
        * `INSERT` — вставка данных.
        * `DELETE` — удаление данных.
        * `UPDATE` — обновление данных.
        * `OWNERSHIP` — создание и удаление таблицы, изменение состава столбцов, добавление к ней комментариев.
        * `GRANT_SELECT` — создание `VIEW` c чтением данных из таблицы.

        ## Function-ownership {#function-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
        
        {% endnote %}
        
        ## Procedures-privileges {#procedures-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
        
        ## Queries-privileges {#queries-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
        
        {% endnote %}
        
        ## Queries-privileges-REST {#queries-privileges-rest}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
        
        {% endnote %}
        
        ## Tables-privileges {#table-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
        
        {% endnote %}

      * `catalog`, `schema` и `table` — совместно определяют таблицы, к которым будет применяться правило. Каждый из параметров является опциональным.

        * `catalog` — каталоги, задаваемые одним из параметров:
          * `ids` — список идентификаторов каталогов. Указанные каталоги должны существовать.
          * `names` — список имен каталогов. Указанные каталоги должны существовать.
          * `name_regexp` — регулярное выражение для имен каталогов.

          Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

        * `schema` — схемы, задаваемые одним из параметров:
          * `names` — список имен схем.
          * `name_regexp` — регулярное выражение для имен схем.

          Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

        * `table` — таблицы, задаваемые одним из параметров:
          * `names` — список имен таблиц.
          * `name_regexp` — регулярное выражение для имен таблиц.

          Если блок `table` не указан, это равносильно регулярному выражению `.*`.

        {% note info %}

        В Managed Service for Trino полное имя таблицы формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_таблицы>`. Правило применяется к таблице, только если ее полное имя соответствует всем заданным параметрам.

        {% endnote %}

      * `columns` — список блоков правил, ограничивающих доступ пользователей к столбцам таблицы. Каждое правило включает в себя обязательные параметры `name` и `access`, а также опциональный параметр `mask`.
        * `name` — имя столбца.
        * `access` — доступность столбца:
          * `ALL` — столбец доступен.
          * `NONE` — столбец недоступен.
        * `mask` — SQL-выражение для маскирования столбца. При чтении пользователь получит результат выражения вместо значения в этом столбце. SQL-выражение должно иметь тип, совпадающий с типом маскируемой колонки. Если параметр `mask` не указан или содержит пустую строку, для этого столбца маскирование не будет использоваться.

        Если для столбца не задано правило, доступ пользователей к нему не ограничен.

      * `filter` — булево SQL-выражение, определяющее доступ пользователей к строкам таблицы. Пользователь получит доступ к строке, только если выражение вернет `TRUE`. Вычисление SQL-выражения происходит от имени пользователя, выполняющего запрос. Если параметр `filter` не указан или содержит пустую строку, пользователям доступны все строки таблицы.

      * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
      
        * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
      
        * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
      
        Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
      
      * `description` — описание правила.

  2. Если правила уже заданы, откройте существующий файл `body.json` с правилами и внесите в него правки. Вы можете:

     * добавить новые правила;
     * изменить параметры существующих правил;
     * удалить ненужные правила.

  3. Воспользуйтесь вызовом [ClusterService.Update](../api-ref/grpc/Cluster/update.md) и выполните запрос, например с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

      ```bash
      grpcurl \
        -format json \
        -import-path ~/cloudapi/ \
        -import-path ~/cloudapi/third_party/googleapis/ \
        -proto ~/cloudapi/yandex/cloud/trino/v1/cluster_service.proto \
        -rpc-header "Authorization: Bearer $IAM_TOKEN" \
        -d @ \
        trino.api.cloud.yandex.net:443 \
        yandex.cloud.trino.v1.ClusterService.Update \
        < body.json
      ```

  4. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/update.md#yandex.cloud.operation.Operation).

{% endlist %}

## Пример назначения правил доступа к таблицам {#example}

Допустим, вам нужно настроить правила доступа к таблицам в кластере Trino:
1. Запретить любые действия над таблицами пользователю с идентификатором `banned_user_id`.
1. Разрешить пользователям из группы с идентификатором `admins_group_id` выполнять любые действия над таблицами.
1. Разрешить всем пользователям чтение данных из таблиц с именами `sales` и `orders`, причем:
   * Строка таблицы будет доступна, только если значение в столбце `manager_id` равно идентификатору текущего пользователя.
   * Значение в столбце `client_phone`, кроме четырех последних цифр, будет замаскировано символами `***`.
1. Запретить любые действия над таблицами всем остальным пользователям.

{% list tabs group=instructions %}

- CLI {#cli}

  Файл `access_control.yaml` для такого набора правил выглядит так:

  ```yaml
  tables:
    - users:
        - banned_user_id

    - groups:
        - admins_group_id
      privileges:
        - SELECT
        - INSERT
        - DELETE
        - UPDATE
        - OWNERSHIP
        - GRANT_SELECT

    - table:
        names:
          any:
            - sales
            - orders
      columns:
        - name: client_phone
          access: ALL
          mask: "'***' || substring(client_phone, -4)"
      filter: "manager_id = current_user"
      privileges:
        - SELECT
  ```

- Terraform {#tf}

  Конфигурационный файл для такого набора правил выглядит так:

  ```hcl
  resource "yandex_trino_access_control" "trino_access_control" {
    ...
    cluster_id  = <идентификатор_кластера>
    tables = [
      {
        users         = ["banned_user_id"]
      },
      {
        groups        = ["admins_group_id"]
        privileges    = ["SELECT", "INSERT", "DELETE", "UPDATE", "OWNERSHIP", "GRANT_SELECT"]
      },
      {
        table         = {
          names       = ["sales", "orders"]
        }
        columns       = [
          {
            name      = "client_phone"
            access    = "ALL"
            mask      = "'***' || substring(client_phone, -4)"
          }
        ]
        filter        = "manager_id = current_user"
        privileges    = ["SELECT"]
      }
    ]
    ...
  }
  ```

- REST API {#api}

  Файл `body.json` для такого набора правил выглядит так:

  ```json
  {
    "updateMask": "trino.accessControl.tables",
    "trino": {
      "accessControl": {
        "tables": [
          {
            "users": [
              "banned_user_id"
            ]
          },
          {
            "groups": [
              "admins_group_id"
            ],
            "privileges": [
              "SELECT",
              "INSERT",
              "DELETE",
              "UPDATE",
              "OWNERSHIP",
              "GRANT_SELECT"
            ]
          },
          {
            "table": {
              "names": {
                "any": [
                  "orders",
                  "sales"
                ]
              }
            },
            "columns": [
              {
                "name": "client_phone",
                "access": "ALL",
                "mask": "'***' || substring(client_phone, -4)"
              }
            ],            
            "filter": "manager_id = current_user",
            "privileges": [
              "SELECT"
            ]
          }
        ]
      }
    }
  }
  ```

- gRPC API {#grpc-api}

  Файл `body.json` для такого набора правил выглядит так:

  ```json
  {
    "cluster_id": "<идентификатор_кластера>",
    "update_mask": {
      "paths": [
        "trino.access_control.tables"
      ]
    },
    "trino": {
      "access_control": {
        "tables": [
          {
            "users": [
              "banned_user_id"
            ]
          },
          {
            "groups": [
              "admins_group_id"
            ],
            "privileges": [
              "SELECT",
              "INSERT",
              "DELETE",
              "UPDATE",
              "OWNERSHIP",
              "GRANT_SELECT"
            ]
          },
          {
            "table": {
              "names": {
                "any": [
                  "orders",
                  "sales"
                ]
              }
            },
            "columns": [
              {
                "name": "client_phone",
                "access": "ALL",
                "mask": "'***' || substring(client_phone, -4)"
              }
            ],            
            "filter": "manager_id = current_user",
            "privileges": [
              "SELECT"
            ]
          }
        ]
      }
    }
  }
  ```

{% endlist %}