Pregunta

Estoy añadiendo una nueva columna de GUID / Uniqueidentifier a mi mesa.

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

Y cuando cada vez que un registro se actualiza en la tabla, me gustaría actualizar esta columna "VersionNumber". Así se crea un nuevo disparador

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

Pero se dio cuenta de que NEWSEQUENTIALID () sólo se puede utilizar con o CREATE TABLE ALTER TABLE. Tengo este error

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.

¿Hay una solución para esto?

Edit1: Cambiar NEWSEQUENTIALID() a NEWID() en el gatillo resuelve este, pero estoy indexación de esta columna y utilizando NEWID() sería subóptima

¿Fue útil?

Solución

Como bien dice su único disponible bajo ciertas condiciones, se podría hacer algo desagradable como:

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

¿Tiene que ser un GUID? si se utiliza una rowversion se obtiene la misma funcionalidad sin necesidad de un disparador como así como un mejor rendimiento de la indexación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top