2010-05-10 4 views
3

J'ajoute une nouvelle colonne GUID/Uniqueidentifier à ma table.en utilisant NEWSEQUENTIALID() avec UPDATE Trigger

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

Et quand jamais un enregistrement est mis à jour dans la table, je voudrais mettre à jour cette colonne "VersionNumber". Je crée donc un nouveau déclencheur

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 

Mais réalisé que NEWSEQUENTIALID() ne peut être utilisé avec ou CREATE TABLEALTER TABLE. J'ai eu cette erreur

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. 

Y at-il une solution de contournement pour cela?

Edit1: Changement NEWSEQUENTIALID()-NEWID() dans la gâchette permet de résoudre, mais j'indexation cette colonne et en utilisant NEWID() serait sous-optimale

Répondre

9

Comme vous le dites son seul disponible sous certaines conditions, vous pourriez faire quelque chose de méchant comme :

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

Est-ce que ce doit être un GUID? Si vous utilisez un rowversion, vous obtenez la même fonctionnalité sans avoir besoin d'un déclencheur et de meilleures performances d'indexation.

+0

+1 pour rowversion (alias timestamp) :) – Nate

+1

+1 c'est malheureux, en effet - mais 'NewSequentialId()' est seulement disponible en tant que valeur DEFAULT pour une colonne - semble être la même chose en 2008 R2, aussi: - ( –

+2

Microsoft n'a pas touché à ce problème depuis 8 ans, il est abismal.SMS 2012 lance toujours des erreurs sur la validation de la colonne chaque fois que vous essayez de modifier une table qui a newsequentialid() par défaut. un identifiant unique est inacceptable, bien que ce soit probablement la meilleure solution de contournement jusqu'à présent. – Triynko

Questions connexes