الـ Identity في السيكوال سيرفر

25 أكتوبر 2016     470 مشاهدة    0 تعليق
تم النشر في #SQL Server 

كما هو من المعروف عند إنشاء أي حقل تلقائي و ذو قيمة تزايدية في السيكوال سيرفر, فاننا نقوم بضبط الخاصيه Identity إلى Yes.وبعدها عند إضافة أي سجل يتم توليد القيمة تلقائياً من قبل السيكوال سيرفر.

لكن الغريب الذي قد يبدو هو وجود الدوال التالية: @@IDENTITY, SCOPE_IDENTITY(), IDENT_CURRENT والتي جميعها تقوم بإرجاع قيمة الـ Identity لآخر سجل تم إضافته. السؤال ماهو الفرق الأساسي بين تلك الدوال والإجراءات؟!! هذا هو محور مقالة اليوم.

ببساطة ممكن اختصر الفرق كالتالي:

@@IDENTITY

تقوم بإرجاع آخر قيمة تم إنشاءها للـ Identity في نفس الجلسة بغض النظر عن النطاق الذي انشأ القيمة.

SCOPE_IDENTITY()

تقوم بإرجاع آخر قيمة تم إنشاءها للـ Identity في نفس الجلسة ونفس النطاق.

IDENT_CURRENT("TableName")

تقوم بإرجاع آخر قيمة تم إنشاءها للـ Identity في جدول معين, بغض النظر عن الجلسة أو النطاق الذي انشأ القيمة.

قد يتسأل البعض ماهي الجلسة؟!! وماهو النطاق؟!!
الجلسة ببساطة الإتصال الحالي لقاعدة البيانات, أما النطاق هو الإستعلام الحالي أو الإجراء المخزن الحالي.

وقد يبدو للبعض أن الـ @@IDENTITY والـ SCOPE_IDENTITY() شبيهان لنوع ما, إلا أن هناك حالات تبين إختلافهما, فلنفترض وجود Trigger في الجدول. فإذا تم إضافة سجل جديد عبر إستعلام معين, هذا سيجعل الـ Trigger يقوم بإضافة سجل آخر في مكان معين (قد يكون جدول آخر), لذا فإن الـ SCOPE_IDENTITY() سوف ترجع قيمة الـ Identity التي تم إنشاءها في الإستعلام بينما الـ @@IDENTITY ستقوم بإرجاع قيمة الـ Identity التي تم إنشاءها من قبل الـ Trigger.

لتجنب المشاكل الناتجة عن إضافة الـ Trigger ينصح دائماً بإستخدام الـ SCOPE_IDENTITY() لإرجاع الـ Identity لآخر سجل تم إضافته.

للعلم أن هنالك داله آخرى إسمها IDENTITY() هذه لاتقوم بإرجاع آخر قيمة للـ Identity وإنما تقوم بإنشاء الـ Identity.

تويتر فيسبوك قوقل + لينكد إن


اكتب تعليقك