【问题标题】:Trigger creation/modification to ensure field equals insertion date触发器创建/修改以确保字段等于插入日期
【发布时间】:2018-11-25 06:57:40
【问题描述】:

我有一个名为Customer 的表,而有问题的列是dbupddate。此列应包含导致插入记录的查询的日期时间。

我已经对getdate()做了一个默认约束:

CREATE TABLE [dbo].[customer]
(
    [dbupddate] [DATETIME] NOT NULL 
         CONSTRAINT [DF_customer_dbupddate] DEFAULT (GETDATE()),...

但这并不能防止有人意外输入不相关的值。

如何确保dbupddate 列有插入日期时间?

我猜答案将包含一个触发器。在这种情况下,请考虑以下已经存在的触发器,它的效果不应以任何方式丢失/修改:

CREATE TRIGGER [dbo].[customer_ins_trig]
ON [dbo].[customer]
AFTER INSERT
AS 
BEGIN
    DELETE u
    FROM transfer_customer_unprocessed u
    WHERE EXISTS (SELECT 1 FROM inserted i WHERE i.code = u.code)

    INSERT INTO transfer_customer_unprocessed (code, dbupddate)
        SELECT code, dbupddate
        FROM inserted
END

也许我可以在其中添加一些行以满足我的需要?或者创建另一个?

【问题讨论】:

    标签: sql sql-server tsql datetime triggers


    【解决方案1】:

    在插入数据的过程中,不要为该列提供变量。如果有人有权打开 SSMS 并对其进行更新,但您也可以通过访问权限来限制它。

    此外,如果这是跟踪更改的更大计划的一部分,您可能需要查看 rowversion

    【讨论】:

      【解决方案2】:

      我认为,这是一个可以满足您要求的触发器。请注意,用户无法控制进入 InsertDate 的内容。

      这是为您的数据保留“最新更新”信息的合理方法。但是,@scsimon 如果您出于其他原因这样做,ROWVERSION 值得探索,不需要触发器,并且性能会更高。

      DROP TABLE IF EXISTS Test;
      GO
      
      CREATE TABLE Test (
          Id INT NOT NULL ,
          Content NVARCHAR(MAX) NOT NULL ,
          InsertDate DATETIME NULL
      );
      GO
      
      CREATE TRIGGER TR_Test
      ON Test
      AFTER INSERT, UPDATE
      AS BEGIN
          UPDATE t SET t.InsertDate = GETDATE() FROM Test t INNER JOIN inserted i ON i.Id = t.Id;
      END;
      GO
      
      INSERT Test VALUES (1, '1', NULL), (2, '2', NULL), (3, '3', NULL);
      SELECT * FROM Test;
      GO
      
      UPDATE Test SET Id = 4, Content = 4 WHERE Id = 1;
      UPDATE Test SET Id = 5, Content = 5, InsertDate = NULL WHERE Id = 2;
      SELECT * FROM Test;
      GO
      

      【讨论】:

        猜你喜欢
        • 2015-05-13
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        相关资源
        最近更新 更多