Определение текущего пользователя MySQL

Задача
Каково имя пользователя клиентского приложения, и с какого хоста установлено соединение?

Решение
Используйте функцию USER().

Обсуждение
Предложение SELECT USER() возвращает строку вида user@host, указывающую имя текущего пользователя (user) и хост (host), с которого произведено соединение. Чтобы выбрать только составляющую имени или хоста, выполните такие запросы:

SELECT SUBSTRING_INDEX(USER(),'@',1);
SELECT SUBSTRING_INDEX(USER(),'@',-1);

Эту информацию можно применять по-разному. Например, чтобы приложение на Perl приветствовало пользователя, сделайте нечто подобное:

my ($user, $host) = $dbh->selectrow_array (q{
SELECT SUBSTRING_INDEX(USER(),'@',1),
SUBSTRING_INDEX(USER(),'@',-1)
});
print "Hello, $user! Good to see you.\n";
print "I see you're connecting from $host.\n" unless $host eq "";

Можно получить составляющие, извлекая значение USER() целиком, а затем разбивая его на части при помощи операции сравнения с образцом:

my ($user, $host) = ($dbh->selectrow_array (
"SELECT USER()") =~ /([^@]+)@?(.*)/);

Или использовать split:

my ($user, $host) = split (/@/, $dbh->selectrow_array ("SELECT USER()"));

Значения, возвращаемые функцией USER(), можно использовать для ведения журнала пользователей приложения.


Простая таблица журнала может выглядеть так (значения 16 и 60 соответствуют длинам столбцов user и host в таблицах привилегий (grant table) MySQL):

CREATE TABLE app_log
(
t TIMESTAMP,
user CHAR(16),
host CHAR(60)
);

Чтобы вставить новые записи в таблицу app_log, используйте приведенное ниже предложение. Столбец TIMESTAMP автоматически устанавливается в текущую дату и время, так что нет необходимости вводить значения для него:

INSERT INTO app_log
SET user = SUBSTRING_INDEX(USER(),'@',1),
host = SUBSTRING_INDEX(USER(),'@',-1);

Таблица хранит значения user и host отдельно, так как суммирующие запросы к этим значениям эффективнее, если не приходится разбивать их на части. Например, если вы периодически проверяете, со скольких различныххостов устанавливаются соединения с сервером, удобнее один раз разделить значение USER() при создании записи, чем проделывать эту операцию при запуске каждого предложения SELECT для формирования итогов. Кроме того, если хранить значения хостов отдельно, можно индексировать столбец host, что невозможно при хранении составных значений user@host.

Оцените статью: (0 голосов)
0 5 0

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