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.