我的SQL Server数据库中有一个名为tblReportDataQueue的“更改历史记录”表,它记录了对其他源表中行的更改。
DB中的源表上有触发器,它们在INSERT,UPDATE或DELETE之后触发。触发器都调用一个存储过程,该存储过程只是将数据插入到具有标识列的更改历史记录表中:
INSERT INTO tblReportDataQueue
(
[SourceObjectTypeID],
[ActionID],
[ObjectXML],
[DateAdded],
[RowsInXML]
)
VALUES
(
@SourceObjectTypeID,
@ActionID,
@ObjectXML,
GetDate(),
@RowsInXML
)
当源表中的行快速连续多次更新时,触发器将按正确的顺序触发,并按更改顺序将更改的数据放入更改历史记录表中。 问题在于我假设DateAdded字段总是与身份字段的顺序相同但不知道它不是。
因此,我的表按照按标识字段排序时实际发生的事件的顺序,但在按“DateAdded”字段排序时则不然。
这怎么可能发生?
在示例图像中,显示的最后一行的“DateAdded”早于显示的第一行。
答案 0 :(得分:1)
您正在使用代理键。代理键的一个非常重要的特征是它不能用于确定它所代表的元组的任何信息,甚至不能用于创建的顺序。所有具有此类自动生成值的系统(包括Oracles序列)都不保证订购,只是生成的下一个值与先前生成的值不同。这就是所需要的,真的。
当然,我们都这样做。我们查看ID为2的行,并假设它在ID为1的行之后和ID为3的行之前插入。这是一个坏习惯,我们都应该努力打破,因为假设可能是错误的。< / p>
您有DateAdded字段以提供所需的信息。按该字段排序,您将按插入顺序获取行(如果该字段不可更新,即)。自动生成的值趋势遵循该顺序,但绝对不依赖于此!
答案 1 :(得分:0)
"Using the identity attribute for a column, you can easily generate auto-
incrementing numbers (which as often used as a primary key). With Sequence, it
will be a different object which you can attach to a table column while
inserting. Unlike identity, the next number for the column value will be
retrieved from memory rather than from the disk – this makes Sequence
significantly faster than Identity.
Unlike identity column values, which are generated when rows are inserted, an
application can obtain the next sequence number before inserting the row by
calling the NEXT VALUE FOR function. The sequence number is allocated when NEXT
VALUE FOR is called even if the number is never inserted into a table. The NEXT
VALUE FOR function can be used as the default value for a column in a table
definition. Use sp_sequence_get_range to get a range of multiple sequence
numbers at once."