记录字段更改的审核历史记录

时间:2019-08-01 18:22:05

标签: mysql database model-view-controller database-design

我对我在软件开发课程中正在做的项目的数据库设计有疑问。

我有一个表来存储“采购订单”,每个采购订单与“状态”表具有多对一关系。因此,每个采购订单可以具有一个状态,例如:“未结请求”,“收到的货物”,“收到的发票”等。

嗯,一切正常。但是,我希望将更改历史记录存储到状态字段中。因此,何时将其更改为“已收到货物”,何时将其更改为“已收到发票”或任何其他状态。

我想我需要创建一个新表来存储这些表?如果是这样,我不确定如何实现此目标,以及如何在Web应用程序中构建所需的逻辑。我正在从头开始学习所有内容,所以不确定该逻辑是否应该在我的laravel项目(MVC)的控制器中,或者数据库是否能够处理该逻辑-例如,当主数据库能够级联删除记录时,记录被删除。

我的主要问题是我不知道这种类型的问题是否有名称,所以我也在努力地用Google搜索它。

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

历史记录日志有多种方法,或者您可以说审核日志记录。

1.Triggers
2.CDC(IN SQL server only)
3. By Your own code (i.e object cloning)
4. Inside your DML procedures

答案 1 :(得分:1)

  

我的主要问题是我不知道这种类型的问题是否有名称,所以我也在努力地用Google搜索它。

您要查找的是“审核”或“审核日志”或“版本”。

我喜欢paper_trail的工作方式。您有一个表来存储对任何表的更改。审核表将表,主键,操作(插入,更新,删除)和行的快照存储为JSON

您可以将其实现为database triggers或ORM中的回调。

答案 2 :(得分:1)

我认为您正在尝试根据订单的“状态”创建订单的审核/历史记录跟踪记录。
仅从数据库角度来看,这是实现所需内容的一种方法:

  1. 创建一个新表,例如OrderStatusLog->具有列: 一种。 OrderID(“订单”表中的主键)-要知道与哪个订单相关 b。 Prev_OrderStatusID-这将是旧/原始订单状态 C。 Current_OrderStatsID-这将具有最新的OrderStatusID

  2. 在“订单”表上创建触发器,例如:

    CREATE TRIGGER [dbo].[trgOrderStatusLog] 
    ON [dbo].[Orders]
    AFTER UPDATE   
    
    -- If you need to log when initially the Order was placed, change the 
    above line to:  
    -- AFTER INSERT,UPDATE 
    
    AS 
    
    INSERT INTO OrderStatusLog(OrderID, Prev_OrderStatusID, Current_OrderStatsID)
    
    SELECT           
      I.ORDERID,
      D.OrderStatusID, -- This is your Order Status before update
      I.OrderStatusID  -- This is your Order Status before update
    FROM INSERTED I 
    INNER JOIN DELETED D ON I.ORDERID = D.ORDERID
    
  3. 一个好主意是添加Timestamp和User更新记录(即使对于学校项目也是如此)。

  4. 从这一点开始,您需要做的只是一个更新调用/过程,它将更新Orders表。并且,将在OrderStatusLog表中创建每个更新的日志/记录。

这是完成当前任务的非常基本和直接的方法。另外,此语法基于SQL Server。

希望有帮助!