如何获取Windows登录名填充审计表ActionedBy字段
解决审计表获取AD登录名的问题
直接修改函数(适用于Windows认证直接连接数据库的场景)
你当前用的SUSER_NAME()返回的是数据库安全主体的名称,如果要获取Windows AD登录名,应该换成SUSER_SNAME()函数。这个函数会返回登录实例的完全限定登录名,格式通常是DOMAIN\UserName。
修改后的INSERT审计语句:
INSERT INTO Audit(CallID, Action, ActionedBy, ActionDate) SELECT CallID, 'INSERT', SUSER_SNAME(), GETDATE() FROM INSERTED;
应用使用统一数据库账号连接的场景(常见于三层架构)
如果你的应用是通过固定的数据库服务账号(比如你提到的Database_User)连接数据库,数据库层面无法直接获取终端用户的AD登录名——因为此时数据库只识别连接它的服务账号。这种情况需要:
- 应用层在执行数据操作时,将当前登录用户的AD账号作为参数传入(比如调用存储过程或执行SQL时额外携带)
- 审计逻辑中直接使用这个传入的账号值,而非数据库内置函数
举个例子,假设应用调用存储过程时传入@UserADName参数,审计部分的SQL可以改成:
INSERT INTO Audit(CallID, Action, ActionedBy, ActionDate) SELECT CallID, 'INSERT', @UserADName, GETDATE() FROM INSERTED;
补充说明
- 如果数据库是混合模式,用户用SQL账号登录,
SUSER_SNAME()返回的就是SQL账号名,这种场景下同样需要从应用层传入AD账号 - 要确保审计表的
ActionedBy字段长度足够容纳完整的AD登录名(建议设置为NVARCHAR(128)或更长)
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

