نماها یا Viewها در SQL Server در SQL Server؛ آموزش، مثال و نکات حرفه‌ای

آموزش کامل نماها یا Viewها در SQL Server در SQL Server

توسط admin | گروه SQL Server | 1405/04/27

نظرات 0

آموزش کامل نماها یا Viewها در SQL Server در SQL Server

معرفی و هدف مقاله

نماها یا Viewها در SQL Server از مباحث مهم طراحی و نگهداری سامانه‌های مبتنی بر Microsoft SQL Server است. این مقاله موضوع Views را از تعریف اولیه تا کاربرد حرفه‌ای، خطاهای رایج، رفتار با NULL، Unicode، Collation، Index و Execution Plan بررسی می‌کند.

View یک SELECT نام‌گذاری‌شده است که Query پیچیده یا ستون‌های مجاز را پشت یک رابط پایدار قرار می‌دهد و View معمولی داده مستقل ذخیره نمی‌کند. هدف فقط حفظ کردن Syntax نیست؛ باید بدانید دستور یا شیء مورد نظر در چه زمانی انتخاب درستی است، چه مجوزی می‌خواهد، چه وابستگی‌هایی دارد و چگونه نتیجه آن را کنترل می‌کنید.

همه مثال‌ها با نام Schema صریح نوشته شده‌اند. هرجا داده فارسی وارد می‌شود از نوع nvarchar و Literal دارای پیشوند N استفاده شده است. قبل از اجرای نمونه‌های مخرب، نام Server و Database، Backup و امکان Rollback را بررسی کنید.

ویژگیمقدارتوضیح
موضوعViewsنماها یا Viewها در SQL Server
دسته‌بندیمبانی Viewمخصوص Microsoft SQL Server
نسخهنسخه‌های متداول و پشتیبانی‌شده SQL Server؛ گزینه‌های پیشرفته وابسته به Version و Editionگزینه‌های خاص باید با نسخه موتور کنترل شوند
سطحمبتدی تا حرفه‌ایشامل Syntax، مثال، کارایی و امنیت
زمان مطالعه۱۵ تا ۲۰ دقیقهبا اجرای تمرین‌ها زمان بیشتری لازم است
پیش‌نیازآشنایی مقدماتی با T-SQLCREATE VIEW و ALTER روی Schema برای ایجاد، ALTER برای تغییر و SELECT برای مصرف لازم است.

تعریف، دسته‌بندی و نحوه عملکرد

View یک SELECT نام‌گذاری‌شده است که Query پیچیده یا ستون‌های مجاز را پشت یک رابط پایدار قرار می‌دهد و View معمولی داده مستقل ذخیره نمی‌کند. این قابلیت در دسته «مبانی View» قرار می‌گیرد و نتیجه آن از طریق Catalog Viewها، DMVها یا Queryهای کنترلی قابل مشاهده است.

در SQL Server بسیاری از دستورات DDL مقدار بازگشتی شبیه تابع Scalar ندارند. موفقیت باید با نبود خطا، مشاهده Metadata جدید، آزمون رفتار داده و کنترل مصرف‌کنندگان اثبات شود. در محیط حرفه‌ای این کنترل بخشی از Migration Script است.

Syntax اصلی

SELECT s.name AS SchemaName,
       v.name AS ViewName,
       v.is_schema_bound
FROM sys.views AS v
JOIN sys.schemas AS s ON s.schema_id = v.schema_id
ORDER BY s.name, v.name;

اجزای مهم Syntax

  • نام Schema را صریح بنویسید تا Default Schema کاربر نتیجه را تغییر ندهد.
  • برای نام شیء، Index و Constraint استاندارد ثابت و قابل جستجو انتخاب کنید.
  • گزینه‌های Online، Resumable، Cache، Cycle یا Cascade را فقط بعد از بررسی نسخه و ریسک فعال کنید.
  • در Dynamic SQL نام اشیا را فقط از Whitelist بگیرید و با QUOTENAME ایمن کنید.

نسخه‌های پشتیبانی‌شده و مجوزها

