View: ذخیره کردن یک پرسوجو با یک نام
یادت هست در درس CTE، یک پرسوجوی پیچیده را با WITH نامگذاری کردیم تا خواناتر شود؟ مشکل CTE این است که فقط در همان یک پرسوجو معتبر است. View همان ایده را یک قدم جلوتر میبرد: پرسوجو را برای همیشه در پایگاهداده ذخیره میکند، طوری که هر بار بخواهی، فقط کافی است نامش را صدا بزنی — درست مثل یک جدول واقعی.
ساختار پایه
CREATE VIEW BookSales AS SELECT product, price FROM sales WHERE category = N'کتاب';
از این به بعد، بهجای تکرار این JOIN/WHERE در همهجا، کافی است بنویسی:
SELECT * FROM BookSales WHERE price > 100000;
بیا این را بسازیم و ازش استفاده کنیم:
BookSales — که خودش نتیجهی یک پرسوجو است — دوباره WHERE بگذاریم، دقیقاً مثل یک جدول واقعی. این قدرت اصلی View است: میتوان رویش پرسوجو زد، فیلتر کرد، حتی JOIN داد.View در برابر جدول واقعی
| جدول | View | |
|---|---|---|
| داده را ذخیره میکند؟ | بله | خیر — فقط تعریف پرسوجو را نگه میدارد؛ هر بار اجرا میشود |
| همیشه بهروز است؟ | — | بله، چون هر بار مستقیم از جدول اصلی میخواند |
| کاربرد اصلی | نگهداری داده | سادهسازی، امنیت (محدودکردن ستونهای در دسترس)، خوانایی |
یک کاربرد مهم: پنهانکردن ستونهای حساس
View میتواند برای کنترل دسترسی هم استفاده شود — مثلاً بهجای دادن دسترسی کامل جدول کارمندان، فقط یک View بدون ستون حقوق در اختیار بگذاری:
CREATE VIEW PublicEmployeeInfo AS SELECT id, full_name FROM employees; -- کاربرانی که فقط به این View دسترسی دارند، اصلاً نمیتوانند ستون حقوق را ببینند
حذف یک View
DROP VIEW BookSales;
تغییر یک View
برای تغییر تعریف View از ALTER VIEW استفاده کن (مجوزهای قبلی حفظ میشود، برخلاف حذف و ساخت دوباره):
ALTER VIEW BookSales AS SELECT product, price, category FROM sales WHERE category = N'کتاب';
WITH CHECK OPTION: جلوگیری از ردیفهای ناسازگار
اگر روی یک View با WHERE تغییر داده انجام شود، ممکن است ردیفی درج شود که خودش در View دیده نمیشود. WITH CHECK OPTION این را ممنوع میکند:
CREATE VIEW ActiveCustomers AS SELECT CustomerId, FullName, IsActive FROM Customers WHERE IsActive = 1 WITH CHECK OPTION; -- INSERT/UPDATE ای که ردیف را از View خارج کند، خطا میدهد
محدودیتها و نکتهها
- داخل View نمیتوان
ORDER BYگذاشت مگر همراهTOP؛ مرتبسازی را در پرسوجوی نهایی بنویس. - View پارامتر نمیگیرد؛ اگر پارامتر لازم داری، Inline Table-Valued Function یا Stored Procedure مناسبتر است.
- با
WITH SCHEMABINDINGمیتوان جلوی تغییر جدولهای پایهی View را گرفت تا View خراب نشود. - Indexed View نوعی View است که نتیجهاش فیزیکی ذخیره و ایندکس میشود؛ برای گزارشهای تجمیعی سنگین مفید است اما شرایط سختگیرانه دارد.
- View تودرتوی زیاد، عیبیابی کارایی را سخت میکند.
جمعبندی این درس
- View یک پرسوجوی ذخیرهشده با یک نام است؛ خودش دادهای نگه نمیدارد.
- میتوان مثل یک جدول واقعی رویش
SELECT،WHEREوJOINزد. - کاربرد رایج: سادهسازی پرسوجوهای تکراری، و محدودکردن ستونهای در دسترس برای کنترل امنیتی.
در درس بعدی سراغ Stored Procedures میرویم — قدمی فراتر از View، جایی که SQL Server واقعاً شروع میکند به رفتار مثل یک زبان برنامهنویسی.
تمرینهای خودآزمایی
اول خودت جواب بده، بعد پاسخ را باز کن و مقایسه کن.
۱View چیست؟نمایش پاسخ
یک پرسوجوی ذخیرهشده با نام که مثل جدول مجازی استفاده میشود و (بهجز Indexed View) دادهی جداگانه ذخیره نمیکند.
۲دو مزیت استفاده از View را بگو.نمایش پاسخ
سادگی (پنهانکردن JOINهای پیچیده) و امنیت (نمایش فقط ستونها یا ردیفهای مجاز به کاربر).