我正在 SQL Server 上使用触发器。删除一些登录触发器后,仅允许某些用户从特定 IP 登录。没能发挥作用。
实际上我使用登录触发器进行了一些审核。
当我尝试从 grafana(是上面提到的用户之一)登录时,我收到一条消息,表明由于活动触发器而无法登录。
这是触发器:
ALTER TRIGGER [LogonAuditTrigger] /* Creates trigger for logons */
ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @LogonTriggerData xml,
@EventTime datetime,
@LoginName varchar(50),
@ClientHost varchar(50),
@LoginType varchar(50),
@HostName varchar(50),
@AppName varchar(500)
SET @LogonTriggerData = eventdata()
SET @EventTime = @LogonTriggerData.value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime')
SET @LoginName = @LogonTriggerData.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(50)')
SET @ClientHost = @LogonTriggerData.value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(50)')
SET @HostName = HOST_NAME()
SET @AppName = APP_NAME()
INSERT INTO [LogonAudit].[dbo].[LogonAuditing]
(
SessionId,
LogonTime,
HostName,
ProgramName,
LoginName,
ClientHost
)
SELECT
@@spid,
@EventTime,
@HostName,
@AppName,
@LoginName,
@ClientHost
END
这是错误消息:
由于触发器执行,使用用户名“grafana”登录时出错
禁用触发器让 Grafana 登录到 SQL Server,但我希望让它与激活的触发器一起工作来记录登录。
您可以首先更改审核表中的
LoginName
以允许 NULL
,因为在 SQL 身份验证登录的情况下,这可能无法通过从 XML 中提取的方式来实现。 (事实上,我认为您根本不需要繁重的 EventData()
XML。)
接下来,您需要确保您的审计表支持您可能尝试插入的数据 - 登录名、程序名和主机名都可以达到
nvarchar(128)
,所以这就是您的列和变量声明的声明方式.
不过,我认为它不需要同时
ClientHost
和HostName
,因为我不知道它们什么时候会有所不同。
然后希望您可以在其他地方记录任何错误消息。
ALTER TRIGGER [LogonAuditTrigger]
ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @EventTime datetime = getutcdate(),
@LoginName nvarchar(128) = ORIGINAL_LOGIN(),
@HostName nvarchar(128) = HOST_NAME(),
@AppName nvarchar(128) = APP_NAME();
BEGIN TRY
INSERT LogonAudit.dbo.LogonAuditing
(
SessionId,
LogonTime,
HostName,
ProgramName,
LoginName
)
SELECT
@@spid,
@EventTime,
@HostName,
@AppName,
@LoginName;
END TRY
BEGIN CATCH
INSERT dbo.LoggingTable ... stuff including ERROR_MESSAGE() ...
THROW();
END CATCH
END