نسخه‌های متداول و پشتیبانی‌شده SQL Server؛ گزینه‌های پیشرفته وابسته به Version و Edition پیش از استقرار، نسخه دقیق موتور و Compatibility Level را بررسی کنید. ممکن است یک Syntax در SQL Server محلی، Azure SQL Database یا Managed Instance رفتار و محدودیت متفاوتی داشته باشد.

CREATE VIEW و ALTER روی Schema برای ایجاد، ALTER برای تغییر و SELECT برای مصرف لازم است. اعطای db_owner یا sysadmin برای حل سریع خطای مجوز روش مناسبی نیست. بهتر است Role اختصاصی بسازید و فقط Permission لازم را به حساب استقرار یا اپلیکیشن بدهید.

SELECT @@VERSION AS SqlServerVersion;
SELECT DB_NAME() AS DatabaseName,
       compatibility_level,
       collation_name
FROM sys.databases
WHERE database_id = DB_ID();

چه زمانی استفاده کنیم و چه زمانی استفاده نکنیم

زمان مناسب

Optimizer معمولاً تعریف View را Expand می‌کند و کارایی به جداول پایه و ایندکس‌های آن‌ها وابسته است. View پارامتر ندارد و ترتیب نتیجه بدون ORDER BY بیرونی تضمین نمی‌شود. زمانی از Views استفاده کنید که نیاز واقعی، وابستگی‌ها، حجم داده و پنجره نگهداری مشخص شده باشند و معیار موفقیت قابل اندازه‌گیری وجود داشته باشد.

زمان نامناسب

اگر هدف فقط پنهان کردن طراحی ضعیف، دور زدن Constraint، رفع موقت کندی یا حذف پیام خطا است، ابتدا علت ریشه‌ای را پیدا کنید. تغییر ساختار بدون تحلیل ممکن است مشکل را از یک Query به کل سامانه منتقل کند.

هر تغییر خوب باید قابل تکرار، قابل ممیزی، قابل بازگشت و در Source Control ثبت‌شده باشد.

مثال عملی اول

CREATE VIEW dbo.vwCustomerOrders
AS
SELECT c.CustomerID,
       c.FullName,
       o.OrderID,
       o.TotalAmount
FROM dbo.Customers AS c
JOIN dbo.Orders AS o ON o.CustomerID = c.CustomerID;

پس از اجرا فقط به پیام Commands completed successfully اکتفا نکنید. Metadata، تعداد ردیف، Constraint معتبر، تعریف View یا وضعیت Index را با Query مستقل کنترل کنید و نتیجه را با انتظار کسب‌وکار مقایسه نمایید.

مثال عملی دوم روی سناریوی واقعی

SELECT CustomerID, FullName, SUM(TotalAmount) AS TotalSales
FROM dbo.vwCustomerOrders
GROUP BY CustomerID, FullName
ORDER BY TotalSales DESC;

نام جدول، مسیر فایل، مقدارها و گزینه‌های این نمونه آموزشی هستند. در Production باید آن‌ها را با محیط واقعی جایگزین و اثر Lock، Transaction Log، tempdb، Replication و Availability Group را ارزیابی کنید.

نتیجه نمونه و روش کنترل

Optimizer معمولاً تعریف View را Expand می‌کند و کارایی به جداول پایه و ایندکس‌های آن‌ها وابسته است. View پارامتر ندارد و ترتیب نتیجه بدون ORDER BY بیرونی تضمین نمی‌شود. برای کنترل Views از Catalog View مرتبط استفاده کنید و علاوه بر ساختار، رفتار واقعی Insert، Update، Delete یا SELECT را آزمایش نمایید.

SELECT DB_NAME() AS CurrentDatabase,
       SUSER_SNAME() AS LoginName,
       ORIGINAL_LOGIN() AS OriginalLogin,
       SYSDATETIME() AS CheckedAt;

این Query محیط اجرا و حساب جاری را ثبت می‌کند. در Scriptهای حساس بهتر است خروجی کنترل قبل و بعد در جدول تاریخچه Deployment ذخیره شود تا بررسی رخدادها و Rollback قابل اعتماد باشد.

رفتار با NULL، انواع داده، Unicode و Collation

NULL

