DM_EXEC_SESSIONS не возвращает активные соединения

Я использую SYS.DM_EXEC_SESSIONS получить все активные соединения с SQL Server из моей системы. Я знаю, что если зарегистрированный пользователь не имеет разрешения VIEW SERVER STATE, отображается только зарегистрированный пользователь, в противном случае - все пользователи.

Но я не хочу давать всем основным пользователям разрешение VIEW SERVER STATE (для безопасности), но мне нужно получить всех пользователей. Поэтому я сделал следующую функцию WITH EXECUTE в качестве опции:

ALTER FUNCTION dbo.allusers(@DUMMY CHAR(5))
RETURNS  @rtnTable TABLE
(
LOGINAIKA datetime,
TYOASEMA nchar(128),
LOGINNIMI varchar(50),
OHJELMA varchar(50), 
WKAYTTAJA nchar(128)
)
WITH EXECUTE AS 'poweruser'

as
BEGIN
--print USER_NAME()
INSERT @rtnTable

SELECT LOGIN_TIME AS LOGINAIKA,CAST(host_name AS nchar(128)) AS TYOASEMA,
LOGIN_NAME AS LOGINNIMI, PROGRAM_NAME AS OHJELMA,
NT_DOMAIN+'\'+CAST(nt_user_name AS nchar(128)) AS WKAYTTAJA FROM   SYS.DM_EXEC_SESSIONS
WHERE PROGRAM_NAME LIKE 'J%'
and DB_NAME(database_id)=DB_NAME()
order by PROGRAM_NAME, LOGIN_NAME 
RETURN
END

Poweruser имеет разрешение VIEW SERVER STATE, но функция возвращает пустой набор результатов, почему?

Есть ли способ получить все соединения для обычного пользователя?

1 ответ

Я смог заставить это работать, установив достоверное свойство базы данных, в которой создается функция. NB: я не рекомендую это как лучшую практику, поскольку это открывает довольно большую дыру в безопасности.

Кроме того, вы можете выполнить упражнение по созданию входа на основе сертификата и использовать подпись модуля.

Другие вопросы по тегам