usando NEWSEQUENTIALID () con la actualización de disparo
-
25-09-2019 - |
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
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.