NULL با صفر یا رشته خالی یکسان نیست و باید با IS NULL یا IS NOT NULL بررسی شود. منطق سه‌ارزشی SQL Server باعث می‌شود نتیجه مقایسه با NULL همیشه مانند مقایسه مقدار معمولی نباشد؛ بنابراین از عبارت Column = NULL استفاده نکنید.

انواع داده

برای پول decimal، برای زمان datetime2 و برای متن فارسی nvarchar انتخاب مناسب‌تری است. نوع داده بزرگ‌تر از نیاز، اندازه ردیف و ایندکس، حافظه Grant و I/O را افزایش می‌دهد. نوع داده دو طرف Join و Predicate نیز باید سازگار باشد.

Unicode و Collation

برای متن فارسی از nvarchar یا nchar و Literal دارای N استفاده کنید. Collation حساسیت به حروف، اعراب و قواعد مرتب‌سازی را تعیین می‌کند. اختلاف Collation بین Databaseها ممکن است خطا یا Convert ضمنی ایجاد کند.

DECLARE @Title nvarchar(100) = N'آموزش SQL Server';
SELECT @Title AS PersianTitle,
       DATALENGTH(@Title) AS StorageBytes,
       SQL_VARIANT_PROPERTY(@Title, 'BaseType') AS BaseType;

Performance، Index و Execution Plan

Optimizer معمولاً تعریف View را Expand می‌کند و کارایی به جداول پایه و ایندکس‌های آن‌ها وابسته است. View پارامتر ندارد و ترتیب نتیجه بدون ORDER BY بیرونی تضمین نمی‌شود. اثر Views را با داده نزدیک به تولید بسنجید. مدت اجرا، CPU، Logical Reads، Writes، اندازه Log، Blocking و تعداد Recompile باید قبل و بعد ثبت شوند.

Seek همیشه بهتر از Scan نیست و هزینه درصدی Plan فقط تخمین نسبی است. Estimated Rows و Actual Rows، Sort، Hash Spill، Key Lookup، Implicit Conversion و Warningهای Plan را بررسی کنید. Query Store برای مقایسه Regression قبل و بعد از Deployment بسیار مفید است.

  • ایندکس‌های تکراری یا هم‌پوشان را قبل از ساخت ایندکس جدید بررسی کنید.
  • آمار معتبر و Predicate قابل جستجو برای انتخاب Plan مناسب ضروری‌اند.
  • عملیات حجیم را با فضای کافی Log و tempdb اجرا کنید.
  • در Availability Group تأخیر Replica ثانویه را مانیتور کنید.
SET STATISTICS IO, TIME ON;

SELECT TOP (100)
       object_id, name, type_desc
FROM sys.objects
ORDER BY object_id DESC;

SET STATISTICS IO, TIME OFF;

نکات امنیتی

CREATE VIEW و ALTER روی Schema برای ایجاد، ALTER برای تغییر و SELECT برای مصرف لازم است. مجوز DDL و مدیریت اشیا باید از حساب برنامه عادی جدا باشد. تغییرات حساس را با SQL Audit، Extended Events یا سامانه Change Management ثبت کنید.

نام شیء دریافت‌شده از کاربر را مستقیماً به Dynamic SQL متصل نکنید. Parameter فقط برای داده است و برای Identifier باید Whitelist و QUOTENAME استفاده شود. همچنین مالک Schema و Ownership Chain را بررسی کنید.

DECLARE @SchemaName sysname = N'dbo';
DECLARE @ObjectName sysname = N'Orders';

SELECT QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@ObjectName)
       AS SafeTwoPartName;

خطاهای رایج، محدودیت‌ها و Edge Caseها

