2

如果您更改序列以使用与其当前值完全相同的值重新启动,则下一个值将是指定的值,而不是当前值加上增量。一切都很好,但是 SQL Server 引擎如何确定使用当前值而不是添加增量?我假设某处有一个标志来指示当前状态。

查看这一系列事件之前和之后的 sys.sequences 视图,我只观察到 ALTER SEQUENCE 语句之后对象 modify_date 和 start_value 列的变化。获取 NEXT VALUE 仅在从最初创建的序列或 ALTER SEQUENCE...RESTART 语句中选择第二个 NEXT VALUE 之后更改 current_value 列。

这是一个演示示例(modify_date 列仅显示为时间):

CREATE SEQUENCE abc START WITH 3 INCREMENT BY 2;

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:39:57.04      3             2           3

已创建序列,并且 current_value 列显示要在序列中使用的下一个值。

SELECT NEXT VALUE FOR abc;  -- 3
SELECT NEXT VALUE FOR abc;  -- 5
SELECT NEXT VALUE FOR abc;  -- 7
SELECT NEXT VALUE FOR abc;  -- 9

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:39:57.04      9             2           3

current_value 现在显示使用的最后一个值,即下一个值将是当前值加上增量。

ALTER SEQUENCE abc RESTART WITH 9;

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:40:17.42      9             2           9

所以日期和开始值已经改变,我猜某个地方已经设置了一些标志来指示这个序列现在需要从当前值开始。

SELECT NEXT VALUE FOR abc;  -- 9

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:40:17.42      9             2           9

在 sys.sequences 视图中没有观察到任何变化。

SELECT NEXT VALUE FOR abc;  -- 11

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:40:17.42      11            2           9

现在序列按预期继续,只有 current_value 在视图中发生变化。

那么有谁知道我的标志理论是否正确,如果正确,这个标志所在的位置(即它是否在可访问的系统视图中)。

4

1 回答 1

3

那么有谁知道我的标志理论是否正确,如果正确,这个标志所在的位置(即它是否在可访问的系统视图中)。

是的 - 看起来这可能是正确的。但不是在一个非常容易访问的系统视图中。

如果您通过 DAC 连接,您可以运行

SELECT value
FROM   sys.sysobjvalues
WHERE  objid = OBJECT_ID('abc');

这是在将序列增加 4 次后有机地达到 9 后的样子(并将数据库设置为脱机以确保将所有缓存的更改写入磁盘)。

0x030000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F090000000000000000

这是跑步后的样子ALTER SEQUENCE abc RESTART WITH 9;

0x090000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F090000000000000001

我想一开始(03to 09)的变化是因为START WITH现在已经改变了。最后一个字节有你寻找的标志。

但你为什么在乎?任何计算下一个值的尝试都将充满竞争条件和无法保证的行为。您应该在NEXT VALUE需要时打电话并接受它给您的东西。

于 2018-04-28T17:55:02.623 回答