Автоматически обновляемый столбец даты и времени SQL Server 2005 - lastUpdated
-
09-06-2019 - |
Вопрос
У меня есть определенная таблица (см. фрагмент кода ниже).Как я могу добавить ограничение или что-то еще, чтобы столбец 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 было проблемой. Специально для разработчиков, которые плохо знакомы с вашим проектом. Р>
Также добавьте это в качестве значения по умолчанию для определения столбца.