Optimizer معمولاً تعریف View را Expand می‌کند و کارایی به جداول پایه و ایندکس‌های آن‌ها وابسته است. View پارامتر ندارد و ترتیب نتیجه بدون ORDER BY بیرونی تضمین نمی‌شود. خطاهای رایج شامل اجرای دستور در Database اشتباه، نداشتن Backup، نام‌گذاری متفاوت بین محیط‌ها، بی‌توجهی به اتصال‌های فعال و فرض خودکار بودن اصلاح وابستگی‌هاست.

  1. فراموش کردن USE یا نام دو و سه‌بخشی و تغییر شیء هم‌نام در Database دیگر.
  2. اجرای مستقیم روی جدول بزرگ بدون شبیه‌سازی زمان Sch-M Lock.
  3. نداشتن Script بازگشت و اتکا به ویرایش دستی در SSMS.
  4. نادیده گرفتن ORM، Report، Job، Trigger، View و Procedureهای وابسته.
  5. استفاده از NOCHECK یا Disable و بازنگرداندن Constraint یا Index به حالت معتبر.
  6. فرض اینکه Restart سرور یا خالی بودن DMV نشان‌دهنده بلااستفاده بودن شیء است.

Edge Case مهم اجرای همزمان دو Deployment است. جدول تاریخچه Migration، شماره نسخه یکتا و Application Lock می‌توانند از Race Condition جلوگیری کنند. همچنین Timeout ابزار استقرار به معنی Rollback کامل نیست و باید وضعیت Transaction و Metadata بررسی شود.

مقایسه با روش‌های مشابه

محوراین موضوعنکته تصمیم‌گیری
هدف اصلیView یک SELECT نام‌گذاری‌شده است که Query پیچیده یا ستون‌های مجاز را پشت یک رابط پایدار قرار می‌دهد و View معمولی داده مستقل ذخیره نمی‌کند.ابتدا نیاز کسب‌وکار و مرز تغییر مشخص شود
مزیتOptimizer معمولاً تعریف View را Expand می‌کند و کارایی به جداول پایه و ایندکس‌های آن‌ها وابسته است. View پارامتر ندارد و ترتیب نتیجه بدون ORDER BY بیرونی تضمین نمی‌شود.اثر واقعی با تست و Query کنترلی سنجیده شود
کاراییمی‌تواند روی قفل، لاگ، I/O، آمار یا طرح اجرا اثر بگذاردLogical Reads و Duration قبل و بعد مقایسه شوند
امنیتCREATE VIEW و ALTER روی Schema برای ایجاد، ALTER برای تغییر و SELECT برای مصرف لازم است.اصل حداقل دسترسی و ثبت تغییر رعایت شود

در انتخاب جایگزین، هدف اصلی را مشخص کنید: ذخیره داده، ایجاد رابط Query، تضمین یکپارچگی، تولید شناسه، انتزاع نام یا افزایش سرعت. اشیایی که Syntax مشابه دارند لزوماً نقش یکسانی در معماری ندارند.

سناریوهای واقعی

  • تیم DevOps می‌خواهد نماها یا Viewها در SQL Server را به صورت Migration نسخه‌دار ابتدا روی Stage و سپس Production اجرا کند.
  • DBA پس از تغییر، Query Store و Actual Plan را برای تشخیص Regression بررسی می‌کند.
  • تیم امنیت مجوز مستقیم را حذف و Role اختصاصی با حداقل Permission ایجاد می‌کند.
  • سامانه فارسی همه ستون‌های متنی را nvarchar و همه Literalها را N-prefixed نگه می‌دارد.
  • پیش از عملیات مخرب Backup گرفته و Restore آن در محیط جدا آزمایش می‌شود.

بهترین روش‌ها و Pro Tips

  1. Schema و Database مقصد را صریح بنویسید.
  2. نام Constraint، Index و Object را استاندارد و معنادار انتخاب کنید.
  3. Script را Idempotent کنید و وجود شیء را از Catalog View معتبر بسنجید.
  4. وابستگی‌ها را با sys.sql_expression_dependencies و جستجوی Source Code بررسی کنید.
  5. برای عملیات بزرگ اندازه Log، فضای tempdb و مدت Blocking را برآورد کنید.
  6. Validation Query و معیار موفقیت را قبل از اجرای تغییر آماده کنید.
  7. پس از استقرار خطاهای برنامه، Deadlock، CPU، I/O و Query Regression را پایش کنید.

ترفند حرفه‌ای

در ابتدای Script شماره Ticket، نسخه، نویسنده و پیش‌شرط‌ها را ثبت کنید. برای هر تغییر یک بخش Precheck، Change، Postcheck و Rollback داشته باشید. این ساختار بررسی و اجرای تیمی را بسیار قابل اعتمادتر می‌کند.

