12

由于我们没有将应用程序的用户实现为 SQL 服务器中的用户,因此当应用程序服务器连接到数据库时,每个应用程序始终使用相同的凭据来附加到每个数据库。

这提出了一个审计问题。使用触发器,我们希望存储每个更新、插入和删除,并将每个更新、插入和删除都归因于特定用户。一种可能的解决方案是向每个表添加一个“由用户更新”列,并每次都更新它。这意味着每个表上都有一个新列,每个存储过程上都有一个新参数。这也意味着您只能进行软删除。

相反,我建议使用连接字符串的应用程序名称属性并使用触发器内的 App_Name() 属性读取它。我用一个简单的应用程序对此进行了测试,它似乎可以工作(格式可以是:App=MyApp|User=100)。

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

4

3 回答 3

10

我为此使用SET CONTEXT_INFO。这正是你所需要的。

于 2008-11-27T14:27:11.563 回答
2

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

另一种选择是检索主机名/IP 地址 (SELECT host_name() ) 并存储它。

您不必在每个存储过程上都需要一个新参数,因为您可以修改每个存储过程(或触发器)以自动插入 App_Name/Hostname。

一个潜在的缺点是通过 Management Studio 执行的任何修改都没有自定义 App_Name,并且您将留下“Microsoft Management Studio”作为用户。

于 2008-11-27T12:49:50.450 回答
1

我们使用应用程序名称属性来控制审计触发器,使用它没有发现任何问题,也没有注意到任何速度问题(尽管在我们的例子中,我们特别不审计某些应用程序,所以很难衡量多少时间不做某事需要:))

于 2008-11-27T11:17:33.507 回答