使用带有UPDATE触发器的NEWSEQUENTIALID()

ram*_*ram 4 sql-server triggers guid sql-server-2008 newsequentialid

我在我的表中添加了一个新的GUID/Uniqueidentifier列.

ALTER TABLE table_name
ADD VersionNumber UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWSEQUENTIALID()
GO
Run Code Online (Sandbox Code Playgroud)

当表中更新记录时,我想更新此列"VersionNumber".所以我创建了一个新的触发器

CREATE TRIGGER [DBO].[TR_TABLE_NAMWE]
ON [DBO].[TABLE_NAME]
AFTER UPDATE
AS 
BEGIN 
    UPDATE TABLE_NAME
    SET VERSIONNUMBER=NEWSEQUENTIALID()
    FROM TABLE_NAME D
    JOIN INSERTED I ON D.ID=I.ID/* some ID which is used to join*/
END
GO
Run Code Online (Sandbox Code Playgroud)

但只是意识到NEWSEQUENTIALID()只能与CREATE TABLE或一起使用ALTER TABLE.我收到了这个错误

The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
Run Code Online (Sandbox Code Playgroud)

这有解决方法吗?

编辑1:在触发器中更改NEWSEQUENTIALID()NEWID()解决此问题,但我正在索引此列并使用NEWID()将是次优的

Ale*_* K. 10

正如你所说,它只在某些条件下可用,你可以做一些令人讨厌的事情:

DECLARE @T TABLE (G UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID())
INSERT @T OUTPUT INSERTED.G VALUES (DEFAULT) 
Run Code Online (Sandbox Code Playgroud)

它必须是GUID吗?如果你使用a,rowversion你可以获得相同的功能而不需要触发器以及更好的索引性能.

  • 微软8年来没有触及这个问题; 这很麻烦.每当您尝试修改newsequentialid()作为其默认值的表时,SSMS 2012仍会抛出有关验证列的错误.这些涉及创建临时表以获得唯一ID的变通方法是不可接受的,尽管这可能是目前为止最好的解决方法. (2认同)