2008-11-27 27 views
12

因为我们没有在SQL服务器中以用户的身份实现应用程序的用户,所以当应用程序服务器连接到数据库时,每个应用程序总是使用相同的凭证来附加到每个数据库。SQL Server:修改用于审计目的的“应用程序名称”属性

这提出了审计问题。使用触发器,我们希望存储每个更新,插入和删除,并将每个更新分配给特定用户。一种可能的解决方案是为每个表添加一个“由用户更新”列并每次更新。这意味着每个表上的新列和每个存储过程上的新参数。这也意味着你只能做软删除。

取而代之的是,我建议使用连接字符串的应用程序名称属性以及与扳机内APP_NAME()属性阅读本。我用一个简单的应用测试了它,它似乎工作(格式可以如此:App = MyApp | User = 100)。

你们的问题是,这是一个坏主意,你有更好的吗?

+0

你是如何解决这个问题的?您可以使用`CONTEXT_INFO`从触发器读取“App = MyApp | User = 100”?我需要修改* ApexSQL Audit 2008 *使用的触发器,并存储通过'ApplicationName'传递的“用户”。 – AMissico 2013-07-27 01:32:00

回答

1

我们使用的应用程序名称属性来控制审计触发器和使用它没有看到任何问题,还没有发现任何速度问题(虽然在我们的例子中,我们没有专门审计对于某些应用,所以它的硬测量有多少时间没有做的事情发生:))

+0

这很好听。通过它的声音,您每次都使用相同的应用程序名称。我建议修改每个连接的应用程序名称以标识当前用户。你能看到这个问题吗(我们没有联网)? – 2008-11-27 11:22:51

+0

我们使用两个不同的应用程序名称,一个用于我们想要审计的时间,一个用于我们不需要的时间(因为无论使用的连接是手动处理审计)。 – 2008-11-27 21:25:48

2

这当然似乎是一个可行的解决方案,但你需要的用户名注入到每一次的连接字符串您的应用程序加载。请注意,该解决方案可能不适用于Web应用程序,因为每次连接字符串都会有所不同,这可能会导致巨大的连接池问题。

另一种方法是检索主机名/ IP地址(SELECT host_name())并将其存储。

你未必需要在每个存储过程的新参数,你可以修改每个存储过程(或触发器)来自动插入APP_NAME /主机名。

一个潜在缺点是通过Management Studio中进行任何修改不会有自定义APP_NAME,你会留下“Microsoft管理工作室”作为用户。

+0

虽然我们曾经这样做过,但我们不再使用连接池,因此每个连接都是独立的。 主机名/ IP地址不起作用,因为这将来自应用程序服务器而不是客户端。 – 2008-11-27 12:59:58