0

我正在两个单独的页面中创建一个简单的 ASP.NET 详细信息和网格视图,以便进行简单的记录保存。详细信息视图将用于将记录输入数据库,网格视图将用于这些记录的任何更新。我应该注意,我的 IIS 服务器上只启用了“Windows 身份验证”。

我要添加的功能之一是在将记录插入或更新到数据库时进行审计。我在 SQL Server 2012 中使用 CURRENT_TIMESTAMP 命令在插入和/或更新记录时输入。但是,我试图写出哪个活动目录用户更新或插入了给定的记录。我首先尝试利用 SYSTEM_USER 命令,但写入数据库的所有内容都是 SQL 服务器服务帐户或 dbo 帐户,这是不可接受的。我理解为什么要写入 SQL Server 服务帐户,但我需要将当前 Active Directory 用户的名称写入“用户名”字段,如下所述。

这是我现在用于时间戳和用户名的命令(这不是我正在使用的确切 SQL 命令):

INSERT INTO <table-name> ([timestamp], [username]...) VALUES (CURRENT_TIMESTAMP, SYSTEM_USER...)
UPDATE <table-name> SET [timestamp] = CURRENT_TIMESTAMP, [username]) = SYSTEM_USER WHERE.....

每当他们插入和/或更新给定记录而不是 SQL Server 服务帐户的凭据时,将当前 Active Directory 用户名写入“用户名”字段的最佳方法是什么?

提前致谢!

4

2 回答 2

2

你是如何连接到 SQL Server 的?您是使用 SQL 身份验证还是使用 Windows 身份验证进行连接?

如果使用 sql auth,那么没有办法不将该信息与数据库命令(查询)一起传递。

如果您使用的是 Windows 身份验证,您是否在 ASP.NET 中模拟用户?如果不是,那就和sql认证一样的问题。

如果您在 ASP.NET 中使用模拟,那么SYSTEM_USER应该可以满足您的需求。

如果您的网站使用表单身份验证而不是 AD 用户存储,那么您将遇到与 sql auth 相同的问题。

Think of it this way: Is SQL Server aware of the user of the website? In most cases, no, unless you are using impersonation with windows auth or you are telling SQL Server the user name (i.e. passing it in with your command statement).

于 2013-01-14T21:43:47.370 回答
0

You could store the application username on the context_info variable. And afterwards retrieve it in your trigger or anywhere you need it.

You should do this before each connection to sql is made; should be easy to do, since usually you have the code for the connection in one place only.

于 2013-01-14T21:49:14.867 回答