Spec-Zone.ru › MySQL 9.2

11.6 Атрибуты запроса

Наиболее видимая часть оператора SQL — это текст самого оператора. Клиенты также могут определять атрибуты запроса, которые применяются к следующему оператору, отправляемому на сервер для выполнения:

  • Атрибуты определяются до отправки оператора.

  • Атрибуты существуют до тех пор, пока не завершится выполнение оператора, после чего набор атрибутов очищается.

  • Пока атрибуты существуют, к ним можно получить доступ со стороны сервера.

Примеры использования атрибутов запроса:

  • Веб-приложение создает страницы, которые генерируют запросы к базе данных, и для каждого запроса необходимо отслеживать URL страницы, которая его сгенерировала.

  • Приложение передает дополнительную информацию об обработке с каждым запросом для использования плагином, таким как плагин аудита или плагин переписывания запросов.

MySQL поддерживает эти возможности без использования обходных путей, таких как специально отформатированные комментарии, включенные в строки запросов. Остальная часть этого раздела описывает, как использовать поддержку атрибутов запроса, включая необходимые предварительные условия.

  • Определение и доступ к атрибутам запроса

  • Предварительные условия для использования атрибутов запроса

  • Загружаемые функции атрибутов запроса

Определение и доступ к атрибутам запроса

Приложения, использующие MySQL C API, определяют атрибуты запроса, вызывая функцию . См. . Другие MySQL-коннекторы также могут поддерживать атрибуты запросов. См. документацию по отдельным коннекторам.

Клиент mysql имеет команду query_attributes, которая позволяет определить до 32 пар имён и значений атрибутов. См. Раздел 6.5.1.2, «Команды клиента mysql».

Имена атрибутов запроса передаются с использованием кодировки символов, указанной переменной системы character_set_client.

Для доступа к атрибутам запроса в операторах SQL, для которых были определены атрибуты, установите компонент query_attributes, как описано в Предварительные условия для использования атрибутов запроса. Компонент реализует загружаемую функцию mysql_query_attribute_string(), которая принимает имя атрибута в качестве аргумента и возвращает значение атрибута в виде строки или NULL, если атрибут не существует. См. Загружаемые функции атрибутов запроса.

В следующих примерах используется клиент mysql query_attributes для определения пар имя/значение атрибута и функция mysql_query_attribute_string() для доступа к значениям атрибутов по имени.

В этом примере определяются два атрибута с именами n1 и n2. Первый SELECT демонстрирует, как извлечь эти атрибуты, а также демонстрирует, что при получении несуществующего атрибута (n3) возвращается NULL. Второй SELECT показывает, что атрибуты не сохраняются между операторами.

mysql> query_attributes n1 v1 n2 v2;
mysql> SELECT
         mysql_query_attribute_string('n1') AS 'attr 1',
         mysql_query_attribute_string('n2') AS 'attr 2',
         mysql_query_attribute_string('n3') AS 'attr 3';
+--------+--------+--------+
| attr 1 | attr 2 | attr 3 |
+--------+--------+--------+
| v1     | v2     | NULL   |
+--------+--------+--------+

mysql> SELECT
         mysql_query_attribute_string('n1') AS 'attr 1',
         mysql_query_attribute_string('n2') AS 'attr 2';
+--------+--------+
| attr 1 | attr 2 |
+--------+--------+
| NULL   | NULL   |
+--------+--------+

Как показано во втором SELECT операторе, атрибуты, определенные перед заданным оператором, доступны только для этого оператора и очищаются после его выполнения. Чтобы использовать значение атрибута в нескольких операторах, присвойте его переменной. Следующий пример демонстрирует, как это сделать, и иллюстрирует, что значения атрибутов доступны в последующих операторах с помощью переменных, но не путем вызова mysql_query_attribute_string():

mysql> query_attributes n1 v1 n2 v2;
mysql> SET
         @attr1 = mysql_query_attribute_string('n1'),
         @attr2 = mysql_query_attribute_string('n2');

mysql> SELECT
         @attr1, mysql_query_attribute_string('n1') AS 'attr 1',
         @attr2, mysql_query_attribute_string('n2') AS 'attr 2';
