我正在尝试使用触发器捕获登录时间EVENTDATA()
。但它只为所有类型的事件提供 Null 值。有人可以帮我解决这个问题吗?这是我的触发器
CREATE TRIGGER trgBlockIP
ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @clientip NVARCHAR(15);
SET @clientip = (
SELECT
EVENTDATA().value(
'(/EVENT_INSTANCE/Clienthost)[1]',
'NVARCHAR(15)'
)
);
IF EXISTS (
SELECT ip
FROM master.dbo.BLockedIPAddresses
WHERE ip = @clientip
)
BEGIN
PRINT 'Your IP Address is blocked';
ROLLBACK;
END;
ELSE
BEGIN
DECLARE @Range VARCHAR(15);
SELECT
@Range = SUBSTRING(
@clientip,
1,
LEN(@clientip)
- CHARINDEX('.', REVERSE(@clientip))
) + '.*';
IF EXISTS (
SELECT ip
FROM master.dbo.BLockedIPAddresses
WHERE ip = @Range
)
BEGIN
PRINT 'Your IP Address Range is blocked';
ROLLBACK;
END;
END;
END;
GO
XML 区分大小写,并且您没有正确地大写。
“Clienthost”应该是“ClientHost”,您可以在文档架构中看到它:
<xs:element name="ClientHost" type="SSWNAMEType"/>
此外,元素类型 SSWNAMEType 的最大长度为 128 字节,而不是 15 字节。