منذ فترة وعند استخدامي لقواعد بيانات MicroSoft SQL Server واجهتني مشكلة تكررت معي كثيراً، وهي أن قيم أعمدة الترقيم التلقائي (identity column) في الجداول تقفز أحياناً بمقدار 1000 رقم أو 10000 رقم بشكل مفاجيء، وتعتمد قيمة القفزة على نوع بيانات العمود، فإذا كان نوع البيانات int سيقفز بمقدار 1000 رقم، أما إذا كان نوع البيانات bigint أو numeric سيقفز بمقدار 10000 رقم، وبالرغم من أن هذه القفزة لم تكن تسبب لي أي مشكلة برمجية، إلا أن الأمر أصبح مزعج وغير منطقي، خصوصاً أن قيم العمود يتم توليدها تلقائياً ولم أقم بإدراج أي قيمة، ولكن المشكلة الحقيقية كانت تواجهني عندما أقوم بعرض بيانات العمود على العميل، حيث أن العميل بعد فترة يتفاجئ بأن الرقم فقز من 52 إلى 1053 أو من 10089 إلى 20090 ويظن أن هناك مشكلة في النظام.

صورة توضح قفزة الترقيم

وعند البحث عن سبب هذه المشكلة، وجدت أنها تحدث فقط مع قواعد بيانات MS SQL Server من الإصدار 2012 وما فوق، حيث قامت شركة مايكروسوفت بإضافة ميزة جديدة لهذه الإصدارات وهي (identity cashe) أو ما يعرف بذاكرة التخزين المؤقت للأعمدة ذات الترقيم التلقائي (identity_column)، تعمل هذه الميزة عندما تقوم باستخدام خاصية الترقيم التلقائي لأحد الأعمدة حيث تقوم إفتراضياً بتخزين 1000 رقم أو 10000 رقم وذلك حسب نوع البيانات في هذه الذاكرة، ويتم استخدام هذه الأرقام عند كل عملية إدخال بيانات للجدول.

وتحدث هذه المشكلة عندما يتم إعادة تشغيل الخادم أو عندما يحدث توقف مفاجيء لقاعدة البيانات، حيث أنه سيتم فقدان جميع القيم المخزنة في الذاكرة المؤقتة والتي لازالت لم تستخدم أثناء عمليات إدخال البيانات للجدول، وسيتم تخزين 1000 رقم أو 10000 رقم من جديد في الذاكرة المؤقتة.

ولتجنب المشاكل المتعلقة بهذه الخاصية وإيقاف هذه القفزة، يمكنك تطبيق إحدى هذه الطرق الثلاث:

تعطيل خاصية identity cashe على مستوى قاعدة بيانات محددة:

هذه الطريقة تعتمد على إيقاف ميزة التخزين المؤقت للترقيم التلقائي لقاعدة بيانات محددة وليس جميع قواعد البيانات الموجودة على الخادم Server، ويتم ذلك بتنفيذ الجملة التالية:


USE DatabaseName
GO
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
GO

تعطيل خاصية identity cashe على مستوى خادم قواعد البيانات:

إعتمادًاعلى هذه الطريقة فإنك تقوم بتعطيل الخاصية على جميع قواعد البيانات المتواجدة على الخادم ويتم ذلك عن طريق الخطوات التالية:

  1. من خلال قائمة إبدأ قم بتشغيل SQL Server Configuration Manager
  2. قم بالنقر بزر الفأرة الأيمن على SQL Server Services وقم باختيار Properties
  3. الآن من خلال النافذة المنبثقة قم بالتوجه إلى التبويب Startup Parameters
  4. قم بكتابة -T272 ومن ثم قم بالنقر على إضافة Add
  5. أخيرًا قم بإعادة تشغيل خادم قواعد البيانات.

استخدام الـ Sequence

هذه الطريقة تعتمد على استخدام الـ sequence لتوليد أرقام متسلسلة تلقائياً ويمكن تنفيذ هذه الطريقة على النحو التالي:

أولا: نقوم بإنشاء الـ Sqquence

CREATE SEQUENCE Sequence_name
AS BIGINT
START WITH 1
INCREMENT BY 1
MINVALUE 0
NO MAXVALUE
NO CACHE

ثانيا: نقوم باستخدام الـ Sequence مع جملة إدخال البيانات بالشكل التالي:

INSERT INTO Employees (EmployeeNo,[EmployeeName]) VALUES (NEXT VALUE FOR Sequence_name, 'القعقاع بن غزي')

هذه هي الطرق الثلاث التي تمكنك من تجنب هذه المشكلة المزعجة، واختيار الطريقة المناسبة تعتمد عليك وعلى كيفية بنائك لقاعدة البيانات، ولكن من الأفضل أن تكون على دراية بالفروقات بين الخاصية Identity والكائن Seqeunce المستخدمة في توليد ترقيم تسلسلي تلقائي حتى تختار الطريقة الصحيحة والمناسبة لك.