Ответ 1
ограничение defaul работает только на вставках, для обновления используйте триггер
У меня определенная таблица (см. ниже фрагмент кода). Как добавить ограничение или что угодно, чтобы столбец 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
)
ограничение defaul работает только на вставках, для обновления используйте триггер
Я согласен с другими - установите значение по умолчанию для 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 утра.
- Кевин
Я согласен с идеей триггера, хотя я бы использовал соединение для вставки вместо подзапроса. Однако я хочу указать, что имя пользователя является особенно плохим выбором для первичного ключа. Имена пользователей часто меняются, и когда вам нужно изменить все связанные таблицы. Гораздо лучше иметь идентификатор пользователя в качестве ключа, а затем поместить уникальный индекс в имя пользователя. Затем, когда имя пользователя изменяется, вам не нужно ничего менять.
Для этого вам придется использовать триггеры.
Мое предложение состояло в том, чтобы создать хранимую процедуру, которая по умолчанию использует lastUpdate для getdate().
Я пытался избежать триггеров в прошлом, потому что pre-SQL2005, где они находились и редактировались, были болью в крупу. Специально для разработчиков, которые не знакомы с вашим проектом.
Также добавьте это как значение по умолчанию для определения столбца.