Триггер после вставки в столбец 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.