插入非空列后触发

Wac*_*urn 12 sql t-sql sql-server triggers

我有一个包含两个表not nullCreatedUpdated.

我写了相应的触发器

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但如果我插入一个新行,我会收到一个错误

无法将值NULL插入"创建"列,表"类别"; 列不允许空值.INSERT失败.

插入命令:

INSERT INTO [Category]([Name], [ShowInMenu], [Deleted])
     VALUES ('category1', 0, 0)
Run Code Online (Sandbox Code Playgroud)

如何在没有设置这些列的情况下编写此类触发器以允许null?

fan*_*nts 3

像这样修改你的表:

ALTER TABLE yourTable MODIFY COLUMN updated timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT 0;
Run Code Online (Sandbox Code Playgroud)

将创建的列的默认值设置为 0。不幸的是,MySQL 不允许CURRENT_TIMESTAMP在一张表中存在两个具有默认值的时间戳列。为了克服这个问题,您只需将一个NULL值插入到created列中,两列都会具有当前时间戳。

INSERT INTO yourTable (col1, created) VALUES ('whatever', NULL);
Run Code Online (Sandbox Code Playgroud)

或者您将默认值设置为有效的时间戳,例如

ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT '1970-01-01 00:00:00';
Run Code Online (Sandbox Code Playgroud)

并像这样修改你的触发器:

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
Run Code Online (Sandbox Code Playgroud)