Как узнать имя пользователя и имя компьютера для доступа к SQL-серверу - PullRequest
10 голосов
/ 13 марта 2009

В моей рабочей компании есть сервер MSSQL 2005. У меня два вопроса о том, как узнать текущего пользователя журнала и как можно отправить предупреждающее сообщение:

Первый вопрос: есть ли какой-либо T-SQL или SP, чтобы узнать текущее имя пользователя для входа в систему и имя машины. Если пользователь использует имя сервера SQL для удаленного доступа к серверу SQL, есть ли способ узнать имя окна этого пользователя (имя для входа в Windows)?

Мой следующий вопрос заключается в том, что если я могу получить имя пользователя или идентификатор, есть ли способ отправить предупреждающее сообщение, например: «В настоящее время сервер SQL очищается или выполняется резервное копирование, пожалуйста, не входите в систему в это время». Я думаю, это может быть сложно. Возможно, мне придется отправить электронное письмо пользователю.

Сервер SQL доступен только в компании. Сервер SQL имеет список пользователей в качестве пользователей для входа в систему: пользователи Windows, пользователи SQL и sa.

Ответы [ 3 ]

33 голосов
/ 13 марта 2009
SELECT SUSER_SNAME(), HOST_NAME()

Если соединение «sa» (или любой другой логин SQL), вы не можете найти имя пользователя домена / windows. SQL Server знает только, что это «sa» или тот логин SQL.

HOST_NAME также может быть ненадежным, его можно установить в строке подключения («Имя приложения»). Или это может быть расплывчатым, например, «Microsoft Office» для по умолчанию для Access, Excel и т. Д.

Вы можете вернуться через client_net_address в sys.dm_exec_connections, сопоставить MAC-адрес с IP и узнать, кто вошел в систему ...

4 голосов
/ 13 марта 2009

Простой способ узнать как хост, так и пользователя -

EXEC sp_who2;

где вы получаете некоторую другую информацию, которую полезно знать, как будто пользователь активен и так далее ... Это не решает проблемы, которые объявил gbn.

3 голосов
/ 13 марта 2009

Спасибо за все ваши предложения в первую очередь. Я перепробовал все методы, и я думаю, что метод Йоаким Бэкман отвечает моим потребностям. Вот краткое изложение того, что я узнаю.

  • Запрос к sys.syslogins только перечисляет информацию для входа. Accdate не дает текущую метку времени входа пользователя. Я попытался войти из другого приложения в мой SQL, и в этом запросе не указан логин.
  • ВЫБРАТЬ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...