问题 Microsoft SQL Server:任何方式来判断创建记录的时间?


我们的客户希望按记录创建日期订购。对我来说,这似乎是一个系统变量,记录本身的某种元数据。

有没有办法告诉创建记录什么时候没有实际创建一个默认为GetDate()的datetime字段,并希望没有人修改它?


5968
2017-11-16 21:14


起源



答案:


不。

你需要有一个列。

想象一下,如果您需要为每个创建记录保留记录,那么元数据会有多大!您是否还希望在元数据上保留元数据,以便了解元数据何时更新?空间使用可以迅速升级。

SQL Server会保留一些统计信息,但这些特定信息需要来自用户定义的字段。

作为旁注,如果使用查找表,则可能会更难以篡改创建的字段上的日期。创建一个表“TableName_CreateDate”并使用实际表中的PK和日期值。您的日期位于一个单独的位置,不太可能被修改,但您仍然可以 JOIN 在它上面得到你的订单。您需要创建一个触发器以使用新值更新它。

如果你只想要的话 日期 并且不需要日期时间值,您可以更进一步,只需要一个日期表和一个连接到它的查找表。即:

Table->Table.PK + Date.Pk -> DateTable

如果你有很多行(我认为每行4个字节),这将节省大量的驱动器空间。


14
2017-11-16 21:16





应添加creationdate字段。你通过在更新上添加一个不允许更新该字段的触发器来修复“希望没有人修改它”的部分。


4
2017-11-16 21:25





不,据我所知,甚至不在系统表中。您可以通过旧的事务日志挖掘我确定,但本机上,没有。


1
2017-11-16 21:18





我曾经遇到过一种情况,即需要表的行顺序,但没有时间戳(CreateDateTime,UpdateDateTime,...等)列可用。因此,只有我拥有的数据才是事务日志。直接读取事务日志没有用,因为它不容易解析。因此,我发现了一个名为“ApexSQL Log”的程序非常有用。它具有所有过滤选项,您可以在不进行核心操作的情况下读取所有日志数据。虽然这个解决方案对我来说是令人满意的,但它有一个缺点:您只能根据事务操作过滤日期(开始时间和结束时间)。如果您正在搜索查询操作,例如封装在事务中的插入操作,则无法检索确切的插入时间(至少我找不到方法),只能检索事务时间。如果您的操作都是原子操作,那么您可以直接获得所有行创建日期信息。


0
2017-10-05 10:11





如果他只想通过它订购,你可以考虑使用 时间戳 柱。

它与现实世界日期无关,但您可以对其进行排序。


-4
2017-11-16 21:21



但是,如果他们想用这种方法比较不同的表格,他可能会遇到问题。 - JNK
只要OP知道所有的好处和风险,就没什么大不了的。 :) - JNK
啊哈!我只是觉得我在这个答案中弄错了,但现在我觉得我没有。该睡觉了。无论如何,如果它没用就修改它;) - thomaspaulb
timestamp 字段会在每次更新到行时自动更新。这打破了他的“并确保它不会改变”功能非常彻底。 - Donnie
是的,你是对的,它不是创造印章,而是修改印章。 - thomaspaulb


答案:


不。

你需要有一个列。

想象一下,如果您需要为每个创建记录保留记录,那么元数据会有多大!您是否还希望在元数据上保留元数据,以便了解元数据何时更新?空间使用可以迅速升级。

SQL Server会保留一些统计信息,但这些特定信息需要来自用户定义的字段。

作为旁注,如果使用查找表,则可能会更难以篡改创建的字段上的日期。创建一个表“TableName_CreateDate”并使用实际表中的PK和日期值。您的日期位于一个单独的位置,不太可能被修改,但您仍然可以 JOIN 在它上面得到你的订单。您需要创建一个触发器以使用新值更新它。

如果你只想要的话 日期 并且不需要日期时间值,您可以更进一步,只需要一个日期表和一个连接到它的查找表。即:

Table->Table.PK + Date.Pk -> DateTable

如果你有很多行(我认为每行4个字节),这将节省大量的驱动器空间。


14
2017-11-16 21:16





应添加creationdate字段。你通过在更新上添加一个不允许更新该字段的触发器来修复“希望没有人修改它”的部分。


4
2017-11-16 21:25





不,据我所知,甚至不在系统表中。您可以通过旧的事务日志挖掘我确定,但本机上,没有。


1
2017-11-16 21:18





我曾经遇到过一种情况,即需要表的行顺序,但没有时间戳(CreateDateTime,UpdateDateTime,...等)列可用。因此,只有我拥有的数据才是事务日志。直接读取事务日志没有用,因为它不容易解析。因此,我发现了一个名为“ApexSQL Log”的程序非常有用。它具有所有过滤选项,您可以在不进行核心操作的情况下读取所有日志数据。虽然这个解决方案对我来说是令人满意的,但它有一个缺点:您只能根据事务操作过滤日期(开始时间和结束时间)。如果您正在搜索查询操作,例如封装在事务中的插入操作,则无法检索确切的插入时间(至少我找不到方法),只能检索事务时间。如果您的操作都是原子操作,那么您可以直接获得所有行创建日期信息。


0
2017-10-05 10:11





如果他只想通过它订购,你可以考虑使用 时间戳 柱。

它与现实世界日期无关,但您可以对其进行排序。


-4
2017-11-16 21:21



但是,如果他们想用这种方法比较不同的表格,他可能会遇到问题。 - JNK
只要OP知道所有的好处和风险,就没什么大不了的。 :) - JNK
啊哈!我只是觉得我在这个答案中弄错了,但现在我觉得我没有。该睡觉了。无论如何,如果它没用就修改它;) - thomaspaulb
timestamp 字段会在每次更新到行时自动更新。这打破了他的“并确保它不会改变”功能非常彻底。 - Donnie
是的,你是对的,它不是创造印章,而是修改印章。 - thomaspaulb