Stored Procedure: بستهبندی منطق داخل پایگاهداده
Stored Procedure کاملاً مخصوص SQL Server (و موتورهای مشابه) است. SQLite هیچ مفهومی معادل آن ندارد — به همین دلیل، این درس بر خلاف بقیهی درسها، جعبهی «امتحانش کن» زنده ندارد؛ فقط کد واقعی SQL Server را میبینیم.یک رویهی ذخیرهشده (Stored Procedure) مجموعهای از دستورهای SQL است که با یک نام ذخیره میشود و میتوان با یک فراخوانی ساده، کل آن را اجرا کرد — دقیقاً مثل یک تابع در یک زبان برنامهنویسی معمولی، اما اینبار داخل خودِ پایگاهداده.
ساختار پایه
CREATE PROCEDURE GetStudentsByCity @City NVARCHAR(50) AS BEGIN SELECT full_name, grade FROM students WHERE city = @City; END;
و برای اجرا کردنش:
EXEC GetStudentsByCity @City = N'تهران';
@City یک پارامتر است — دقیقاً مثل پارامتر ورودی یک تابع؛ هر بار میتوان مقدار متفاوتی برایش فرستاد، بدون اینکه مجبور باشی خود پرسوجو را از نو بنویسی.
چرا اصلاً از Stored Procedure استفاده کنیم؟
- عملکرد: SQL Server نقشهی اجرای رویه را کش میکند؛ فراخوانیهای بعدی معمولاً سریعتر از فرستادن مکرر متن خام SQL هستند.
- امنیت: میتوان به کاربر فقط اجازهی اجرای رویه را داد، بدون دسترسی مستقیم به جدولهای زیرین — مشابه همان ایدهی امنیتی که در درس View دیدیم.
- یکجا نگهداشتن منطق: اگر چند اپلیکیشن مختلف (وب، موبایل) باید همان منطق پیچیده را اجرا کنند، نوشتنش یکبار در رویه، از تکرار در هر اپلیکیشن جلوگیری میکند.
پارامتر خروجی (OUTPUT)
رویهها میتوانند مقداری را هم به بیرون برگردانند:
CREATE PROCEDURE CountStudentsByCity @City NVARCHAR(50), @Total INT OUTPUT AS BEGIN SELECT @Total = COUNT(*) FROM students WHERE city = @City; END;
حذف یک رویه
DROP PROCEDURE GetStudentsByCity;
CREATE PROCEDURE، فقط با یک مقدار ثابت بهجای پارامتر) در Playground است — همان منطق، بدون بستهبندی. برای مثال، معادل اجرای GetStudentsByCity @City = 'تهران' در Playground، دقیقاً همان SELECT full_name, grade FROM students WHERE city = 'تهران'; است که در درس WHERE هم زدیم.جمعبندی این درس
- Stored Procedure مجموعهای از دستورهای SQL با یک نام است که با
EXECفراخوانی میشود. - پارامترها (
@Name) اجازه میدهند همان منطق با ورودیهای متفاوت اجرا شود. - مزایای اصلی: کارایی (کششدن نقشهی اجرا)، امنیت، و یکجا نگهداشتن منطق تکراری.
- این یک ویژگی کاملاً مخصوص SQL Server است؛ SQLite معادلی برایش ندارد.
در درس بعدی سراغ Functions میرویم — شبیه رویهها، اما با یک تفاوت مهم: همیشه یک مقدار برمیگردانند و میتوان مستقیم داخل یک SELECT صدایشان زد.
تمرینهای خودآزمایی
اول خودت جواب بده، بعد پاسخ را باز کن و مقایسه کن.
۱Procedureای بنویس که شهر را بگیرد و دانشآموزان آن شهر را برگرداند.نمایش پاسخ
CREATE PROCEDURE GetStudentsByCity @city NVARCHAR(50) AS BEGIN SELECT * FROM students WHERE city = @city; END; GO EXEC GetStudentsByCity @city = N'تهران';
۲Stored Procedure چطور به کاهش خطر SQL Injection کمک میکند؟نمایش پاسخ
پارامترها بهعنوان مقدار پاس داده میشوند، نه بخشی از متن دستور. البته اگر داخل Procedure رشتهی SQL را دستی الحاق کنی، این محافظت از بین میرود.