Verwendung NEWSEQUENTIALID () mit Aktualisierungstrigger
-
25-09-2019 - |
Frage
Ich füge eine neue GUID / Uniqueidentifier Spalte an meinen Tisch.
ALTER TABLE table_name
ADD VersionNumber UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWSEQUENTIALID()
GO
Und wann immer ein Datensatz in der Tabelle aktualisiert wird, würde ich diese Spalte „Version“ aktualisieren möchten. Also habe ich einen neuen Trigger erstellen
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
Aber gerade erkannt, dass NEWSEQUENTIALID () kann nur mit CREATE TABLE
oder ALTER TABLE
verwendet werden. Ich habe diesen Fehler
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.
Gibt es eine Abhilfe für dieses?
Edit1: Ändern NEWSEQUENTIALID()
zu NEWID()
im Trigger löst dieses Problem, aber ich bin der Indizierung dieser Spalte und NEWID()
Verwendung wäre suboptimal
Lösung
Wie Sie sagen, dass es nur unter bestimmten Bedingungen, können Sie etwas tun könnten böse wie:
DECLARE @T TABLE (G UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID())
INSERT @T OUTPUT INSERTED.G VALUES (DEFAULT)
Hat es eine GUID sein? wenn Sie ein verwenden rowversion
erhalten die gleiche Funktionalität ohne einen Trigger zu benötigen als auch eine bessere Indizierung Leistung.