2013-05-16 2 views
1

Во-первых, я парень безопасности, а не разработчик. Если есть более простой способ сделать то, что я пытаюсь сделать, я не удивлюсь. Это мой первый раз, когда я делаю что-нибудь на C#, так что будьте осторожны.Возможно ли запустить 2 отдельных оператора INSERT в одном?

Я работаю над базой данных для отслеживания соблюдения вами контрольных проверок. База данных - это MS SQL 2008 с интерфейсом веб-приложения, который я пишу на C#. Я работаю над страницей, которая позволяет пользователю обновлять элемент управления с помощью результатов теста или изменять требования или почти все остальное. Когда информация обновляется на этой странице, я пытаюсь записать существующие данные из таблицы 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

Я думаю, что у вас есть несколько различные маршруты, которые вы могли бы пойти. Вы можете решить проблему с помощью хранимых процедур или триггеров.

Хранимые процедуры дают вам большой контроль. Вы можете принимать любые параметры, которые вы хотите, и запускать ряд инструкций INSERT и UPDATE и т. Д. И он помещает весь ваш код в одно красивое заархивированное место. Не забывайте также встроенные комментарии.

Большое преимущество триггеров заключается в том, что всегда работает. Есть ли вероятность, что один из ваших коллег будет обращаться к таблицам данных и изменять данные? Если ваше приложение использует хранимые процедуры, таблица истории и таблица управления могут выпасть из синхронизации. Это проблема?

(В качестве альтернативы, я хотел бы добавить в таблицу элементов управления WhoChanged и WhenChanged. Затем вы можете просто написать всю строку Controls в таблицу History, прежде чем изменять ее. Это можно сделать либо с помощью триггера, либо с сохраненной процедура.

EDIT

Чтобы быть ясно, когда вы создаете истории записи? вы создаете их на каждом INSERT и UPDATE?Просто хочу удостовериться, что каждая запись отмечена идентификатором/меткой времени, которая создала эти данные. Если вы только перемещаете данные в таблицу «История», когда они устарели, вы помещаете ее в информацию о том, кто и когда она была удалена. Это может смутить тех, кто приходит после.

+0

Я подумал о добавлении столбцов в таблицу «Элементы управления», но я старался держаться подальше от него. Я читал о вычисляемых столбцах в SQL Server. Можно ли просто заставить SQL-сервер фиксировать метку времени и имя пользователя при добавлении записи? – Edward

+0

Это, безусловно, возможно, если вы используете Trusted Authentication для подключения к данным, и все ваши материалы Kerberos настроены соответствующим образом. Часто веб-приложения запускаются в контексте учетной записи службы, поэтому вам не нужно предоставлять права доступа к данным для пользователей. Вам решать. В 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

Ну, это мой первый проект разработки на самом деле, но да, моя проблема - это больше SQL, чем C#. Я попытался добавить параметры к запросу, но эти столбцы не существуют в таблице элементов управления, так что это не сработает. – Edward

+0

@ user2391629: Итак, 'whochanged, whenchanged' не являются столбцами в таблице' controls'? Тогда я не понимаю проблему/требование. Просто удалите их из sql. –

+0

Мне нужно было захватить эту информацию, хотя для целей аудита. Я пошел вперед и добавил их в контрольный стол и получил его работу. Я думаю, что я слишком усложнял это. Спасибо за помощь. – Edward

Смежные вопросы