Xp_readerrorlogではなく、GUIからSQL Serverログをユーザーに表示したいと思います。私はこれが可能かどうか疑問に思っていましたか?
ありがとうございました。
はい、これは 'securityadmin
'サーバーロールを持つユーザーを作成し、必要に応じてDeny
LOGON Triggerを介してSQL Serverクエリウィンドウにアクセスすることで可能です。
USE [master]
GO
----Create Login
CREATE LOGIN [DBA_ErrorLogUser]
WITH PASSWORD=N'123', DEFAULT_DATABASE=[master],
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
--- Add server Add securityadmin
-- To view SQL Server error logs user must be a part of securityadmin server role
EXEC master..sp_addsrvrolemember
@loginame = N'DBA_ErrorLogUser', @rolename = N'securityadmin'
GO
--- Mapp user with login to grant access to logs
CREATE USER [DBA_ErrorLogUser] FOR LOGIN [DBA_ErrorLogUser]
GO
--- Deny Alter to any Login
DENY ALTER ANY LOGIN TO DBA_ErrorLogUser
GO
--- Grant permission to view Sql Server Logs
Grant EXECUTE ON master.sys.xp_readerrorlog TO DBA_ErrorLogUser
GO
--- Create a log on Trigger to deny access to Query Window
IF EXISTS ( SELECT *
FROM master.sys.server_triggers
WHERE parent_class_desc = 'SERVER'
AND name = N'Deny_QueryWindowLogin_Trigger' )
DROP TRIGGER [Deny_QueryWindowLogin_Trigger] ON ALL SERVER
GO
Create TRIGGER Deny_QueryWindowLogin_Trigger ON ALL SERVER
WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
DECLARE @data XML
SET @data = EVENTDATA()
DECLARE @AppName SYSNAME,
@LoginName SYSNAME
SELECT @AppName = [program_name]
FROM sys.dm_exec_sessions
WHERE session_id = @data.value('(/EVENT_INSTANCE/SPID)[1]', 'int')
SELECT @LoginName = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname')
IF @AppName= 'Microsoft SQL Server Management Studio - Query' AND @LoginName = 'DBA_ErrorLogUser'
BEGIN
ROLLBACK ; --Disconnect the session
END
END ;
注:securityadminサーバーロールの権限を読み取る必要があります
この解決策に注意してください。下部の使い捨ての1ライナーに注意する必要があります。誰かに「securityadmin」固定サーバーロールのメンバーシップを付与すると、SQLインスタンスに対して非常に強力になります。