Триггер после вставки в столбец not null
у меня есть таблица, которая содержит два 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 в столбец "Created", таблица "Категория"; столбец не допускает нулей. Ошибка вставки.
вставить команду:
INSERT INTO [Category]([Name], [ShowInMenu], [Deleted])
VALUES ('category1', 0, 0)
как я могу написать такие триггеры без установка для этих столбцов разрешения null?
4 ответов
изменить таблицу следующим образом:
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 не позволяет два столбца timestamp с default 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
возникает ошибка, потому что триггер работает только после вставки, и вы не можете вставлять значения столбцов Created
и Updated
во время вставки.
поэтому для устранения ошибки вы можете вставить / заполнить столбцы Created
и Updated
вместе с insert.
ИЛИ
Можно добавить значение по умолчанию свойство column. Пожалуйста, проверьте ссылки для деталей
добавить столбец со значением по умолчанию в существующую таблицу в SQL Сервер
можно использовать ВМЕСТО триггер
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
Я обычно разрешаю последний обновленный столбец быть нулевым, так как я хочу знать, не был ли он изменен. Если вы должны сохранить оба поля nullable я бы добавил значение по умолчанию для этих столбцов, как это:
ALTER TABLE [dbo].[Category] ADD DEFAULT (getdate()) FOR [Created]
GO
ALTER TABLE [dbo].[Category] ADD DEFAULT (getdate()) FOR [LastUpdated]
GO
тогда вам не понадобится триггер для вставки.
Если вы действительно хотите использовать триггер в любом случае, вам нужно будет указать INSTEAD OF
, а не AFTER
и включить инструкцию insert.