+--------+--------+--------+--------+
| @attr1 | attr 1 | @attr2 | attr 2 |
+--------+--------+--------+--------+
| v1     | NULL   | v2     | NULL   |
+--------+--------+--------+--------+

Атрибуты также можно сохранить для последующего использования, сохранив их в таблице:

mysql> CREATE TABLE t1 (c1 CHAR(20), c2 CHAR(20));

mysql> query_attributes n1 v1 n2 v2;
mysql> INSERT INTO t1 (c1, c2) VALUES(
         mysql_query_attribute_string('n1'),
         mysql_query_attribute_string('n2')
       );

mysql> SELECT * FROM t1;
+------+------+
| c1   | c2   |
+------+------+
| v1   | v2   |
+------+------+

Атрибуты запроса подчиняются следующим ограничениям:

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

  • Если несколько атрибутов определены с одинаковым именем, попытки извлечь значение атрибута имеют неопределённый результат.

  • Атрибут, определенный с пустым именем, не может быть получен по имени.

  • Атрибуты недоступны для операторов, подготовленных с помощью PREPARE.

  • Функция mysql_query_attribute_string() не может использоваться в операторах DDL.

  • Атрибуты не реплицируются. Операторы, вызывающие функцию mysql_query_attribute_string(), не получат одинаковое значение на всех серверах.

Предварительные условия для использования атрибутов запроса

Для доступа к атрибутам запроса в операторах SQL, для которых были определены атрибуты, необходимо установить компонент query_attributes. Сделайте это с помощью следующего оператора:

INSTALL COMPONENT "file://component_query_attributes";

Установка компонента — однократная операция, которую не нужно выполнять при каждом запуске сервера. INSTALL COMPONENT загружает компонент и также регистрирует его в таблице системы mysql.component, чтобы он загружался при последующих запусках сервера.

Компонент query_attributes получает доступ к атрибутам запроса для реализации функции mysql_query_attribute_string(). См. Раздел 7.5.4, «Компоненты атрибутов запроса».

Для удаления компонента query_attributes используйте этот оператор:

UNINSTALL COMPONENT "file://component_query_attributes";

UNINSTALL COMPONENT разгружает компонент и удаляет его из таблицы системы mysql.component, чтобы он не загружался при последующих запусках сервера.

Поскольку установка и удаление компонента query_attributes устанавливает и удаляет функцию mysql_query_attribute_string(), которую он реализует, не нужно использовать CREATE FUNCTION или DROP FUNCTION для этого.

Загружаемые функции атрибутов запроса

  • mysql_query_attribute_string(name)

    Приложения могут определять атрибуты, которые применяются к следующему запросу, отправленному на сервер. Функция mysql_query_attribute_string() возвращает значение атрибута в виде строки, заданного имени атрибута. Эта функция позволяет запросу получать доступ к значениям атрибутов, которые к нему применяются, и включать их в себя.

    mysql_query_attribute_string() устанавливается при установке компонента query_attributes. См. Раздел 11.6, «Атрибуты запроса», в котором также рассматривается назначение и использование атрибутов запроса.

    Аргументы:

    • name: Имя атрибута.

    Возвращаемое значение:

    Возвращает значение атрибута в виде строки при успехе или NULL, если атрибут не существует.

    Пример:

    В следующем примере используется клиент mysql query_attributes для определения атрибутов запроса, которые можно получить с помощью mysql_query_attribute_string(). SELECT показывает, что при получении несуществующего атрибута (n3) возвращается NULL.

    mysql> query_attributes n1 v1 n2 v2;
    mysql> SELECT
        ->   mysql_query_attribute_string('n1') AS 'attr 1',
        ->   mysql_query_attribute_string('n2') AS 'attr 2',
        ->   mysql_query_attribute_string('n3') AS 'attr 3';
    +--------+--------+--------+
    | attr 1 | attr 2 | attr 3 |
    +--------+--------+--------+
    | v1     | v2     | NULL   |
    +--------+--------+--------+
    

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/query-attributes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API