Триггер после вставки не нулевой столбец

У меня есть таблица, которая содержит два 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.