这是一个假设的问题 - 下面列出的问题完全是虚构的,但我相信如果有人得到答案,它可能对将来的参考有用。
我们遇到一种情况,其中多个系统都在我们的SQL Server上填充相同的数据表。其中一个系统似乎不正确地填充表格,虽然是一致的模式(让我相信它只是单个系统中的一个错误,而不是多个)这些是主要的第三方系统和我们没有访问修改或查看他们的源代码,也不改变他们的功能。我们想向罪魁祸首系统的开发人员提交错误报告,但我们不知道它是哪一个,因为系统没有留下任何可识别的痕迹。 table - 我之前的负责人,当数据库是新的并且只是偶尔被单个系统使用时,认为单个时间戳字段是一个充分的审计,并且从未重新考虑过。
我们的解决方案必须完全基于SQL。我们的想法是在桌子上写一个触发器,并以某种方式拉出查询的来源 - 即它来自哪里 - 但我们不知道如何,或者即使这是可能的。
有一些明确的解决方案 - 例如联系所有开发人员更新他们的软件以填充新的software_ID
字段,然后使用新信息来识别故障系统(并保存)我的虚构的自我类似的头痛后来) - 但我特别感兴趣的是知道是否有任何可以在SQL Server(或其他聪明的解决方案)内部完成的任何事情,并注明了这些限制。
答案 0 :(得分:3)
你可以使用功能:
select HOST_NAME(), APP_NAME()
因此,您将了解导致更改的计算机和应用程序。
您可以修改应用程序连接字符串以添加自定义应用程序名称,例如:
„Data Source=SQLServerExpress;Initial Catalog=TestDB;
Integrated Security=True; Application Name=MyProgramm”
答案 1 :(得分:1)
您可以使用一个额外的nvarchar
字段创建相关表格的副本,以保存标识符。
然后在表上创建一个insert(可能更新)的触发器,并在触发器中向复制插入相同的行,添加一个标识符。标识符可以是例如连接上的登录名:
insert into tableCopy select SUSER_SNAME(), inserted.* from inserted
或者客户IP:
declare @clientIp varchar(255);
SELECT clientIp = client_net_address
FROM sys.dm_exec_connections
WHERE Session_id = @@SPID
insert into tableCopy select @clientIp, inserted.* from inserted
或者可能从连接上下文获得的其他东西(缺少更精确的术语)可以识别客户端应用程序。
确保插入表格副本在任何情况下都不会导致错误。主键和索引应该从副本中删除。
答案 2 :(得分:1)
只是一个想法:创建一个触发器,在表格中存储可疑值时,将EXEC sp_who2
获取的信息保存在专用表中。
也许您可以按状态RUNNABLE过滤sp_who2值。
因此,如果多个用户共享相同的登录信息,您可以确定命令执行的确切时刻并从此开始研究......