EVENTDATA() 函数在 SQL Server 中仅给出空值

0 trigger sql-server-2008 sql-server t-sql functions

我正在尝试使用触发器捕获登录时间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
Run Code Online (Sandbox Code Playgroud)

Eri*_*ing 5

XML 区分大小写,并且您没有正确地大写。

“Clienthost”应该是“ClientHost”,您可以在文档架构中看到它:<xs:element name="ClientHost" type="SSWNAMEType"/>

此外,元素类型 SSWNAMEType 的最大长度为 128 字节,而不是 15 字节。

<!--  SSWNAMEType  -->
<xs:simpleType name="SSWNAMEType">
<xs:restriction base="xs:string">
<xs:maxLength value="128"/>
</xs:restriction>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)