2008-08-30 3 views
11

У меня определенная таблица (см. Фрагмент кода ниже). Как добавить ограничение или что угодно, чтобы столбец LastUpdate автоматически обновлялся в любое время, когда строка была изменена?SQL Server 2005 Auto Update DateTime Column - LastUpdated

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 
) 

ответ

4

defaul ограничение работает только на вставках, для обновления использовать триггер

2

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

-1

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

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

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

+4

Нечто подобное должно выполняться в триггере. В противном случае это не всегда будет правильным, так как существует много способов изменить данные без использования sps. Просто потому, что они являются болью, нет причин для их устранения, если вам нужны точные данные в вашей базе данных (что должно быть приоритетом 1). – HLGEM 2009-04-15 13:43:00

23

Я согласен с остальными - установите значение по умолчанию для 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 утра - User 'JSmith' создается с фамилией 'Smithe' (ой), LastUpdate по умолчанию 7am

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

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

Если вы просто слепо изменить LastUpdate всякий раз, когда запускает оператор обновления, это технически правильно, потому что обновление было произойти, но это, вероятно, имеет смысл на самом деле сравнивать изменения и действовать соответствующим образом. Таким образом, оператор Update 2pm Update будет работать, но LastUpdate все равно покажет 8 утра.

--Kevin

3

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

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