۱۳۸۷/۰۹/۳۰

به روز رساني View ها و رويه‌هاي ذخيره شده در SQL server


يكي ديگر از معايب كوئري‌هاي select * در SQL server اين است كه تغييرات حاصل در فيلدهاي جداول يك بانك اطلاعاتي را در view هاي ساخته شده از اين نوع كوئري‌ها منعكس نمي‌كند.
براي مثال جدول tblTreeItems را با سه فيلد id ، parent و title در نظر بگيريد. فرض كنيد بر اين اساس view زير را ساخته‌ايم:

CREATE VIEW GetData
as
SELECT * FROM tblTreeItems

اكنون به جدول فوق ، فيلد جديد isActive را اضافه مي‌كنيم. پس از اين عمليات اگر كوئري ساده SELECT * FROM GetData را اجرا كنيم، فيلد جديد isActive را در آن نخواهيم ديد (برخلاف انتظار كه مي‌بايست كوئري select * ركوردهاي تمام فيلدهاي جدول را بر مي‌گرداند. در اين‌جا ممكن است مدتي وقت صرف ديباگ كردن سيستم شود كه چرا تغييرات جديد اعمال نشده و چرا سيستمي كه تا چند لحظه پيش داشت كار مي‌كرد الان از كار افتاد!).
بايد در نظر داشت كه هنگام ايجاد يك view ، تصويري از تمامي فيلدهاي مورد استفاده در آن زمان، جهت بالابردن كارآيي كوئري و عدم محاسبه مجدد فيلدها در جداول سيستمي ذخيره مي‌گردد ( * با نام فيلدهاي همان زمان ايجاد (نه زمان فعلي)، جايگزين خواهد شد). اين تصوير ايستا است و با تغيير فيلدهاي يك جدول به روز نخواهد شد.
براي به روز كردن view ها و stored procedures پس از تغييرات ساختاري در جداول، بايد مجددا آنها را كامپايل كرد. براي اين منظور راه‌هاي زيادي وجود دارد، براي مثال drop كردن يك view و ايجاد مجدد آن. يا باز كردن آن view در management studio (حالت alter query) و سپس فشردن دكمه F5 جهت اجراي مجدد كوئري كه اين‌بار بر اساس اطلاعات جديد به روز خواهد شد. يا استفاده از رويه‌هاي سيستمي sp_refreshview و sp_recompile كه براي كامپايل مجدد view ها و رويه‌هاي ذخيره شده بكار مي‌روند.

براي مديريت ساده‌تر اين موارد ، اسكريپت زير تمامي view ها و رويه‌هاي ذخيره شده يك ديتابيس را به صورت خودكار يافته و آنها را مجددا كامپايل مي‌كند: (جهت مشاهده آن نياز به ثبت نام دارد و رايگان است)
Refreshing Views and Recompiling Stored Procs