Триггер SQL Server — вставка последней обновленной даты в таблицу, связанную с внешним ключом

#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 ИЗ удаленных)