首先,我是一名安全人员,而非开发人员。如果有一种更简单的方法来做我想做的事情,我不会感到惊讶。这是我第一次用C#做任何事情,所以要温柔。
我正在开发一个数据库来跟踪我们对审计控制的遵从情况。数据库是MS SQL 2008,带有我在C#中编写的Web应用程序前端。我正在开发一个页面,允许用户使用测试结果更新控件或更改要求或其他任何内容。当在此页面上更新信息时,我正在尝试将Controls表中的现有数据写入History表,然后再更新Controls表中的记录。我也在尝试记录(在History
表中)进行更新的人以及何时进行更新。这是我遇到问题的地方。我可以在SELECT
语句中嵌套INSERT
语句来提取数据,但我无法弄清楚如何添加更新的日期和时间以及更新它的用户。
这是我目前的查询,由于显而易见的原因无效。这样您就可以了解我正在使用的列和参数。
INSERT INTO History (BUName, ControlFWName, ControlID, ControlDesc,
TestPlan, TestFreq, NextTest, ControlCatName,
AuditorNotes, AuditorNoteTime, TestResults, ArtifactID1,
ArtifactID2, ArtifactID3, ArtifactID4,
WhoChanged, WhenChanged)
SELECT BUName, ControlFWName, ControlID, ControlDesc,
TestPlan, TestFreq, NextTest, ControlCatName,
AuditorNotes, AuditorNoteTime, TestResults, ArtifactID1,
ArtifactID2, ArtifactID3, ArtifactID4
FROM Controls
WHERE BUName = @BUName
AND ControlFWName = @ControlFWName
AND ControlID = @ControlID
如何将WhoChanged
和WhenChanged
列附加到该插入语句?它们被参数化为仅DateTime.Now
和User.Identity.Name
的变量。
如果您需要更多代码,请与我们联系。
答案 0 :(得分:2)
这是我第一次在C#做任何事情,所以要温柔。
但这是一个T-SQL而不是C#问题,不是吗?
您只需将参数添加到查询中:
INSERT INTO history
(buname, controlfwname, controlid, controldesc,
testplan, testfreq, nexttest, controlcatname,
auditornotes, auditornotetime, testresults,
artifactid1, artifactid2, artifactid3, artifactid4,
whochanged, whenchanged)
SELECT buname, controlfwname, controlid, controldesc,
testplan, testfreq, nexttest, controlcatname,
auditornotes, auditornotetime, testresults,
artifactid1, artifactid2, artifactid3, artifactid4,
@WhoChanged, @WhenChanged
FROM controls
WHERE buname = @BUName
AND controlfwname = @ControlFWName
AND controlid = @ControlID
这里是C#部分虽然不清楚为什么它可能很重要:
string sql = @"INSERT INTO history
(buname, controlfwname, controlid, controldesc,
testplan, testfreq, nexttest, controlcatname,
auditornotes, auditornotetime, testresults,
artifactid1, artifactid2, artifactid3, artifactid4,
whochanged, whenchanged)
SELECT buname, controlfwname, controlid, controldesc,
testplan, testfreq, nexttest, controlcatname,
auditornotes, auditornotetime, testresults,
artifactid1, artifactid2, artifactid3, artifactid4,
@WhoChanged, @WhenChanged
FROM controls
WHERE buname = @BUName
AND controlfwname = @ControlFWName
AND controlid = @ControlID";
// use the using statement to ensure that unmanaged resources are disposed and the connection is closed
using(var con = new SqlConnection(connectionString))
using (var cmd = new SqlCommand(sql, con))
{
DateTime now = DateTime.Now;
string user = HttpRequest.Current.User.Identity.Name;
cmd.Parameters.AddWithValue("@WhoChanged", user);
cmd.Parameters.AddWithValue("@WhenChanged", now);
// ...
con.Open();
int affectedRecords = cmd.ExecuteNonQuery();
}
答案 1 :(得分:0)
我认为你可以选择几种不同的路线。您可以使用存储过程或触发器来解决问题。
存储过程可以为您提供很多控制。你可以接受你想要的任何参数,并运行一系列INSERT和UPDATE语句等。它将你所有的代码放在一个很好的存档位置。不要忘记内联评论。
触发器的最大优点是始终运行。您的同事是否有机会访问数据表并修改数据?如果您的应用程序使用存储过程,则历史记录表和控件表可能会不同步。这是一个问题吗?
(顺便说一下,我会考虑将WhoChanged和WhenChanged添加到控件表中。然后,您可以在修改之前将整个Controls行写入History表。这可以通过触发器或存储过程完成
修改强>
要明确的是,您何时创建历史记录?你是在每次INSERT和UPDATE创建它们吗?只是想确保每条记录都标有创建该数据的ID /时间戳。如果您只是在数据被废弃时将数据移动到历史记录表中,那么您将使用有关删除时间和时间的信息对其进行标记。这可能会让后来的人感到困惑。