Время автоматического обновления в SQL Server - PullRequest
1 голос
/ 04 января 2012

Я бы хотел, чтобы в моей таблице было два столбца для хранения времени добавления и обновления. Как следует из названия, время добавления - это время, когда строка была впервые добавлена; время обновления - последний раз, когда строка была обновлена. Я могу реализовать сначала по умолчанию значение GETDATE(). Что касается второго, @Jeremy предложил использовать триггеры здесь:

При обновлении: поле даты / времени автоматического обновления

  1. Есть ли более простой способ?
  2. Если я реализую триггер, означает ли это, что должны выполняться два оператора UPDATE (или один INSERT и один UPDATE в случае, если строка только что создана)?

Спасибо.

РЕДАКТИРОВАТЬ: Для второй части вопроса, это триггер, который я имею в моей базе данных:

CREATE TRIGGER [dbo].[TR_AddUpdateTime]
   ON [dbo].[AddUpdateTime]
   AFTER UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here

    UPDATE r
       SET UpdateTime = GETDATE()
      FROM AddUpdateTime r
      JOIN inserted i
        ON i.Id = r.Id
END

Означает ли это, что дополнительный оператор обновления будет выполняться всякий раз, когда я обновляю таблицу AddUpdateTime, или MSSQL достаточно умен, чтобы признать, что я обновляю одну и ту же запись, и сохранить оба изменения одновременно?

Ответы [ 6 ]

2 голосов
/ 04 января 2012
  1. Другие способы:

    • Использование хранимой процедуры для упаковки обновлений
    • Вы можете сделать UPDATE MyTable SET ..., UpdatedWhen = DEFAULT...

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

2 голосов
/ 04 января 2012
  1. Вы можете убедиться, что все вставки и обновления проходят через хранимую процедуру, которая вставляет время.
  2. Нет, триггер вставки изменит значения так, чтобы это был только один оператор.

Редактировать: Для структуры сущностей не могли бы вы реализовать событие OnSavingChanges для вставки поля времени обновления ( см. Здесь )? Это переносит ответственность с БД на Кодекс, который вам может или не может быть удобен.

1 голос
/ 04 января 2012

В платформе сущностей вы можете использовать частичный класс для расширения бизнес-логики. В этом случае вы можете использовать OnPropertyChanged , чтобы установить время обновления DateTime.Now. Вы можете использовать эту статью на MSDN в качестве руководства.

1 голос
/ 04 января 2012

Вот ссылка , показывающая, как это сделать с помощью Entity Framework.

0 голосов
/ 04 января 2012
  1. Они могут быть более простым способом, но использование триггеров будет более эффективным и не будет гарантировать, каким образом записи вставляются или обновляются (из кода .net или прямых вставок / обновлений таблиц), эти два поля заполняются

  2. Чтобы гарантировать, что каждый раз срабатывает только один триггер, объедините триггер вставки и обновления

     CREATE TRIGGER <trigger name> ON TableA for INSERT,UPDATE
    

    и выполните условную проверку, чтобы различить два действия

     IF UPDATE
    
0 голосов
/ 04 января 2012

1) «Автообновление» и «триггеры» на самом деле не похожи на путь.

2) В SQL Server есть (относительно новый) оператор «слияния».Но это не совсем похоже на то, что вы ищете.

3) Вместо этого:

a) Если первичный ключ не существует (если «новый»), тоВСТАВИТЬ.В этом случае first time = last time = GETDATE ().

b) В противном случае, если первичный ключ уже существует, тогда UPDATE.Ваше обновление будет обновлять только столбец «в последний раз» (вместе с остальными полями, которые необходимо обновить для этой записи.

4) Возможно, вы можете обернуть эту логику в хранимую процедуру?

5) Опять же - ключ к обновлению ОБА «первый раз» и «последний раз *, ПЕРВЫЙ РАЗ , а затем обновление ТОЛЬКО » в последний развремя "все последующие времена.

...