#sql-server #triggers #sql-server-2008-r2
#sql-сервер #триггеры #sql-server-2008-r2
Вопрос:
Я использую SQL Server 2008 R2.
У меня есть две таблицы, ShoppingList
и ShoppingListFood
. ShoppingListFood
связан с ShoppingList
помощью внешнего ключа вкл ShopListID
. Я хочу обновлять LastModifiedDate
столбец в ShoppingList
таблице всякий раз, когда в таблице выполняется какое-либо обновление / вставка ShoppingListFood
. Возможно ли это??
Я погуглил и обнаружил, что мне нужно создать триггер в хранимой процедуре, но я ничего об этом не знаю, кто-нибудь может помочь??
Комментарии:
1. привет, спасибо за напоминание, но должен ли я просто отметить «лучший» ответ или отметить только тот, который действительно решает мою проблему?? Спасибо..
2. привет, я действительно ценю помощь / отзывы от всех. Я просто не совсем понимаю, как это работает. Спасибо за ваш совет.
Ответ №1:
Конечно — нет проблем — попробуйте что-то вроде этого:
CREATE TRIGGER trg_UpdateShoppingListFood
ON dbo.ShoppingListFood
AFTER INSERT, UPDATE
AS
UPDATE dbo.ShoppingList
SET LastModifiedDate = GETDATE()
WHERE ShopListID IN (SELECT DISTINCT ShopListID FROM Inserted)
По сути, это создает триггер, который будет срабатывать после вставки и ОБНОВЛЕНИЯ ShoppingListFood
— он обновит значение LastModifiedDate
«прямо сейчас» для всех строк, которые были вставлены и / или обновлены, на основе псевдотаблицы Inserted
, доступной внутри триггера.
Эта псевдотаблица содержит все недавно вставленные строки (со всеми их столбцами), а также новые значения для всех обновленных строк (опять же: все столбцы).
Комментарии:
1. Большое спасибо.. Я пытаюсь это сделать сейчас. Но есть ли у вас какие-либо идеи, почему после создания и сохранения хранимой процедуры в VS server Explorer я не смог увидеть значок «развернуть» рядом с хранимой процедурой, и я не смог повторно открыть хранимую процедуру, которую я только что создал??? Действительно спасибо…
2. привет, я получаю сообщение об ошибке: преобразование типа данных datetime2 в тип данных datetime привело к значению вне диапазона Есть идеи, как это решить?? Спасибо……….
3. @user834754: понятия не имею — что-то должно быть «вне пределов»… используете ли вы Entity Framework? Являются ли ваши столбцы в SQL Server типом
DATETIME
?? Вы пытаетесь вставить значение00-00-0000
что-то вроде или что-то в этом роде????4. привет, я могу устранить эту ошибку, если я изменю тип данных строки LastUpdatedDate на datetime(2). Но я понятия не имею, зачем мне нужно иметь datetime2 вместо обычного datetime, которое я использовал!
5. Спасибо! я могу обновить поле после удаления, СОЗДАВ ТРИГГЕР trg_UpdateShopListOnDelete В dbo.SHOPLISTFOOD ПОСЛЕ УДАЛЕНИЯ В КАЧЕСТВЕ ОБНОВЛЕНИЯ dbo.SHOPLIST УСТАНОВИТЕ LastUpdatedDate = GETDATE(), ГДЕ ShopListID В (ВЫБЕРИТЕ ОТДЕЛЬНЫЙ ShopListID ИЗ удаленных)