Galawij
یک شنبه 11 دی 1390, 20:57 عصر
سلام،
چندی پیش در این تاپیک (http://barnamenevis.org/showthread.php?308703-%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA-%D8%AF%D8%B1%D8%AC-%D8%B1%D9%88%DB%8C-n-%D8%AC%D8%AF%D9%88%D9%84-%D8%A8%D8%A7%D9%86%DA%A9-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA%DB%8C) سوالی را مطرح کردم که با راهنمایی مهندس صادقیان (http://barnamenevis.org/member.php?4504-%D8%AD%D9%85%DB%8C%D8%AF%D8%B1%D8%B6%D8%A7%D8%B5%D 8%A7%D8%AF%D9%82%DB%8C%D8%A7%D9%86) به نتیجه رسیدم.
در این تاپیک قصد دارم توضیحاتی را در مورد این قابلیت که در SQL Server 2008 ارائه شده است، بدهم و در نهایت ابزاری را برای این کار معرفی می کنم که کار کردن با این قابلیت را بسیار راحت تر کرده و نیاز به دستورات T-SQL (اجرای روال های در نظر گرفته شده برای این منظور) را حذف می کند.
امیدوارم مورد توجه و استفاده دوستان و کاربران محترم قرار گیرد.
مقدمه:
در ورژن قبلی SQL Server (ورژن 2005) تریگرهای جدیدی با نام After Update و After Insert و After Delete اضافه شده بود، که به منظور رفع مشکل نگهداری تغییرات داده ای در بانک اطلاعاتی در نظر گرفته شده بود. راه حل بهتری که در ورژن 2008 معرفی شده، استفاده از CDC است. این ویژگی جدید روی جداولی که توسط کاربر ایجاد می شود، اعمال می شود.
پيادهسازي این قابلیت به صورت يك مؤلفه در هسته پايگاه داده رابطهاي انجام شده است. CDC براي جمعآوري تغييرات ايجاد شده در جدولها، فايل ثبت تراكنشهاي مرتبط با جدولها (Transaction log) را ميخواند. در صورت استفاده از SQL Server 2008، با استفاده از CDC ميتوان دادههاي تغييريافته را در پايگاهداده OLTP مرجع شناسايي كرد، بدون آنكه به پيادهسازي راهحلهايي با هزينه زياد، نظير استفاده از Stamp ،Flagها يا Triggerها و ساير راه حلهاي مبتني بر منطق صفر و يك براي شناسايي دادههاي تغييريافته، نيازي باشد.
این قابلیت بیشتر برای اهداف امنیتی استفاده می شود، به این صورت که در بانک اطلاعاتی و جداولی که این قابلیت برایش فعال شود، اجرای هر گونه دستورات DML روی آن جداول به صورت اتوماتیک در جداول سیستمی نگهداری می شود.
نکته: براي استفاده از CDC، بايد به يكي از نگارشهاي Enterprise ،Developer يا Evaluation از پايگاهداده SQL Server 2008 دسترسي داشته باشيد.
CDC چگونه کار می کند؟
وقتي كه يك جدول مرجع را فعال ميكنيد تا از CDC استفاده كند، به طور مؤثر عملكردي به نام Capture Instance را فعال كردهايد.
نکته: شما ميتوانيد به ازاي هر جدول مرجع حداكثر دو Capture Instance داشته باشيد.
فرآيند اصلي دريافت اطلاعات از طريق نمونههايي (Agentهايي) از jobهاي SQL Server انجام ميشود كه اين وظايف ساير روتينها را نيز براي پيادهسازي عملكرد درخواست شده فراخواني ميكنند. با شناسايي هر گونه تغيير در داده، به ازاي هر يك از جدولهايي كه امكان ذكر شده براي آنها فعال شده باشد، اين تغييرات در يك جدول مجزا و متناظر با آن جدول به نام Change Table ذخيره ميشوند. هنگامي كه دادههاي تغييريافته در اختيار يك پردازش مصرفكننده اين دادهها قرار گيرد معمولاً يك فرآيند از نوع (ETL) اتفاق افتاده است، اين پردازش ميتواند از طريق توابع توليد شده توسط خود سيستم به اين دادهها دسترسي داشته باشد كه دسترسي به دادهها يا از طريق تعيين شماره توالي ذخيره شده براي داده در جدول (log (LSN يا از طريق تعيين فاصله زماني مرتبط با دادهها، انجام ميشود. توابع توليد شده و مرتبط با CDC اين امكان را فراهم ميآورد كه به راحتي و از طريق ارسال درخواستهايي در قالب پرسوجو، بتوانيم به دادهها دسترسي داشته باشيم.
جدولهاي ثبت تغييرات چه زماني تخليه ميشوند؟
بايد توجه داشته باشيم كه اگر جدولهاي ثبت تغييرات هرگز خالي نشوند، ميتوانند به شدت رشد كرده و حجم زيادي را اشغال كنند. قابليت CDC به طور پيشفرض دادهها را بعد از سه روز پاك ميكند. همه جدولهاي ثبت تغييرات در حالت پيشفرض، از اين راهبرد تخليه اطلاعات پيروي ميكنند. برای تغییر دادن این راهبرد می توانید از SP هایی که در نظر گرفته شده است، استفاده کنید.
نکته: اگر شما از پایگاه داده با قابلیت CDC، یک Backup تهیه کنید و آن را بازگردانید، پایگاه داده بازگردانده شده به صورت پیش فرض از قابلیت CDC پشتیبانی نمی کند.
CDC به طور پيش فرض امكان شناسايي و انتشار تغييرات نوع DDL را روي پايگاه داده مرجع فراهم ميكند. البته CDC به طور پيشفرض تغييرات نوع DDL ايجاد شده روي پايگاه داده مرجع را براي جدولهاي ثبت تغييرات، ارسال نميكند. تنها استثنا براي اين قانون زماني است كه شما نوع داده يكي از ستونهاي جدول مرجع را تغيير دهيد كه در اين حالت در جدول ثبت تغييرات نيز به طور خودكار نوع ستون متناظر با ستون فوق نيز تغيير ميكند. مديريت تغييرات در ستونهاي حذف شده نيز به اين صورت است كه در جدول ثبت تغييرات، بعد از حذف ستون مرجع، در ستون متناظر با آن مقدار Null درج ميشود و به ازاي ستونهاي اضافه شده به جدول مرجع، اين ستونها در جدول ثبت تغييرات، ناديدهگرفته ميشوند. براي فعال كردن صحيح فرآيند انتشار تغييرات از نوع DDL، بايد Capture Instance دوم را نيز بعد از اعمال تغييرات DDL در جدول مرجع، فعال كرد. اين فرآيند با استفاده از يك شماي جدول جديد شروع به استخراج دادههاي تغيير يافته ميكند. بعد از اين مرحله بايد همه برنامههاي مصرف كننده از اين اطلاعات را به روزرساني كنيد تا از Capture Instance جديد استفاده كنند.
برکت باشد، برکت باشیم...
چندی پیش در این تاپیک (http://barnamenevis.org/showthread.php?308703-%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA-%D8%AF%D8%B1%D8%AC-%D8%B1%D9%88%DB%8C-n-%D8%AC%D8%AF%D9%88%D9%84-%D8%A8%D8%A7%D9%86%DA%A9-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA%DB%8C) سوالی را مطرح کردم که با راهنمایی مهندس صادقیان (http://barnamenevis.org/member.php?4504-%D8%AD%D9%85%DB%8C%D8%AF%D8%B1%D8%B6%D8%A7%D8%B5%D 8%A7%D8%AF%D9%82%DB%8C%D8%A7%D9%86) به نتیجه رسیدم.
در این تاپیک قصد دارم توضیحاتی را در مورد این قابلیت که در SQL Server 2008 ارائه شده است، بدهم و در نهایت ابزاری را برای این کار معرفی می کنم که کار کردن با این قابلیت را بسیار راحت تر کرده و نیاز به دستورات T-SQL (اجرای روال های در نظر گرفته شده برای این منظور) را حذف می کند.
امیدوارم مورد توجه و استفاده دوستان و کاربران محترم قرار گیرد.
مقدمه:
در ورژن قبلی SQL Server (ورژن 2005) تریگرهای جدیدی با نام After Update و After Insert و After Delete اضافه شده بود، که به منظور رفع مشکل نگهداری تغییرات داده ای در بانک اطلاعاتی در نظر گرفته شده بود. راه حل بهتری که در ورژن 2008 معرفی شده، استفاده از CDC است. این ویژگی جدید روی جداولی که توسط کاربر ایجاد می شود، اعمال می شود.
پيادهسازي این قابلیت به صورت يك مؤلفه در هسته پايگاه داده رابطهاي انجام شده است. CDC براي جمعآوري تغييرات ايجاد شده در جدولها، فايل ثبت تراكنشهاي مرتبط با جدولها (Transaction log) را ميخواند. در صورت استفاده از SQL Server 2008، با استفاده از CDC ميتوان دادههاي تغييريافته را در پايگاهداده OLTP مرجع شناسايي كرد، بدون آنكه به پيادهسازي راهحلهايي با هزينه زياد، نظير استفاده از Stamp ،Flagها يا Triggerها و ساير راه حلهاي مبتني بر منطق صفر و يك براي شناسايي دادههاي تغييريافته، نيازي باشد.
این قابلیت بیشتر برای اهداف امنیتی استفاده می شود، به این صورت که در بانک اطلاعاتی و جداولی که این قابلیت برایش فعال شود، اجرای هر گونه دستورات DML روی آن جداول به صورت اتوماتیک در جداول سیستمی نگهداری می شود.
نکته: براي استفاده از CDC، بايد به يكي از نگارشهاي Enterprise ،Developer يا Evaluation از پايگاهداده SQL Server 2008 دسترسي داشته باشيد.
CDC چگونه کار می کند؟
وقتي كه يك جدول مرجع را فعال ميكنيد تا از CDC استفاده كند، به طور مؤثر عملكردي به نام Capture Instance را فعال كردهايد.
نکته: شما ميتوانيد به ازاي هر جدول مرجع حداكثر دو Capture Instance داشته باشيد.
فرآيند اصلي دريافت اطلاعات از طريق نمونههايي (Agentهايي) از jobهاي SQL Server انجام ميشود كه اين وظايف ساير روتينها را نيز براي پيادهسازي عملكرد درخواست شده فراخواني ميكنند. با شناسايي هر گونه تغيير در داده، به ازاي هر يك از جدولهايي كه امكان ذكر شده براي آنها فعال شده باشد، اين تغييرات در يك جدول مجزا و متناظر با آن جدول به نام Change Table ذخيره ميشوند. هنگامي كه دادههاي تغييريافته در اختيار يك پردازش مصرفكننده اين دادهها قرار گيرد معمولاً يك فرآيند از نوع (ETL) اتفاق افتاده است، اين پردازش ميتواند از طريق توابع توليد شده توسط خود سيستم به اين دادهها دسترسي داشته باشد كه دسترسي به دادهها يا از طريق تعيين شماره توالي ذخيره شده براي داده در جدول (log (LSN يا از طريق تعيين فاصله زماني مرتبط با دادهها، انجام ميشود. توابع توليد شده و مرتبط با CDC اين امكان را فراهم ميآورد كه به راحتي و از طريق ارسال درخواستهايي در قالب پرسوجو، بتوانيم به دادهها دسترسي داشته باشيم.
جدولهاي ثبت تغييرات چه زماني تخليه ميشوند؟
بايد توجه داشته باشيم كه اگر جدولهاي ثبت تغييرات هرگز خالي نشوند، ميتوانند به شدت رشد كرده و حجم زيادي را اشغال كنند. قابليت CDC به طور پيشفرض دادهها را بعد از سه روز پاك ميكند. همه جدولهاي ثبت تغييرات در حالت پيشفرض، از اين راهبرد تخليه اطلاعات پيروي ميكنند. برای تغییر دادن این راهبرد می توانید از SP هایی که در نظر گرفته شده است، استفاده کنید.
نکته: اگر شما از پایگاه داده با قابلیت CDC، یک Backup تهیه کنید و آن را بازگردانید، پایگاه داده بازگردانده شده به صورت پیش فرض از قابلیت CDC پشتیبانی نمی کند.
CDC به طور پيش فرض امكان شناسايي و انتشار تغييرات نوع DDL را روي پايگاه داده مرجع فراهم ميكند. البته CDC به طور پيشفرض تغييرات نوع DDL ايجاد شده روي پايگاه داده مرجع را براي جدولهاي ثبت تغييرات، ارسال نميكند. تنها استثنا براي اين قانون زماني است كه شما نوع داده يكي از ستونهاي جدول مرجع را تغيير دهيد كه در اين حالت در جدول ثبت تغييرات نيز به طور خودكار نوع ستون متناظر با ستون فوق نيز تغيير ميكند. مديريت تغييرات در ستونهاي حذف شده نيز به اين صورت است كه در جدول ثبت تغييرات، بعد از حذف ستون مرجع، در ستون متناظر با آن مقدار Null درج ميشود و به ازاي ستونهاي اضافه شده به جدول مرجع، اين ستونها در جدول ثبت تغييرات، ناديدهگرفته ميشوند. براي فعال كردن صحيح فرآيند انتشار تغييرات از نوع DDL، بايد Capture Instance دوم را نيز بعد از اعمال تغييرات DDL در جدول مرجع، فعال كرد. اين فرآيند با استفاده از يك شماي جدول جديد شروع به استخراج دادههاي تغيير يافته ميكند. بعد از اين مرحله بايد همه برنامههاي مصرف كننده از اين اطلاعات را به روزرساني كنيد تا از Capture Instance جديد استفاده كنند.
برکت باشد، برکت باشیم...