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.