Как узнать имя пользователя и имя компьютера для доступа к 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