کاربرد Temporal Table یا جدول موقتی در SQL Server چیست؟

ویژگی Temporal Table از Sql 2016 اضافه شده که البته دقت داشته باشید که با Temporary Table اشتباه گرفته نشود. Temporal Table که به آن System Version table هم میگویند تاریخچه رکوردها را به صورت خودکار نگهداری میکند . در واقع قبل از هر عمل ویرایش و حذف که بر روی رکوردهای این نوع جدوال انجام شود یک رکورد در جدول تاریخچه ثبت می شود ، بنابراین تمامی تغییرات رکوردها در این جدول وجود دارد درحالیکه اگر در یک ستون در یک جدول معمولی مقدار 5 را به 10 تغییر دهیم فقط آخرین مقدار را داریم یعنی عدد 10 . ولی در جدوال Temporal مقدار قبلی (که در این مثال عدد 5 میباشد)را نیز داریم .

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

بنابراین با استفاده از Temporal Table

  • امکان بازگرداندن رکوردها : مثلا اگر سهوا رکوردی را حذف یا ویرایش کرده باشیم یا اگر برنامه ما خطایی داشته باشد که منجر به حذف و یا ویرایش رکوردها شود به راحتی میتوانیم رکورد را به حالت قبل بازگردانیم .
  • امکان بررسی تغییرات انجام شده در جدول به راحتی قابل دسترس است .
  • نیازی به کدنویسی و یا تنظیمات خیلی خاصی برای راه اندازی آن در SQL ندارید.

شرایط ایجاد Temporal Table

  1. جدول باید حتما دارای یک Primary Key باشد .
  2. دو ستون تاریخ شروع و پایان باید تعریف شود ( البته در صورت دلخواه میتوانید این دو ستون را با استفاده از hidden flag که در ادامه نیز توضیح خواهم داد پنهان نمائید )

در ادامه یک مثال عملی را با هم بررسی می نمایئم . در زیر یک جدول با 6 ستون ایجاد کرده ام . ستون C محاسباتی است و مقدار A*B را نگهداری میکند . همانطور که گفتم ایجاد یک Primary الزامی است برای همین ID را نیز تعریف کرده ام . ستون های StartTime , EndTime هم الزامی هستند و دقیقا باید به همین شکل تعریف شوند . به قسمتی که با کادر قرمز مشخص شده دقت کنید . این دستور تعیین کننده است که جدول Temporal تعریف شود

Temporal Table

جدول ایجاد شده به شکل زیر خواهد بود

وب سایت توسینسو

سه رکورد با مقادیر زیر در جدول درج میکنیم :

وب سایت توسینسو

. همانطور که میبنید تاریخ شروع و پایان به صورت خودکار درج میشود .حال اگر مقادیر جدول را ویرایش و حذف کنیم چه اتفاقی می افتد ؟ در کوئری زیر رکورد با شناسه 2 از جدول حذف و رکورد با شناسه 3 ویرایش شده است .

وب سایت توسینسو

پس از اجرای کوئری بالا ما انتظار داریم رکورد حذف شده و هم چنین مقدار قبلی رکورد با شناسه 3 را در جدول History داشته باشیم . اگر از جدول History دستور Select را اجرا کنیم دقیقا رکوردها به شکل زیر خواهد بود . شناسه 2 که حذف شده و شناسه 3 که مقدار A قبلی آن عدد 0 بوده است . همانطور که مشاهده می نمائید مقدار StartTime با مقدار StartTime جدول اصلی و مقدار EndTime با زمان جاری سرور (در زمان ویرایش و یا حذف ) پر شده اند .

وب سایت توسینسو

محدودیت ها

  • ستون های تاریخ شروع و پایان را به صورتی دستی نمی توانید مقدار دهی کنید ( به صورت خودکار مقدار میگیرند)
  • دیتای موجود در جدول History قایل تغییر نمیباشد .
  • جدول History شامل هیچ Constraint ای نمی تواند باشد .

دقت داشته باشید برای حذف این جدوال ابتدا باید دستور زیر را ایجاد کنید در غیر این صورت در هنگام حذف جدول با خطا مواجه میشوید .

ALTER TABLE dbo.Test SET (SYSTEM_VERSIONING = OFF);

برای مخفی کردن ستون های تاریخ در جدول اصلی میتوانید از Hidden استفاده نمایئد.

وب سایت توسینسو

نظرات