我们的客户希望按记录创建日期订购。对我来说,这似乎是一个系统变量,记录本身的某种元数据。
有没有办法判断创建记录的时间是否实际创建了一个默认为GetDate()的日期时间字段,并希望没有人修改它?
答案 0 :(得分:15)
不。
你需要有一个专栏。
想象一下,如果您需要为每条创建记录保留记录,那么元数据会有多大!您是否还希望在元数据上保留元数据,以便了解元数据何时更新?空间使用可以迅速升级。
SQL Server会保留一些统计信息,但这些特定信息需要来自用户定义的字段。
作为旁注,如果使用查找表,则可能会更难以篡改创建的字段上的日期。创建一个表“TableName_CreateDate”并使用实际表中的PK和日期值。您的日期位于不同的位置,不太可能被修改,但您仍然可以JOIN
来获取订单。您需要创建一个触发器来使用新值更新它。
如果你只想要 DATE 并且不需要日期时间值,你可以更进一步,只需要一个日期表和一个与之相连的查找表。即:
Table->Table.PK + Date.Pk -> DateTable
如果您有很多行(我认为每行4个字节),这会节省大量的驱动器空间。
答案 1 :(得分:4)
应添加creationdate字段。你通过在更新时添加一个不允许更新该字段的触发器来修复“希望没有人修改它”。
答案 2 :(得分:1)
不,据我所知,甚至不在系统表中。你可以挖掘旧的事务日志我敢肯定,但本机上,没有。
答案 3 :(得分:0)
我曾经遇到过一种情况,即需要表的行顺序,但没有时间戳(CreateDateTime,UpdateDateTime,...等)列可用。所以,我只有数据是事务日志。直接读取事务日志没有帮助,因为它不容易解析。因此,我发现了一个名为“ApexSQL Log”的程序非常有用。它具有所有过滤选项,您可以在不进行核心操作的情况下读取所有日志数据。虽然这个解决方案对我来说是令人满意的,但它有一个缺点:您只能根据事务操作过滤日期(开始时间和结束时间)。如果您正在搜索查询操作,例如封装在事务中的插入操作,则无法检索确切的插入时间(至少我找不到方法),只能检索事务时间。如果您的操作都是原子操作,那么您可以直接获得所有行创建日期信息。
答案 4 :(得分:-4)
如果他只想通过它订购,您可以考虑使用timestamp列。
它与现实世界日期无关,但您可以对其进行排序。