۱۳۸۸/۰۵/۱۳

مزيت‌هاي استفاده از رويه‌هاي ذخيره شده؛ واقعيت يا توهم؟!


متن زير يك سري نكات و يا شايد توهماتي را مطرح مي‌كند كه در مورد رويه‌هاي ذخيره شده در اس كيوال سرور رايج هستند.

1- رويه‌هاي ذخيره شده در مقابل SQL Injection مقاوم هستند. كوئري‌هاي Ad hoc هميشه اين آسيب پذيري را به همراه دارند.
نادرست است! رويه‌هاي ذخيره شده‌اي كه رشته‌ها را به صورت پارامتر دريافت كرده و آن‌ها را به صورت يك عبارت sql اجرا مي‌كنند، آسيب پذير هستند. اگر هنگام استفاده از كوئري‌هاي Ad hoc از پارامترها استفاده شود، در برابر حملات SQL Injection مصون خواهيد بود.

2- execution plan رويه‌هاي ذخيره شده كش مي‌شوند اما اين Plan براي كوئري‌هاي Ad hoc هر بار محاسبه و توليد مي‌گردد.
نادرست است! اس كيوال سرور تا اين اندازه بي هوش نيست! اگر execution plan ايي موجود باشد حتما استفاده خواهد شد و براي موتور اس كيوال سرور اصلا اهميتي ندارد كه كوئري در حال اجرا از يك رويه ذخيره شده صادر شده است يا از يك كوئري Ad hoc . رويه‌هاي ذخيره شده پيش كامپايل شده نيستند و مانند تمامي كوئري‌هاي ديگر در زمان اجرا كامپايل مي‌شوند.

3- زمانيكه از رويه ذخيره شده استفاده مي‌كنيد همه چيز را در يك مكان به صورت متمركز و مجتمع خواهيد داشت (مديريت بهتر)
نادرست است! در يك مكان متمركز در اختيار شما نيستند. برنامه جاي خود را دارد و رويه‌هاي ذخيره شده در ديتابيس در جاي ديگري قرار دارند و براي مثال اگر قرار باشد يك پارامتر را به رويه ذخيره شده خود اضافه كنيد، كدهاي شما نيز بايد تغيير كنند.

4- مي‌توان از يك رويه ذخيره شده استفاده مجدد كرد (در نقاط مختلف يك كد) و اعمال تغييرات تنها در يك مكان (ديتابيس) بايد صورت گيرد.
هر چند اين مورد درست است، اما بايد دقت داشت كه اگر چندين برنامه از اين رويه ذخيره شده استفاده مي‌كنند نبايد تغييرات شما باعث از كار افتادن ساير برنامه‌ها شوند.

5- مي‌توان رويه ذخيره شده را بدون نياز به توزيع مجدد برنامه تغيير داد.
اين مورد تا حدودي صحيح است. اگر تنها بحث بهينه سازي و امثال آن مطرح باشد صحيح است اما اگر واقعا نياز به تغيير يك كوئري در رويه ذخيره شده وجود داشته باشد به احتمال زياد برنامه نيز بايد دستخوش تغييراتي گردد تا اين دو با هم هماهنگ شوند.

نظر شما چيست؟