SQL SERVER 2008

تجارب من در رابطه با SQL SERVER

رهگیری تغییرات داده ای در SQL Server 2008
ساعت ٥:٥٩ ‎ب.ظ روز ۱۳۸۸/٢/٧  کلمات کلیدی: sql server 2008 ، تغییرات داده ای ، data capture ، t-sql

مکانیزم جدیدی در SQL Server 2008 وجود دارد که به شما این اجازه را میدهد تا تغییرات داده ای در یک جدول را پیگیری کنید. تغییرات از لاگ مربوط به تراکنشها توسط پروسس capture خوانده شده و در جداول تغییر ذخیره میشود. جداول تغییر ستونهای جدول منبع و همچنین اطلاعات حاوی metadata را که میتواند برای دریافتن تغییراتی که رخ داده استفاده شود را mirror میکند. آن تغییرات میتوانند در یک فرمت ارتباطی مناسب در TVF ها مصرف شوند.
پروسس transform  و load (ETL) در سرویسهای Integration در SQL Server که به روزرسانیهای نهایی را به انبار داده ها اعمال میکند تنها یک مثال از برنامه هایی است که از این خاصیت سود برده است.
در اینجا یک فرآیند ساده برای گرفتن تغییرات جدول Employee در پایگاه داده ای که testdb صدا زده میشود نشان خواهم داد.
قبل از اینکه بتوانید جداول را برای این خصوصیت فعال کنید، باید ابتدا این خاصیت را برای پ‍ایگاه داده توسط stored procedure با نام sys.sp_cdc_enable_db فعال کنید. این sp چندین آبجکت سیستمی مربوط به این کار را که شامل cdc schema و cdc user ، جداول، job ها، sp ها و توابع میشود را میسازد. برای اینکه چک کنید آیا این خصوصیت در پایگاه داده شما فعال است یا نه، query با نام is_cdc_enabled را روی sys.databases اجرا نمایید. کد زیر پایگاه داده testdb را ساخته و این خصوصیت را روی آن فعال میکند:


USE master;
IF DB_ID('testdb') IS NOT NULL DROP DATABASE testdb;
CREATE DATABASE testdb;
GO
USE testdb;
EXECUTE sys.sp_cdc_enable_db;


برای از کار انداختن رهگیری داده ای روی پایگاه داده، از sp با عنوان sys.sp_cdc_disable_db استفاده نمایید.
پردازش رهگیری به محض اینکه اولین جدول در پایگاه داده برای رهگیری توانا میشود، تغییرات را از log خوانده و آنها را در جداول تغییر ثبت میکند. برای راه انداختن رهگیری داده ای برای یک جدول از sp با نام sys.sp_cdc_enable_table استفاده کنید. توجه داشته باشید که برای جمع آوری تغییرات باید SQL Server Agent در حال اجرا باشد. کد زیر یک جدول با نامEmployees در testdb ساخته و یک سطر در آن وارد میشود :


CREATE TABLE dbo.Employees
(
  empid  INT         NOT NULL,
  name   VARCHAR(30) NOT NULL,
  salary MONEY       NOT NULL
);
INSERT INTO dbo.Employees(empid, name, salary) VALUES(1, 'Emp1', 1000.00);

کد زیر به جدول این توانایی را میدهد که تغییرات داده ای را رهگیری کند :


EXECUTE sys.sp_cdc_enable_table
    @source_schema = N'dbo'
  , @source_name = N'Employees'
  , @role_name = N'cdc_Admin';


چون این اولین جدولیست که در پایگاه داده برای این کار آماده شده است، این کد سبب میشود که پردازش مربوط به این کار شروع شود (دو job اجرا میشود : cdc.testdb_capture و cdc.testdb_cleanup).  آرگومان @role_name شما را قادر میکند تا یک database role تعیین کنید که دارای دسترسی برای تغییر داده خواهد بود. اگر role معین شده وجود نداشته باشد، SQL Server خود آن را خواهد ساخت. به صورت پیش فرض، تغییرات برای تمام ستونهای جدول جمع آوری میشود. برای جمع آوری تغببرات فقط برایزیرمجموعه ای از ستونها میتوانید لیست ستونها را در آرگومان @captured_column_list مشخص نمایید. برای گرفتن اطلاعات metadata درباره ستونهایی که نمونه جمع آوری به حساب آمده اند، میتوانید از procedure با نام sys.sp_cdc_get_captured_columns استفاده نمایید.
اگر بعدا خواستید که رهگیری تغییرات داده را غیرفعال نمایید از sys.sp_cdc_disable_table استفاده نمایید. و اگر میخواهید ببینید که آیا یک جدول برای این کار فعال شده است، روی view با نام sys.tables ستون is_tracked_by_cdc را جستجو کنید.
برای بدست آوردن اطلاعات درباره پیکربندی رهگیری تغییر داده برای هر جدول فعال شده، sp با نام sys.sp_cdc_help_change_data_capture را مانند زیر استفاده نمایید :


EXECUTE sys.sp_cdc_help_change_data_capture;


استفاده ازاین تغییرات به صورت مستقیم از جداول تغییرمیسر نیست بلکه باید از توابع table-valued استفاده نمایید. داده برای تغییراتی که درون یک محدوده مشخص شده از شماره سریالهای log (LSNs) قرار گرفته باشند درخواست شده است. SQL SERVER 2008 همچنین توابع نگاشت sys.fn_cdc_map_time_to_lsn و sys.fn_cdc_map_sln_to_time را مهیا کرده که به شما کمک میکند تا یک محدوده date-time را به محدوده ای از LSNs و بالعکس تبدیل کنید.
توابع مجزا تمامی تغییرات داخل یک ورودی (cdc.fn_cdc_get_all_changes_<capture_instance>) و تغییرات شبکه که در مقابل سطرهای مجزا جای گرفته اند (cdc.fn_cdc_get_net_changes_<capture_instance>) را مهیا میکنند، البته اگر که توسط sys.sp_cdc_enable_table فعال شده باشند.
SQL Server 2008 همچنین یک sp با نام sys.sp_cdc_get_ddl_history دارد که به شما تاریخچه تغییرات DDL پیوسته با یک نمونه خاص رهگیری را میدهد.