Как узнать имя пользователя и имя компьютера для доступа к SQL-серверу
У моей рабочей компании есть сервер MSSQL 2005. У меня есть два вопроса об обнаружении текущего пользователя журнала и любой способ отправить предупреждающее сообщение:
Первый вопрос: есть ли T-SQL или SP для поиска текущего имени пользователя и имени машины. Если пользователь использует имя SQL-сервера для удаленного доступа к SQL-серверу, есть ли способ узнать это имя окна пользователя (имя для входа в окна)?
Мой следующий вопрос заключается в том, что если я могу получить имя пользователя или идентификатор, есть ли способ отправить предупреждение, например, "в настоящее время SQL-сервер очищается или резервное копирование, пожалуйста, не входите в систему в настоящее время". Наверное, это может быть сложно. Возможно, мне придется отправить электронное письмо пользователю.
Сервер SQL доступен только в компании. SQL-сервер имеет список пользователей в качестве пользователей входа: пользователи Windows, пользователи SQL и sa.
Ответы
Ответ 1
SELECT SUSER_SNAME(), HOST_NAME()
Если соединение "sa" (или любой другой логин SQL), вы не можете найти имя пользователя домена/окна. SQL Server знает, что это "sa" или это логин SQL.
HOST_NAME также может быть ненадежным, его можно установить в строке подключения ( "Имя приложения" ). Или это может быть неопределенным, например, "Microsoft Office" по умолчанию для Access, Excel и т.д.
Вы можете вернуться через client_net_address
в sys.dm_exec_connections
и сопоставить MAC-адрес с IP-адресом и узнать, кто вошел в систему...
Ответ 2
Легкий способ узнать как хоста, так и пользователя -
EXEC sp_who2;
где вы получите другую информацию, которая может быть полезной, как если бы пользователь был активным и так далее...
Он не разрешает проблемы, объявленные gbn.
Ответ 3
Спасибо за все ваши предложения. Я пробовал все методы, и я думаю, что метод Joakim Backman удовлетворяет мою потребность. Вот краткое изложение того, что я узнаю.
- Запрос sys.syslogins содержит только информацию для входа в систему. Аккаунт не указывает текущую временную метку пользователя. Я попытался войти в систему из другого приложения в свой SQL, и этот запрос не отображает логин.
- SELECT SUSER_SNAME(), HOST_NAME() отображает только одного пользователя на SQL-сервере. Например, я вхожу в систему как мое имя для SQL-сервера. Результат этого запроса содержит только мое имя и имя машины. Этот запрос не отображает текущих пользователей на сервере SQL.
- exec sp_who2 перечисляет информацию, которая мне нужна. В нем перечислены имя пользователя текущего имени пользователя, активный статус, доступ к имени пользователя db и используемая команда.
Чтобы получить информацию, которую я использую в SP, я должен фильтровать и присоединять информацию к другим таблицам, таким как электронные письма. Вот коды, которые я использую:
DECLARE @retTable TABLE (
SPID int not null
, Status varchar (255) not null
, Login varchar (255) not null
, HostName varchar (255) not null
, BlkBy varchar(10) not null
, DBName varchar (255) null
, Command varchar (255) not null
, CPUTime int not null
, DiskIO int not null
, LastBatch varchar (255) not null
, ProgramName varchar (255) null
, SPID2 int not null
, REQUESTID INT
)
INSERT INTO @retTable EXEC sp_who2
SELECT Status, Login, HostName, DBName, Command, CPUTime, ProgramName -- *
FROM @retTable
--WHERE Login not like 'sa%' -- if not interested in sa
ORDER BY Login, HostName