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: я не рекомендую это как лучшую практику, поскольку это открывает довольно большую дыру в безопасности.
Кроме того, вы можете выполнить упражнение по созданию входа на основе сертификата и использовать подпись модуля.