由于我们没有将应用程序的用户实现为SQL Server中的用户,因此当应用程序服务器连接到数据库时,每个应用程序始终使用相同的凭据附加到每个数据库。
这提出了审计问题。使用触发器,我们希望存储每个更新,插入和删除以及将每个更新属于特定用户。一种可能的解决方案是向每个表添加“按用户更新”列,并每次更新。这意味着每个表上都有一个新列,每个存储过程都有一个新参数。这也意味着你只能进行软删除。
而不是这个我建议使用连接字符串的Application Name属性并使用触发器内的App_Name()属性读取它。我用一个简单的应用程序测试了它,它似乎工作(格式可能如此:App = MyApp | User = 100)。
对你们这个问题是,这是一个坏主意,你有更好的想法吗?
答案 0 :(得分:10)
我使用SET CONTEXT_INFO。这正是你所需要的。
答案 1 :(得分:2)
这看起来似乎是一个可行的解决方案,尽管每次应用程序加载时都需要将用户名注入连接字符串。请注意,此解决方案可能不适用于Web应用程序,因为每次连接字符串都不同,这可能会导致巨大的连接池问题。
另一种选择是检索主机名/ IP地址(SELECT host_name())并存储它。
您不一定需要在每个存储过程上使用新参数,因为您可以修改每个存储过程(或触发器)以自动插入App_Name / Hostname。
一个潜在的缺点是,通过Management Studio执行的任何修改都不会具有自定义App_Name,您将被留下“Microsoft Management Studio”作为用户。
答案 2 :(得分:1)
我们使用Application Name属性来控制审计触发器并且没有看到任何使用它的问题,并且没有注意到任何速度问题(尽管在我们的例子中,我们特别没有审计某些应用程序,因此很难衡量不做某事的时间:))