использование NEWSEQUENTIALID () с триггером UPDATE - PullRequest
4 голосов
/ 10 мая 2010

Я добавляю новый столбец GUID / Uniqueidentifier в мою таблицу.

ALTER TABLE table_name
ADD VersionNumber UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWSEQUENTIALID()
GO

И когда в таблице обновляется запись, я бы хотел обновить этот столбец "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

Но только что понял, что 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.

Есть ли обходной путь для этого?

Edit1: изменение NEWSEQUENTIALID() на NEWID() в триггере решает эту проблему, но я индексирую этот столбец и использование NEWID() было бы неоптимальным

1 Ответ

10 голосов
/ 10 мая 2010

Поскольку вы говорите, что он доступен только при определенных условиях, вы можете сделать что-то противное, например:

DECLARE @T TABLE (G UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID())
INSERT @T OUTPUT INSERTED.G VALUES (DEFAULT) 

Должно ли это быть GUID?если вы используете rowversion, вы получаете те же функциональные возможности без использования триггера, а также более высокую производительность индексации.

...