情况:
我开发了一个数据库,它在很大程度上依赖于很多触发器来确保数据的一致性(为了实现CFR 21第11部分)。
存储用户有2个表:Login & User
(支持Sql server用户管理)。用户包含外部认证的静态登录数据,X1包含我们系统的登录数据(假用户)。一个人必须使用Login
数据之一(真实用户)登录我们的应用程序。当系统必须与外部系统(Active Directory或FileSystem或数据库)通信时,相应的User
(假用户)将被模拟。
澄清将使用X1(真实用户)登录和X2(假用户)用户。
当X2连接到数据库时,触发器不知道X1是谁。
问题: 触发器将记录X2完成的每个操作并将其写入日志。由于服务器只知道X2连接到数据库,因此它不知道Real用户X1。
客户还想看看RealUser X1是谁。由于连接到数据库时此信息丢失,我现在遇到此问题。
解决方案尝试:
先谢谢
答案 0 :(得分:0)
您可以使用CONTEXT_INFO
将额外数据与可在触发器中访问的会话相关联(例如,原始用户身份):
DECLARE @UID VARBINARY(128) = CONVERT(VARBINARY(128), N'User1')
SET CONTEXT_INFO @UID
-- Later, at the Hall of Justice
SELECT CONVERT(NVARCHAR(64), CONTEXT_INFO())
当然,您可以使用与Unicode字符串不同的方式来识别用户,只要它最终适合VARBINARY(128)
。
为此,您必须在执行任何命令之前始终设置信息(关闭连接时将重置上下文信息)。还存在安全问题 - SET CONTEXT_INFO
不是特权声明,可以由任何人执行,因此您必须确保控制数据库中的所有代码,以免审计信息被伪造。