SQL Server 2005 Автоматически обновляемый столбец DateTime - последнее обновление - PullRequest
13 голосов
/ 30 августа 2008

У меня определена таблица (см. Фрагмент кода ниже). Как добавить ограничение или еще что-нибудь, чтобы столбец LastUpdate автоматически обновлялся при каждом изменении строки?

CREATE TABLE dbo.Profiles
(
        UserName                                varchar(100)            NOT NULL,
        LastUpdate                              datetime                NOT NULL  CONSTRAINT DF_Profiles_LastUpdate DEFAULT (getdate()),
        FullName                                varchar(50)             NOT NULL,
        Birthdate                               smalldatetime           NULL,
        PageSize                                int                     NOT NULL CONSTRAINT DF_Profiles_PageSize DEFAULT ((10)),
        CONSTRAINT PK_Profiles PRIMARY KEY CLUSTERED (UserName ASC),
        CONSTRAINT FK_Profils_Users FOREIGN KEY (UserName) REFERENCES dbo.Users (UserName) ON UPDATE CASCADE ON DELETE CASCADE  
)

Ответы [ 5 ]

24 голосов
/ 30 августа 2008

Я согласен с остальными - установите значение по умолчанию GetDate () в столбце LastUpdate, а затем используйте триггер для обработки любых обновлений.

Просто что-то простое:

CREATE TRIGGER KeepUpdated on Profiles
FOR UPDATE, INSERT AS 
UPDATE dbo.Profiles 
SET LastUpdate = GetDate()
WHERE Username IN (SELECT Username FROM inserted)

Если вы хотите стать действительно модным, пусть он оценивает то, что меняется, и то, что в базе данных, и изменяет LastUpdate только в том случае, если есть разница.

Учтите это ...

  • 7 утра - пользователь 'jsmith' создан с фамилией 'Smithe' (упс), по умолчанию LastUpdate равен 7 часов утра * 10101 *

  • 8:00 - «jsmith» отправляет электронное письмо, чтобы сообщить, что его имя неверно. Вы немедленно выполняете обновление, поэтому фамилия теперь «Смит» и (благодаря триггеру) LastUpdate показывает 8 часов утра

  • 2pm - Вашему бездельному коллеге наконец-то надоедает StumbleUpon и он проверяет свою электронную почту. Он видит предыдущее сообщение от «jsmith» об изменении имени. Он запускает: UPDATE Profiles SET LastName = 'Smith' WHERE Username = 'jsmith' и затем идет вернуться к серфингу MySpace. Триггеру все равно, что фамилия была уже «Смит», поэтому LastUpdate теперь показывает 2 часа дня .

Если вы просто слепо изменяете LastUpdate при каждом выполнении оператора обновления, это ТЕХНИЧЕСКИ правильно, потому что обновление действительно произошло, но, вероятно, имеет больше смысла фактически сравнивать изменения и действовать соответственно. Таким образом, оператор обновлений в 2 часа дня по-прежнему будет работать, но LastUpdate по-прежнему будет отображаться в 8 часов утра.

- Кевин

4 голосов
/ 30 августа 2008

Ограничение по умолчанию работает только для вставок; для обновления используйте триггер.

3 голосов
/ 15 апреля 2009

Я согласен с идеей триггера, хотя я бы использовал объединение для вставки вместо подзапроса. Тем не менее, я хочу отметить, что имя пользователя является особенно плохим выбором для первичного ключа. Имена пользователей часто меняются, и когда они происходят, вам нужно изменить все связанные таблицы. Гораздо лучше иметь идентификатор пользователя в качестве ключа, а затем поставить уникальный индекс для имени пользователя. Затем, когда имя пользователя меняется, вам больше ничего не нужно менять.

2 голосов
/ 30 августа 2008

Для этого вам придется использовать триггеры.

0 голосов
/ 30 августа 2008

Мое предложение было бы создать хранимую процедуру, которая по умолчанию lastUpdate по умолчанию для getdate ().

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

Также добавьте это в качестве значения по умолчанию для определения столбца.

...