要求是在登录是Windows身份验证或SQL Server身份验证时查找哪个OS用户登录到SQL Server数据库。需要知道 WHO (客户端PC上的AD帐户)使用哪个db帐户登录到SQL Server的应用程序。
问题是当SQL Server身份验证用户登录时,我无法获取客户端的操作系统用户名。
例如,我在笔记本电脑笔记本电脑123上使用了我的AD帐户域名。域名为Stackoverflow
,用户名为developer1
,启动Microsoft SQL Server Management Studio,与数据库帐户(SQL Server身份验证)ERPAPPUSER
连接。我需要记录域用户Stackoverflow/developer1
。
我可以使用Microsoft SQL Server Management Studio轻松获取用户ERPAPPUSER
从laptop123
登录的信息。
我创建了一个数据库登录触发器,可以获取客户端用户名,主机名,登录时间,应用程序名称等,但无法获取客户端操作系统用户名。
CREATE TRIGGER DB_ServerLogon
ON ALL SERVER
WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
INSERT INTO audit_history.dbo.db_logon_history
SELECT
ORIGINAL_DB_NAME(),
ORIGINAL_LOGIN(),
@@SPID,GETDATE(),
HOST_NAME(),
APP_NAME()
END
GO
非常感谢!
- 将'WITH EXECUTE AS'添加为'',否则对于无权访问db_logon_history的所有用户将无法登录。
答案 0 :(得分:0)
简短的回答是不,这是不可能的。
答案很长,SQL Server支持2种安全模式。这些是a)“Windows Authenitcation模式”和b)“混合模式” - 这是“SQL Server和Windows身份验证模式”。第二种模式意味着您可以使用SQL Server登录或Windows帐户登录。 Windows帐户与上面(a)中的相同。现在,当您使用Windows登录时,它是一个受信任的连接,因此您必须授权Windows帐户/组访问您的SQL Server实例。连接是针对在用户登录到窗口时创建的令牌的身份验证。此令牌传递给SQL Server,因此可以解析它以返回您上面描述的信息。但是,当您使用SQL Server模式登录时,您没有使用域帐户登录,因此没有域帐户传递给SQL Server。而是使用在服务器上下文中运行的SQL Server本机帐户登录。现在,您可以使用任何类型的设备登录,而不仅仅是Windows客户端。如果您希望在使用SQL Server模式时将客户端详细信息传递给SQL Server,则必须将其作为参数从前端传递。即使用存储过程或类似方法。 (顺便说一句好问题。并且问得好。)