2013-05-16 30 views
1

首先,我是一名安全人員,而不是開發人員。如果有更簡單的方法去做我想做的事情,我不會感到驚訝。這是我第一次用C#做任何事情,所以要溫和。是否可以在一箇中運行2個獨立的INSERT語句?

我正在研究數據庫以跟蹤我們對審計控制的遵從性。該數據庫是MS SQL 2008,具有我在C#中編寫的Web應用程序前端。我正在研究一個頁面,該頁面允許用戶使用測試結果更新控件或更改需求或幾乎其他任何內容。在此頁面上更新信息時,我正試圖在控制表中更新記錄之前將現有數據從控制表寫入歷史記錄表。我也試圖登錄(在History表中)誰進行了更新和何時。這是我遇到問題的地方。我可以在INSERT語句中嵌入SELECT語句來拉取數據,但我無法弄清楚如何添加更新的日期和時間以及更新它的用戶。

這是我目前的查詢,不起作用的原因很明顯。這樣你就可以知道我正在使用哪些列和參數。

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 

如何追加WhoChangedWhenChanged列於insert語句?它們被參數化爲只有DateTime.NowUser.Identity.Name的變量。

如果您需要更多的代碼,請告訴我。

回答

0

我覺得你有幾個不同的路線,你可以去。您可以使用存儲過程或觸發器解決問題。

存儲過程給你很多控制權。你可以接受你想要的任何參數,並運行一系列的INSERT和UPDATE語句等等。它將你所有的代碼放在一個很好的存檔位置。不要忘記內聯評論。

觸發器的一大優點是始終運行。您的同事是否有可能訪問數據表並修改數據?如果您的應用程序使用存儲過程,則歷史記錄表和控件表可能會失去同步。那是問題嗎? (另外,我會考慮將WhoChanged和WhenChanged添加到您的控件表中,然後您可以在修改它之前將整個控件行寫入歷史記錄表中,這可以通過觸發器或存儲來完成流程。

編輯

需要明確的是,當你創建的歷史記錄嗎?你在每個INSERT和UPDATE創造呢?只是想確保每條記錄都標有創建該數據的ID /時間戳。如果您僅在歷史記錄表過期時將數據移動到歷史記錄表中,那麼您將標記關於誰以及何時被刪除的信息。這可能會讓那些後來的人感到困惑。

+0

我曾考慮將列添加到控件表中,但我試圖遠離它。我一直在閱讀有關SQL Server中的計算列。當添加記錄時,是否有可能讓SQL服務器捕獲時間戳和用戶名? – Edward

+0

只要您使用受信任的身份驗證進行數據連接,並且您的所有Kerberos資料都進行了適當的配置,這當然是可能的。 Web應用程序常常在服務帳戶的上下文中運行,因此您無需爲用戶提供數據庫權限。由你決定。 SQL中至少有4個不同的「當前用戶」函數,我不記得哪一個是正確的。 – Bill

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(); 
} 
+0

嗯,這是我的第一個真正的開發項目,但是,是的,我的問題是比C#更多的SQL。 我試着將參數添加到查詢中,但這些列不存在於控件表中,因此它不起作用。 – Edward

+0

@ user2391629:那麼'whochanged,whenchanged'不是'controls'表中的列嗎?然後我不明白這個問題/要求。只需從sql中刪除它們。 –

+0

爲了審計目的,我需要捕獲該信息。我繼續前進,並將它們添加到控制表並讓它工作。我認爲我太過複雜了。謝謝您的幫助。 – Edward

相關問題