Триггер после вставки не нулевой столбец
У меня есть таблица, которая содержит два not null
столбца " Created
и Updated
.
Я написал соответствующие триггеры
ALTER TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category]
AFTER INSERT
AS
BEGIN
UPDATE Category
SET Created = GETDATE(), Updated = GETDATE()
FROM inserted
WHERE Category.ID = inserted.ID;
END
а также
ALTER TRIGGER [dbo].[tr_category_updated] ON [dbo].[Category]
AFTER UPDATE
AS
BEGIN
UPDATE Category
SET Updated = GETDATE()
FROM inserted
inner join [dbo].[Category] c on c.ID = inserted.ID
END
но если я вставляю новую строку, я получаю сообщение об ошибке
Невозможно вставить значение NULL в столбец "Создано", таблица "Категория"; столбец не допускает нулей. INSERT терпит неудачу.
Вставить команду:
INSERT INTO [Category]([Name], [ShowInMenu], [Deleted])
VALUES ('category1', 0, 0)
Как я могу написать такие триггеры без установки этих столбцов, чтобы разрешить null?
Ответы
Ответ 1
Измените таблицу следующим образом:
ALTER TABLE yourTable MODIFY COLUMN updated timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT 0;
Установите значение по умолчанию для созданного столбца на 0. К сожалению, MySQL не позволяет использовать два столбца временной метки по умолчанию CURRENT_TIMESTAMP
в одной таблице. Чтобы преодолеть это, вам просто нужно вставить значение NULL
в created
столбец, и у вас будут оба столбца с текущей меткой времени.
INSERT INTO yourTable (col1, created) VALUES ('whatever', NULL);
Или вы устанавливаете по умолчанию допустимую временную метку, например
ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT '1970-01-01 00:00:00';
и измените свой триггер следующим образом:
ALTER TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category]
AFTER INSERT
AS
BEGIN
UPDATE Category
SET Created = GETDATE()
/* FROM inserted */ /*don't know where you got that from, do you port from SQL Server?*/
WHERE Category.ID = NEW.ID;
END
Ответ 2
Ошибка возникает, поскольку триггер работает только после вставки, и вы не можете вставлять значения столбцов, Created
и Updated
во время вставки.
Таким образом, для устранения ошибки вы можете вставить/заполнить столбцы " Created
и Updated
вместе со вставкой. ИЛИ Вы можете добавить значение по умолчанию для столбца. Пожалуйста, проверьте ссылки для получения более подробной информации.
Добавить столбец со значением по умолчанию в существующую таблицу в SQL Server
Укажите значения по умолчанию для столбцов
Ответ 3
Возможное использование триггера INSTEAD OF
CREATE TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category]
INSTEAD OF INSERT
AS
BEGIN
INSERT Category(Name, ShowInMenu, Deleted, Created, Updated)
SELECT Name, ShowInMenu, Deleted, GETDATE(), GETDATE()
FROM inserted i
END
Ответ 4
Обычно я допускаю, чтобы последний обновленный столбец был нулевым, так как я хочу знать, не изменился ли он. Если вы должны удержать оба поля с нулевым значением, я бы добавил значение по умолчанию для таких столбцов, как это:
ALTER TABLE [dbo].[Category] ADD DEFAULT (getdate()) FOR [Created]
GO
ALTER TABLE [dbo].[Category] ADD DEFAULT (getdate()) FOR [LastUpdated]
GO
Тогда вам не понадобится триггер для вставки.
Если вы действительно хотите использовать триггер в любом случае, вам нужно будет указать INSTEAD OF
а не AFTER
и включить инструкцию insert.