Есть некоторые серьезные проблемы с вашим триггером.В триггерах есть вставленная таблица (при вставках и обновлениях) и удаленная таблица (при удалениях и обновлениях).Вы должны использовать информацию этой таблицы, чтобы знать, какие записи необходимо обновить.
This is bad because a trigger can have multiple rows
This SQL simply will not work correctly if you insert multiple rows.
DECLARE @dateID DATETIME
SELECT @dateID = Date FROM Food
This SQL is trying to insert a new row which is causing your NULL error
It is not trying to update the row you are inserting
INSERT INTO Food (DayOfWeek)
SELECT DATENAME(dw, @dateID)
Это должен быть триггер INSTEAD OF, чтобы избежать ограничения NULL на столбец.Ответ Вольфганга по-прежнему вызовет нулевую ошибку ограничения, потому что после запуска триггеров ПОСЛЕ, данные вставляются.Триггер INSTEAD OF будет работать вместо фактической вставки.
CREATE TRIGGER DOW ON Food
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
-- update the day of the week for the inserted rows
INSERT INTO Food (FoodName,CategoryID,Price,StoreID,[Date],ShopperID,[Week],[DayOfWeek])
SELECT
FoodName,CategoryID,Price,StoreID,[Date],ShopperID,[Week],DATENAME(dw, [Date]) AS [DayOfWeek]
FROM inserted
END
GO
Лично я считаю хранение недели и дня недели плохой идеей.У вас уже есть значение, которое может получить эту информацию (Дата).Каждый раз, когда у вас есть несколько столбцов, которые по сути являются дублирующими данными, вы столкнетесь с проблемой обслуживания.