Spec-Zone.ru › MySQL 8.4

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-8.4-en/query-attributes.html

Spec-Zone.ru

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