سؤال

أقوم بإضافة عمود جديد لـ GUID/FreefianceIdentifier إلى الجدول الخاص بي.

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() سيكون دون المستوى الأمثل

هل كانت مفيدة؟

المحلول

كما تقول إنه متوفر فقط في ظل ظروف معينة ، يمكنك أن تفعل شيئًا سيئًا مثل:

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

هل يجب أن يكون GUID؟ إذا كنت تستخدم أ rowversion يمكنك الحصول على نفس الوظيفة دون الحاجة إلى الزناد وكذلك أداء الفهرسة الأفضل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top