添加阴影列以插入语句

时间:2016-07-19 11:32:03

标签: sql-server tsql

情况: 我开发了一个数据库,它在很大程度上依赖于很多触发器来确保数据的一致性(为了实现CFR 21第11部分)。 存储用户有2个表:Login & User(支持Sql server用户管理)。用户包含外部认证的静态登录数据,X1包含我们系统的登录数据(假用户)。一个人必须使用Login数据之一(真实用户)登录我们的应用程序。当系统必须与外部系统(Active Directory或FileSystem或数据库)通信时,相应的User(假用户)将被模拟。

澄清将使用X1(真实用户)登录和X2(假用户)用户。

当X2连接到数据库时,触发器不知道X1是谁。

问题: 触发器将记录X2完成的每个操作并将其写入日志。由于服务器只知道X2连接到数据库,因此它不知道Real用户X1。

客户还想看看RealUser X1是谁。由于连接到数据库时此信息丢失,我现在遇到此问题。

解决方案尝试:

  1. 创建一个StoredProcedure,将RealUser x1作为参数。这是不可能的,因为旧软件依赖于当前插入和更新表。
  2. 添加附加数据插入/更新语句(可能我没有发现任何与此相关的内容)。数据仅由Trigger使用,不应写入表。
  3. 将有关当前X1用户的信息添加到Connection或基于连接的常规存储(在SqlServer中是否存在类似的内容?)
  4. 使用ApplicationName属性进行"伪造"用户名。但这让我觉得自己喜欢穿单片眼镜。必须有更好的方法
  5. 先谢谢

1 个答案:

答案 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不是特权声明,可以由任何人执行,因此您必须确保控制数据库中的所有代码,以免审计信息被伪造。