چرا ویرایش فیلد در جدول SQL Server خطرناک است
آیا ویرایش فیلد های جدول های پایگاه داده SQL Server می تواند خطرناک باشد؟
قبل از آن هم نیاز داریم که Log های تغییرات ویرایش ساختار این جدول را ردیابی کنیم. برای ردیابی از دستور DDL_DATABASE_LEVEL_EVENTS استفاده خواهیم کرد. برای استفاده از DDL_DATABASE_LEVEL_EVENTS با تریگر در SQL Server، ابتدا نیاز داریم یک تریگر DDL در سطح پایگاه داده ایجاد کنیم که به رخدادهای خاصی در سطح پایگاه داده (DDL) گوش دهد. این تریگر به شما این امکان را میدهد که به رویدادهایی مثل ایجاد، تغییر، و حذف اشیاء پایگاه داده واکنش نشان دهید. به عنوان مثال، فرض کنید میخواهیم از DDL_DATABASE_LEVEL_EVENTS استفاده کنیم تا زمانی که هر تغییری روی اشیاء پایگاه داده (مثل جداول، نماها، توابع و ...) ایجاد شد، آن را در یک جدول لاگ ذخیره کنیم.
به عنوان مثال، فرض کنید میخواهیم از DDL_DATABASE_LEVEL_EVENTS استفاده کنیم تا زمانی که هر تغییری روی اشیاء پایگاه داده (مثل جداول، نماها، توابع و ...) ایجاد شد، آن را در یک جدول لاگ ذخیره کنیم.
1. ایجاد جدول لاگ برای ذخیره رویدادها
ابتدا یک جدول لاگ برای ثبت جزئیات رویدادهای DDL ایجاد کنید:
در این مرحله، تریگر DDL را برای گوش دادن به تغییرات در سطح پایگاه داده ایجاد میکنیم. این تریگر از رویدادهای DDL_DATABASE_LEVEL_EVENTS استفاده میکند و اطلاعات رویداد را در جدول لاگ ذخیره میکند.
توضیح تریگر
- در این تریگر، از
EVENTDATA()
برای دریافت جزئیات رویداد استفاده میشود.
- این اطلاعات شامل نوع رویداد (EventType)، نام شیء (ObjectName) و نوع شیء (ObjectType) است.
- سپس اطلاعات رویداد در جدول
DDL_Log
ثبت میشود.
تست تریگر
برای تست، میتوانید یک جدول جدید ایجاد کرده و مشاهده کنید که آیا اطلاعات مربوط به این تغییر در جدول DDL_Log
ذخیره میشود یا خیر:
سپس میتوانید با اجرای دستور زیر، لاگ ثبت شده را بررسی کنید:
با این تنظیمات، هر تغییری که روی اشیاء پایگاه داده ایجاد شود، در جدول DDL_Log
ثبت میشود و شما میتوانید رویدادهای مختلف را نظارت کنید.
حالا میرویم سر اصل مطلب یعنی جدول Students و یکی از فیلد های آن را ویرایش می کنیم. ابتدا ساختار جدول به شرح ذیل است:
این کامنتها توضیحات جامعی دربارهٔ هر قسمت از کد ایجاد جدول و مقادیر پیشفرض ارائه میدهند. بعد از ایجاد در ابتدا Select روی جدول Log مزنیم.
نمایش محتویات جدول DDL_LOG قبل از انجام عمل ویرایش روی جدول ها
عمل ویرایش را انجام می دهیم و یک فیلد جدید هم ایجاد می کنیم تا ببینیم چند عملیات در جدول log ذخیره خواهد شد:
سپس با دستور Select نتیجه ثبت Log پس از ویرایش را مشاهده می کنیم.
EventType
|
ObjectName
|
ObjectType
|
EventTime
|
ALTER_TABLE
|
Students
|
TABLE
|
2024-10-31 11:01:34.177
|
ALTER_TABLE
|
Students
|
TABLE
|
2024-10-31 11:01:34.177
|
ALTER_TABLE
|
Students
|
TABLE
|
2024-10-31 11:01:57.260
|
CREATE_TABLE
|
Tmp_Students
|
TABLE
|
2024-10-31 11:01:57.260
|
ALTER_TABLE
|
Tmp_Students
|
TABLE
|
2024-10-31 11:01:57.263
|
ALTER_TABLE
|
Tmp_Students
|
TABLE
|
2024-10-31 11:01:57.267
|
DROP_TABLE
|
Students
|
TABLE
|
2024-10-31 11:01:57.283
|
RENAME
|
Tmp_Students
|
TABLE
|
2024-10-31 11:01:57.470
|
ALTER_TABLE
|
Students
|
TABLE
|
2024-10-31 11:01:57.480
|
همانگونه که مشاهده می کنید تعداد 9 رکورد یا عملیات در پس زمینه در هنگام ویرایش جدول ثبت شده است. طبق مستندات مایکروسافت با اینکه امروزه SQL Server بیشتر این موارد را به شدت مدیریت می کند ولی باز هم ممکن است در تعداد رکورد های بالا و یا در Server هایی که بار زیادی بر SQL Server وارد می شود در هنگام ایجاد و یا تغییر نام جدول های Temp موتور پایگاه داده به درستی عمل نکند و ارورهای ناخواسته موجب از بین رفتن بخش عظیمی از دیتا شود. پس قبل از هر چیز بک آپ فراموش نشود.