سؤالات متداول

آیا این عملیات همیشه به توقف سرویس نیاز دارد؟

خیر، اما ممکن است Sch-M Lock، رشد شدید Log یا Blocking ایجاد کند. Online بودن یک گزینه نیز به معنی بدون قفل بودن کامل نیست.

آیا می‌توان آن را داخل Transaction اجرا کرد؟

بسیاری از DDLهای SQL Server تراکنشی هستند، ولی مدت Lock و Log باید سنجیده شود. برخی گزینه‌ها یا سرویس‌های ابری محدودیت خاص دارند.

چرا متن فارسی خراب می‌شود؟

معمولاً ستون varchar است یا Literal بدون N نوشته شده است. از nvarchar و N استفاده کنید و Encoding فایل را UTF-8 نگه دارید.

چگونه نتیجه را کنترل کنیم؟

Catalog View مرتبط، Query تست کسب‌وکار، تعداد ردیف و رفتار مجوز را بررسی و خروجی را ثبت کنید.

مستندات رسمی کجاست؟

نام دقیق دستور را همراه Microsoft Learn SQL Server جستجو و صفحه متناظر با نسخه موتور خود را مطالعه کنید.

سؤالات مصاحبه

  1. Views چه مسئله‌ای را حل می‌کند و مهم‌ترین ریسک آن چیست؟
  2. اثر این تغییر بر Transaction Log و Locking را چگونه اندازه‌گیری می‌کنید؟
  3. چه تفاوتی میان Constraint، Index، View و Trigger در این سناریو وجود دارد؟
  4. برای رشته فارسی چه نوع داده و Collation انتخاب می‌کنید؟
  5. چگونه وابستگی‌ها و Rollback را پیش از استقرار آزمایش می‌کنید؟

تمرین و Quiz

در یک Database آزمایشی برای نماها یا Viewها در SQL Server سناریو بسازید. Script اجرا، Query کنترل، اندازه‌گیری زمان و Script بازگشت را بنویسید. سپس یک خطای عمدی ایجاد کنید و رفتار Transaction را ثبت نمایید.

  1. حداقل مجوز لازم چیست؟
  2. کدام Catalog View نتیجه را نشان می‌دهد؟
  3. رفتار NULL چگونه است؟
  4. کدام وابستگی ممکن است پنهان بماند؟
  5. کدام معیار کارایی را قبل و بعد مقایسه می‌کنید؟

Cheat Sheet و نکات کلیدی

  • موضوع: Views
  • دسته: مبانی View
  • نسخه: نسخه‌های متداول و پشتیبانی‌شده SQL Server؛ گزینه‌های پیشرفته وابسته به Version و Edition
  • مجوز: CREATE VIEW و ALTER روی Schema برای ایجاد، ALTER برای تغییر و SELECT برای مصرف لازم است.
  • نکته فنی: Optimizer معمولاً تعریف View را Expand می‌کند و کارایی به جداول پایه و ایندکس‌های آن‌ها وابسته است. View پارامتر ندارد و ترتیب نتیجه بدون ORDER BY بیرونی تضمین نمی‌شود.
  • قبل از اجرا: محیط، Backup، وابستگی، فضای Log و Session فعال.
  • بعد از اجرا: Metadata، تست کسب‌وکار، Plan، خطا و مانیتورینگ.

دانلود اسکریپت نمونه و منابع

بلوک‌های کد این مقاله اسکریپت نمونه قابل کپی در SSMS هستند. آن‌ها را با نام اشیای محیط خود تطبیق دهید و در فایل UTF-8 و Source Control ذخیره کنید. اجرای مستقیم نمونه آموزشی روی Production توصیه نمی‌شود.

برای مطالعه بیشتر مستندات رسمی Microsoft Learn درباره Views، Catalog Viewهای مرتبط، Permissionها، Locking و Transaction Log را بررسی کنید. همچنین مباحث Query Store، Extended Events و Database Project مکمل این مقاله هستند.

تاریخچه نسخه، کلمات کلیدی و برچسب‌ها

