我有一个本地SQL Server 2016,我想审核对其执行的操作。我收到了sqlaudit日志和extended events logging,但是它们都不记录连接到数据库的远程客户端的IP。
[我试图创建一个触发器,使用this guide将该数据插入到我创建的表中,并提出了这个条件:
CREATE TABLE login_log_database (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), ClientHost nvarchar(2000));
GO
CREATE TRIGGER log
ON all server
FOR LOGON
AS
DECLARE @data XML
SET @data = EVENTDATA()
INSERT login_log
VALUES
(GETDATE(),
CONVERT(nvarchar(100), CURRENT_USER),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/ClientHost)[1]', 'nvarchar(2000)') ) ;
GO
但是当我从通用JDBC客户端(特别是DBeaver)连接到数据库时,表中的事件字段和ClientHost的条目为“ NULL”。从计算机本身上的SSMS本地连接,事件字段是LOGON,客户端主机是“本地计算机”。
我以某种方式从XML读取值时做错了吗?
您可以使用CONNECTIONPROPERTY('client_net_address')来捕获客户端的IP地址。
caveat:当客户端通过共享内存或命名管道连接时,client_net_address不返回ip。
对于共享内存[返回C0]
对于命名管道
<local machine>
返回
<named pipe>