Автоматически обновляемый столбец даты и времени SQL Server 2005 - lastUpdated

StackOverflow https://stackoverflow.com/questions/36001

Вопрос

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

Решение

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

Другие советы

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

  • 8 утра - "джсмит" отправляет ЕГО по электронной почте, чтобы сообщить, что его имя неверно.Вы немедленно выполняете обновление, поэтому фамилия теперь "Смит" и (благодаря триггеру) Последняя дата показывает 8 утра

  • 2 часа дня - Вашему коллеге-бездельнику, наконец, надоедает StumbleUpon, и он проверяет свою электронную почту.Он видит более раннее сообщение от "jsmith" о смене имени.Он бежит: ОБНОВИТЬ профили, УСТАНОВИТЬ фамилию='Smith', ГДЕ Username='jsmith' и тогда идет вернуться к серфингу на MySpace.Однако триггеру все равно, что фамилия уже была "Смит", поэтому LastUpdate теперь показывает 2 часа дня.

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

--Кевин

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top