PDA

View Full Version : Stored Procedure



محسن بابائی
چهارشنبه 15 آذر 1385, 18:14 عصر
سلام بر دوستان.
یه آدم خیر پیدا بشه یه کمی درباره Stored procedure ها توضیح بده.
اگر توضیحتون یه کمی عملی باشه که چه بهتر

problem
چهارشنبه 15 آذر 1385, 21:46 عصر
Stored Procedureها کارشون این هست که به شما این امکان رو می‌دن که به‌جای این که مجبور باشید تمام کد SQL رو توی برنامه‌تون بذارید، این کد رو توی خود SQL Serverتون بذارید، و از توی پارامتر فقط SP رو صدا کنید. مثلاً به جای این که تو برنامه بنویسید:


INSERT INTO tblPeople(Name, Surname) VAlUES('ESM','FAMIL')

و در حال اجرای برنامه، این ESM و FAMIL رو با مقدار مناسب جایگزین کنید، کل دستور بالا رو در یک SP مثلاً به نام spAddNames ذخیره کنید، و از توی برنامه فقط اون رو با پارامترهاش صدا کنید:


EXECUTE spAddNames 'ESM','FAMIL'

خوب حالا در مثال بالا ممکنه شما جز کوتاه شدن دستور چیز زیادی حس نکنید، اما استفاده از SPها چند تا فایده داره:

۱) در برنامه‌های تیمی، مسئول برنامه‌نویسی DB روی SP‌ها کار می‌کنه، مسئول برنامه‌نویسی بقیه قسمت‌ها (مثلاً VB.Net) هم روی برنامهٔ خودش کار می‌کنه، بدون این که زبون هم‌دیگه رو بلد باشن!! فقط کافیه دومی یادبگیره که یک SP رو با پارامتراش صدا بزنه. این که توی اون SP چی می‌گذره، و همین‌طور بهینه‌سازی اون SP مربوط به نفر اول خواهد بود (که قطعاً به این کار آشنا تر هست.)

۲) خیلی وقت‌ها کاری که باید انجام بشه، به سادگی اجرای یک INSERT یا یک SELECT نیست. در چنین مواردی SP ها خیلی کمک می‌کنن. مثلاً برای یک پروژه، من یک SP نوشتم که خودش چندین table می‌ساخت، و indexهای لازم رو هم ایجاد می‌کرد و غیره. هربار که لازم بود تمام این کارا انجام بشه، فقط کافی بود برنامه خارجی من (که تحت وب بود) همین دستور رو صدا کنه!

۳) برای خیلی کارای پیشرفته در DB مثل ساختن یک account جدید که به DB Server دسترسی داشته باشه یا تغییر نحوه دسترسی اون به دیتابیس‌های مختلف اصلاً نیازی نیست که شما پای کامپیوتری که DB‌ روش نصبه بشینید! یک سری SP مخصوص این کارا وجود داره!! مثلاً sp_attach_db می‌تونه یک دیتابیس رو که فایلش رو جایی روی سرور مربوطه ذخیره کردین، به دیتابیس‌هاتون اضافه کنه. یا مثلاً sp_colmuns که اسم یک جدول رو می‌گیره، اسم ستون‌هاش رو بر می‌گردونه!

۴) افزایش سرعت! اولین باری که SP اجرا می‌شه خود SQL Server اون رو parse and optimize می‌کنه، و از اون به بعد، سرعت اجرای اون SP‌ از اجرا شدن دستوراتی که توشه به طور خام، بیشتر خواهد بود.

۵) امنیت!! شما می‌تونی که نگذاری که یک کاربر روی دیتابیس‌ات INSERT یا DELETE یا UPDATE‌ انجام بده!! اما در عین حال، بهش اجازه بدی فقط یک SP‌ خاص رو اجرا کنه، که این SP‌ یک INSERT دلخواه شما رو انجام می‌ده! این‌جوری هیچ وقت نگران نیستی که بقیه اطلاعات رو خراب کنه یا ....

ساختن یک SP هم با کمک خود زبان SQL به آسونی قابل انجامه. برای اطلاعات بیشتر CREATE PROCEDURE رو در گوگل یا MSDN‌ جستجو کن. اما یک مثال ساده‌اش می‌شه:


CREATE PROCEDURE au_info
@lastname varchar(40),
@firstname varchar(20)
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname = @firstname
AND au_lname = @lastname

که این مثال بالا دو تا پارامتر نام و نام‌خانوادگی رو می‌گیره، بعد جدولی از اطلاعات مربوط به نویسنده‌ای با اون نام، و کتاب‌هاش، بر می‌گردونه! برای کاربر نهایی صدا زدن این SP خیلی راحت‌تر از نوشتن اون همه دستور برای هر بار استفاده‌اس، نه؟!

problem
چهارشنبه 15 آذر 1385, 21:49 عصر
من مطالب بالا رو با نیم*نگاهی به این مطلب (http://msdn2.microsoft.com/en-us/library/ms190782.aspx) نوشتم. البته من ورژن onlineاش رو نخوندم، چون به صورت یک فایل روی کامپوترم دارمش. شاید شما هم داریش. اسمش هست: MS SQL Server Books Online
اگر نداری حتماً به رایگاه از Microsoft بگیرش که خیلی خوبه.

prince-of-persia
جمعه 01 دی 1385, 06:14 صبح
فکر میکنم که همه به اهمیت و کاربرد sp پی برده باشیم . با این حال آیا منطقی است که 100% عملیات روی داده ها را به sp و trigger ها بسپاریم.
مثلا اگر جایی در برنامه یک grid داریم که با برخی از فیلد های یک جدول پر می شود آیا منطقی است که یک sp برای این کار بسازیم.
منظورم اینه که انجام دادن این کار باعث ایجاد هزارن هزار sp در sql server می شود.
آیا این بد نیست؟
آیا راه بهتری هست؟

AminSobati
جمعه 01 دی 1385, 10:05 صبح
زمانی که پردازش شما نیاز به Query داره، بهتره این Query در SP باشه. هم برای SP و هم برای Trigger در داخل SQL Server فرایندهایی مثل Compile اتفاق میافته که Execution Plan تولید میکنه. این Plan قابلیت Reuse داره و از Compileهای اضافی جلوگیری میکنه

prince-of-persia
جمعه 01 دی 1385, 14:53 عصر
آیا کسی یک نمونه برنامه یا MDB ؟دارد هرچند کوچک اما اصولی