Подтвердить что ты не робот

Автоматическая обновленная колонка DateTime SQL Server 2005 - LastUpdated

У меня определенная таблица (см. ниже фрагмент кода). Как добавить ограничение или что угодно, чтобы столбец 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  
)
4b9b3361

Ответ 1

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

Ответ 2

Я согласен с другими - установите значение по умолчанию для 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, если есть разница.

Рассмотрим это...

  • 7am. Пользователь jsmith создается с фамилией "Smithe" (oops), LastUpdate по умолчанию - 7 утра

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

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

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

- Кевин

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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