نسخه‌های متداول و پشتیبانی‌شده SQL Server؛ گزینه‌های پیشرفته وابسته به Version و Edition. نحو پایه این قابلیت در نسخه‌های اشاره‌شده پایدار است، اما گزینه‌های Online، Resumable، سرویس‌های ابری، Query Optimizer و Permissionها ممکن است میان نسخه‌ها تفاوت داشته باشند. در مهاجرت نسخه، تست Regression و بررسی Microsoft Learn ضروری است.

کلمات کلیدی این مقاله عبارت‌اند از: Views, SQL Server, نماها یا Viewها در SQL Server, آموزش SQL, T-SQL, پایگاه داده. برچسب‌های پیشنهادی: SQL، SQL_Server، VIEWS، مبانی_View، آموزش_SQL، مقاله_پایگاه_داده. این اطلاعات برای دسته‌بندی CMS و SEO استفاده می‌شوند و نباید به شکل Keyword Stuffing در متن تکرار شوند.

راهنمای تحلیل حرفه‌ای پیش از اجرا

هدف دقیق نماها یا Viewها در SQL Server و مالک کسب‌وکار را مشخص کنید؛ درخواست مبهم فنی ممکن است نیاز واقعی دیگری داشته باشد.

تعریف فعلی و Metadata مربوط به Views را قبل از تغییر در مخزن Deployment ذخیره کنید.

حجم ردیف، اندازه شیء، نرخ تراکنش و ظرفیت دیسک را اندازه‌گیری کنید؛ حدس در Production قابل قبول نیست.

قفل مورد نیاز را با داده نزدیک به تولید شبیه‌سازی کنید و طولانی‌ترین Query فعال را در نظر بگیرید.

رشد Transaction Log را در سناریوی بدبینانه تخمین بزنید و سرعت Backup Log و Replicaها را کنترل کنید.

Script باید در اجرای دوباره رفتار مشخص داشته باشد و با پیام روشن از وضعیت پیش‌شرط نامعتبر جلوگیری کند.

معیار موفقیت مثل وجود شیء، Trusted بودن Constraint، کاهش Logical Reads یا عدم تغییر تعداد ردیف تعریف کنید.

Rollback را واقعاً اجرا و زمان آن را اندازه‌گیری کنید؛ فقط داشتن Backup بدون آزمون Restore کافی نیست.

پس از استقرار بازه پایش مشخصی برای خطا، Blocking، Deadlock، CPU، I/O و Regression تعیین کنید.

علت تغییر، Ticket، نسخه SQL Server، مجری، زمان و نتیجه Validation را در Change Log ثبت کنید.

چک‌لیست نهایی

  • Server و Database مقصد تأیید شده‌اند.
  • Backup یا روش بازگشت معتبر و آزمایش‌شده وجود دارد.
  • مجوز اجرا حداقلی و حساب استقرار مشخص است.
  • وابستگی‌های Database و کد برنامه بررسی شده‌اند.
  • رشته‌های فارسی Unicode و Collation مناسب دارند.
  • زمان Lock، مصرف Log و tempdb برآورد شده است.
  • Script با داده نزدیک به تولید در Test اجرا شده است.
  • Query کنترلی و معیار موفقیت آماده است.
  • مانیتورینگ بعد از استقرار برنامه‌ریزی شده است.
  • Script و نتیجه در Source Control و Change Log ثبت می‌شوند.

جمع‌بندی

نماها یا Viewها در SQL Server زمانی ارزش واقعی ایجاد می‌کند که همراه با طراحی صحیح، حداقل مجوز، آزمون وابستگی و اندازه‌گیری کارایی استفاده شود. View یک SELECT نام‌گذاری‌شده است که Query پیچیده یا ستون‌های مجاز را پشت یک رابط پایدار قرار می‌دهد و View معمولی داده مستقل ذخیره نمی‌کند. با اجرای نمونه‌ها در محیط آزمایشی و رعایت چک‌لیست، ریسک تغییر کاهش می‌یابد.

SQL Server Syntax را اجرا می‌کند، اما مسئولیت صحت کسب‌وکار، امنیت و قابلیت بازیابی بر عهده طراح و مجری است. هر تغییر موفق باید هم از نظر فنی و هم عملیاتی قابل اثبات باشد.

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر