آموزش جامع تابع APP_NAME در SQL Server؛ از Syntax تا بهینهسازی
مقدمه و جایگاه تابع در SQL Server
تابع APP_NAME یکی از ابزارهای مهم متادیتا در Microsoft SQL Server است و برای شناسایی نام برنامه کلاینتی که نشست جاری را ایجاد کرده است استفاده میشود. متادیتا دادهای درباره ساختار و وضعیت دادههاست؛ بنابراین پاسخ این تابع به محتوای رکوردهای تجاری وابسته نیست، بلکه به Context پایگاه داده، کاتالوگ سیستم، نوع ورودی و سطح دسترسی کاربر ارتباط دارد.
در پروژههای واقعی، APP_NAME در ردیابی اتصالهای برنامهای، برچسبگذاری بار کاری، تحلیل Blocking و تفکیک سرویسها در مانیتورینگ به کار میرود. استفاده حرفهای فقط نوشتن یک SELECT کوتاه نیست؛ باید تفاوت مقدار معتبر، صفر و NULL، اثر Metadata Visibility، نامگذاری Schema-qualified و هزینه اجرای تکراری تابع را نیز شناخت.
این راهنما از مثال پایه آغاز میکند و تا سناریوهای ممیزی، گزارشگیری و بهینهسازی پیش میرود. برای مشاهده نقشه کامل این خانواده، راهنمای جامع توابع متادیتا در SQL Server را نیز مطالعه کنید.
تعریف، Syntax و قرارداد خروجی APP_NAME
APP_NAME به زبان ساده شناسایی نام برنامه کلاینتی که نشست جاری را ایجاد کرده است را انجام میدهد. موتور SQL Server ورودی را در Context جاری تفسیر میکند و نتیجهای با نوع nvarchar(128) برمیگرداند. اگر ورودی به شیء معتبر اشاره نکند، property پشتیبانی نشود یا کاربر اجازه دیدن متادیتا را نداشته باشد، نتیجه میتواند NULL باشد.
نحو استاندارد
SELECT APP_NAME() AS Result;
پارامترها
این تابع پارامتر ندارد و مقدار application name نشست جاری را از ویژگی اتصال میخواند.
نوع خروجی و معنای NULL
نوع اعلامشده خروجی nvarchar(128) است. برنامه مصرفکننده باید NULL را یک حالت مستقل بداند و پیش از تبدیل نوع یا تصمیمگیری، علت آن را بررسی کند. مقدار آن توسط کلاینت قابل تنظیم است و یک کنترل امنیتی قابل اعتماد محسوب نمیشود؛ برای ممیزی قطعی باید هویت، نشست و رویدادها نیز ثبت شوند.
| موضوع | توضیح فنی |
|---|
| کاربرد اصلی | شناسایی نام برنامه کلاینتی که نشست جاری را ایجاد کرده است |
| نوع خروجی | nvarchar(128) |
| Context | پایگاه داده یا نشست جاری، مطابق قرارداد تابع |
| حالت NULL | ورودی نامعتبر، نبود شیء یا نبود مجوز مشاهده متادیتا |
| کاربرد سازمانی | ردیابی اتصالهای برنامهای، برچسبگذاری بار کاری، تحلیل Blocking و تفکیک سرویسها در مانیتورینگ |
اصل مهم: خروجی تابع APP_NAME را داده امنیتی قابل اعتماد فرض نکنید مگر اینکه مستندات همان property و مجوزهای Context این برداشت را تأیید کنند.
مثالهای عملی مستقل و قابل اجرا
مثال 1: خواندن نام برنامه نشست جاری
در این سناریو میخواهیم خواندن نام برنامه نشست جاری را با تابع APP_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT APP_NAME() AS ApplicationName;
| فیلد یا ستون | خروجی نمونه |
|---|
| ApplicationName | Microsoft SQL Server Management Studio - Query |
نکته کاربردی این مثال: خروجی به Connection String و درایور بستگی دارد. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 2: قرار دادن نام برنامه کنار شناسه نشست
در این سناریو میخواهیم قرار دادن نام برنامه کنار شناسه نشست را با تابع APP_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT @@SPID AS SessionId, APP_NAME() AS ApplicationName;
| فیلد یا ستون | خروجی نمونه |
|---|
| SessionId | 57 |
| ApplicationName | OrderApi |
نکته کاربردی این مثال: ترکیب با شناسه نشست برای ثبت رخدادهای عیبیابی مفید است. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 3: ثبت نام برنامه در جدول ممیزی نمونه
در این سناریو میخواهیم ثبت نام برنامه در جدول ممیزی نمونه را با تابع APP_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
DECLARE @Audit TABLE (SessionId int, ApplicationName nvarchar(128));
INSERT INTO @Audit(SessionId, ApplicationName)
VALUES (@@SPID, APP_NAME());
SELECT * FROM @Audit;
| فیلد یا ستون | خروجی نمونه |
|---|
| SessionId | 57 |
| ApplicationName | OrderApi |
نکته کاربردی این مثال: برای جدول دائمی، زمان و نام ورود را هم ذخیره کنید. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 4: استفاده در شرط کنترلشده گزارش
در این سناریو میخواهیم استفاده در شرط کنترلشده گزارش را با تابع APP_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT CASE WHEN APP_NAME() LIKE N'%Management Studio%'
THEN N'نشست تعاملی' ELSE N'نشست برنامهای' END AS SessionKind;
| فیلد یا ستون | خروجی نمونه |
|---|
| SessionKind | نشست تعاملی |
نکته کاربردی این مثال: این طبقهبندی عملیاتی است و نباید مجوز امنیتی ایجاد کند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 5: ترکیب با نام کاربر و میزبان
در این سناریو میخواهیم ترکیب با نام کاربر و میزبان را با تابع APP_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT APP_NAME() AS AppName, HOST_NAME() AS HostName,
ORIGINAL_LOGIN() AS OriginalLogin;
| فیلد یا ستون | خروجی نمونه |
|---|
| AppName | OrderApi |
| HostName | APP-SRV-01 |
| OriginalLogin | svc_order |
نکته کاربردی این مثال: سه نشانه کنار هم برای تحلیل منبع اتصال تصویر بهتری میدهند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 6: بررسی رفتار NULL
در این سناریو میخواهیم بررسی رفتار NULL را با تابع APP_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT CASE WHEN APP_NAME() IS NULL THEN N'نامشخص'
ELSE APP_NAME() END AS SafeApplicationName;
| فیلد یا ستون | خروجی نمونه |
|---|
| SafeApplicationName | OrderApi |
نکته کاربردی این مثال: در عمل معمولاً رشتهای برمیگردد، اما مصرفکننده باید خروجی نامعتبر را مدیریت کند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 7: کوتاهسازی مقدار طولانی برای لاگ
در این سناریو میخواهیم کوتاهسازی مقدار طولانی برای لاگ را با تابع APP_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT LEFT(COALESCE(APP_NAME(), N'نامشخص'), 40) AS LogApplicationName;
| فیلد یا ستون | خروجی نمونه |
|---|
| LogApplicationName | OrderApi |
نکته کاربردی این مثال: محدودسازی طول از شکست قالب لاگ جلوگیری میکند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 8: گزارش نشستهای فعال بر اساس برنامه
در این سناریو میخواهیم گزارش نشستهای فعال بر اساس برنامه را با تابع APP_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT s.program_name, COUNT_BIG(*) AS SessionCount
FROM sys.dm_exec_sessions AS s
WHERE s.is_user_process = 1
GROUP BY s.program_name
ORDER BY SessionCount DESC;
| فیلد یا ستون | خروجی نمونه |
|---|
| program_name | OrderApi |
| SessionCount | 18 |
نکته کاربردی این مثال: برای دیدن همه نشستها معمولاً مجوز VIEW SERVER STATE لازم است. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 9: نمایش روش اشتباه و نسخه درست
در این سناریو میخواهیم نمایش روش اشتباه و نسخه درست را با تابع APP_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
-- اشتباه: اعتماد امنیتی به APP_NAME قابل جعل است.
-- درست: استفاده صرفاً برای مشاهدهپذیری
SELECT APP_NAME() AS ObservabilityLabel, ORIGINAL_LOGIN() AS LoginName;
| فیلد یا ستون | خروجی نمونه |
|---|
| ObservabilityLabel | OrderApi |
| LoginName | svc_order |
نکته کاربردی این مثال: مقدار Application Name را مبنای GRANT یا DENY قرار ندهید. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 10: فیلتر کارای نشستها بدون اجرای تابع روی ستون
در این سناریو میخواهیم فیلتر کارای نشستها بدون اجرای تابع روی ستون را با تابع APP_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
DECLARE @CurrentApp nvarchar(128) = APP_NAME();
SELECT session_id, program_name
FROM sys.dm_exec_sessions
WHERE program_name = @CurrentApp;
| فیلد یا ستون | خروجی نمونه |
|---|
| session_id | 57 |
| program_name | OrderApi |
نکته کاربردی این مثال: محاسبه یکباره مقدار، خوانایی و قابلیت برآورد را بهتر میکند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
خطاهای رایج و روش عیبیابی
نخستین خطای رایج در APP_NAME اجرای Query در پایگاه داده نادرست است. قبل از تحلیل نتیجه، DB_NAME()، نام Schema و شناسه ورودی را ثبت کنید. اگر خروجی NULL است، جداگانه وجود شیء، صحت نام، نوع شیء و مجوز VIEW DEFINITION یا مجوز مرتبط را بررسی کنید.
خطای دوم، چسباندن خروجی تابع به SQL پویا بدون اعتبارسنجی است. نامی که قرار است بهعنوان Identifier استفاده شود باید از منبع مورد اعتماد بیاید و با QUOTENAME محصور شود؛ مقدارهای تجاری نیز باید با sp_executesql پارامتری شوند. مقدار آن توسط کلاینت قابل تنظیم است و یک کنترل امنیتی قابل اعتماد محسوب نمیشود؛ برای ممیزی قطعی باید هویت، نشست و رویدادها نیز ثبت شوند.
- Context جاری را با SELECT DB_NAME() کنترل کنید.
- نامهای شیء را همراه Schema بنویسید و از حدس Schema پیشفرض دوری کنید.
- برای NULL پیام تشخیصی بسازید و آن را خودکار به صفر تبدیل نکنید.
- نتیجه را با نمای کاتالوگ مرتبط، مانند sys.objects، sys.columns یا sys.types، تطبیق دهید.
- مجوز مشاهده متادیتا را با کمترین سطح دسترسی لازم طراحی کنید.
ملاحظات کارایی و بهینهسازی Query
هزینه یک اجرای APP_NAME معمولاً در مقایسه با خواندن دادههای بزرگ ناچیز است، ولی قرار دادن آن روی هر ردیف یک DMV یا کاتالوگ بزرگ میتواند CPU و زمان اجرای قابل مشاهده بسازد. وقتی ورودی ثابت است، مقدار را یکبار در متغیر ذخیره کنید. وقتی چند ویژگی از هزاران شیء لازم است، Join مستقیم به نماهای sys اغلب Plan شفافتری ایجاد میکند.
برای اندازهگیری واقعی، SET STATISTICS IO, TIME ON و Actual Execution Plan را در محیط آزمایشی فعال کنید. نسخه تابعی و نسخه Join را با داده و مجوز یکسان مقایسه کنید. از Scalar Function در سمت ستون شرط، اگر تبدیل مستقیم به شناسه یا Join ممکن است، پرهیز کنید تا Predicate سادهتر باقی بماند.
SET STATISTICS IO, TIME ON;
DECLARE @ContextName sysname = DB_NAME();
-- Query مبتنی بر متادیتا را اینجا اجرا و Plan واقعی را بررسی کنید.
SELECT @ContextName AS DatabaseContext;
SET STATISTICS IO, TIME OFF;
هدف بهینهسازی حذف کورکورانه تابع نیست؛ هدف آن است که تابع در نقطهای اجرا شود که اطلاعات لازم را با کمترین تکرار و روشنترین قرارداد فراهم کند. تغییر باید با اندازهگیری قبل و بعد تأیید شود.
بهترین روشها و کاربرد در پروژه سازمانی
- نام پایگاه داده و Schema را بخشی از قرارداد اجرای اسکریپت بدانید.
- خروجی APP_NAME را بههمراه ورودی و Context در لاگ خطا ثبت کنید.
- برای Migration، شرط وجود را با نوع شیء مورد انتظار ترکیب کنید.
- در کد تولیدی، شاخه جداگانهای برای NULL و نبود مجوز در نظر بگیرید.
- برای گزارشهای انبوه، نماهای کاتالوگ را با نسخه تابعی Benchmark کنید.
- شناسههای داخلی را میان Development، Test و Production کپی نکنید.
- SQL پویا را با QUOTENAME و sp_executesql ایمن کنید.
- تست خودکار را پس از تغییر Schema و ارتقای نسخه SQL Server اجرا کنید.
یک کاربرد واقعی APP_NAME، ساخت ماژول Metadata-driven برای ردیابی اتصالهای برنامهای، برچسبگذاری بار کاری، تحلیل Blocking و تفکیک سرویسها در مانیتورینگ است. چنین ماژولی باید خروجی نسخهبندیشده، کنترل مجوز، ثبت زمان اجرا و تست بازگشت داشته باشد. در پروژههای حساس، نتیجه با منبع دوم مانند نمای کاتالوگ تطبیق داده میشود تا تغییرات غیرمنتظره سریع شناسایی شوند.
سؤالات متداول اختصاصی
۱. تابع APP_NAME دقیقاً چه مسئلهای را حل میکند؟
APP_NAME برای شناسایی نام برنامه کلاینتی که نشست جاری را ایجاد کرده است به کار میرود. مزیت آن این است که بهجای حدسزدن یا Hard-code کردن شناسهها و نامها، پاسخ را از متادیتای همان Context دریافت میکنیم. در یک سامانه حرفهای، خروجی باید همراه با کنترل NULL و ثبت Context مصرف شود تا نتیجه قابل اعتماد و قابل عیبیابی باشد.
۲. برای شروع استفاده از APP_NAME چه پیشنیازی لازم است؟
کاربر باید در پایگاه داده درست متصل باشد، ورودی معتبر بدهد و اجازه مشاهده متادیتای شیء هدف را داشته باشد. بهتر است ابتدا نمونه ساده مقاله اجرا شود و سپس Query با نامهای واقعی Schema و اشیای سازمان جایگزین گردد. برای رشتههای فارسی نیز پیشوند N باید حفظ شود.
۳. آیا آموزش و پیادهسازی سازمانی APP_NAME ارزش تجاری دارد؟
بله؛ استفاده صحیح از متادیتا زمان توسعه ابزارهای گزارشگیری، مهاجرت، ممیزی و نگهداری را کم میکند و خطای انسانی ناشی از مقادیر ثابت را کاهش میدهد. در دوره آموزشی یا مشاوره SQL Server میتوان این تابع را در قالب یک چارچوب Metadata-driven واقعی، همراه با تست و کنترل مجوزها، پیادهسازی کرد.
۴. APP_NAME چگونه هزینه پروژههای پایگاه داده را کاهش میدهد؟
وقتی قواعد کشف Schema یکبار و درست نوشته شوند، همان کد در چند محیط و چند نسخه پایگاه داده قابل استفاده است. این کار دوبارهکاری در Deployment و گزارشسازی را کم میکند. البته صرف استفاده از تابع کافی نیست و باید قرارداد نامگذاری، ثبت خطا و آزمون تغییرات نیز در پروژه تعریف شود.
۵. تفاوت استفاده از APP_NAME با خواندن مستقیم نماهای sys چیست؟
APP_NAME برای دریافت یک ویژگی یا تبدیل مشخص، کوتاه و خواناست؛ در مقابل، نماهای کاتالوگ sys برای گزارش انبوه، فیلتر چندویژگی و Joinهای تحلیلی انعطاف بیشتری دارند. انتخاب درست به حجم داده، نیاز به جزئیات و شکل Plan بستگی دارد و در بسیاری از ابزارها هر دو روش کنار هم استفاده میشوند.
۶. آیا میتوان برای طراحی ابزار یا گزارش اختصاصی APP_NAME مشاوره گرفت؟
بله؛ در یک خدمت تحلیل یا اجرای پروژه SQL Server ابتدا سناریو، مجوزها، نسخه موتور و اندازه کاتالوگ بررسی میشود. سپس Queryهای متادیتا با خروجی پایدار، لاگ خطا، تست خودکار و مستندات تحویل داده میشوند تا ابزار به یک نمونه نمایشی محدود نماند.
۷. رایجترین خطای APP_NAME چیست؟
رایجترین خطا تفسیر NULL بهعنوان پاسخ منفی قطعی است؛ درحالیکه NULL ممکن است از ورودی نامعتبر، Context اشتباه یا نبود مجوز مشاهده متادیتا ناشی شود. خطای دیگر استفاده از نام بدون Schema یا فرض ثابت بودن شناسهها میان پایگاههای داده است. مقدار آن توسط کلاینت قابل تنظیم است و یک کنترل امنیتی قابل اعتماد محسوب نمیشود؛ برای ممیزی قطعی باید هویت، نشست و رویدادها نیز ثبت شوند.
۸. اجرای APP_NAME چه اثری بر Performance دارد؟
یک فراخوانی منفرد معمولاً بسیار سبک است، اما اجرای تابع برای هر ردیف یک مجموعه بزرگ یا در شرطی که Join مستقیم کاتالوگ مناسبتر است میتواند هزینه اضافی بسازد. مقدارهای ثابت را یکبار در متغیر محاسبه کنید، Actual Execution Plan و STATISTICS IO را بررسی کنید و برای گزارشهای انبوه از نماهای sys استفاده آگاهانه داشته باشید.
۹. Best Practice اصلی برای APP_NAME چیست؟
Context را صریح نگه دارید، نامها را Schema-qualified بنویسید، ورودی و خروجی NULL را کنترل کنید و شناسههای متادیتا را در محیط دیگر Hard-code نکنید. همچنین اگر خروجی وارد SQL پویا میشود، نام اشیا را با QUOTENAME محصور کنید و مقدارهای داده را پارامتری نگه دارید.
۱۰. APP_NAME با کدام نسخههای SQL Server سازگار است؟
این تابع از توابع جاافتاده Transact-SQL است، اما دامنه propertyها، مجوزهای لازم و سطح پشتیبانی در SQL Server، Azure SQL Database، Managed Instance و سرویسهای تحلیلی میتواند متفاوت باشد. پیش از استقرار، مستندات نسخه هدف و Compatibility Level را بررسی و Query را در محیط آزمایشی همان پلتفرم اجرا کنید.
سؤالات مصاحبه SQL Server
۱. چرا APP_NAME ممکن است NULL برگرداند؟
ورودی نامعتبر، Context نادرست، property ناسازگار یا محدودیت Metadata Visibility از علتهای اصلی هستند. پاسخ حرفهای باید روش تفکیک این علتها را نیز توضیح دهد.
۲. چه زمانی نمای sys را به APP_NAME ترجیح میدهید؟
وقتی چند ستون متادیتا برای مجموعه بزرگی از اشیا لازم است، Join و فیلتر مستقیم کاتالوگ معمولاً خواناتر و قابلبهینهسازیتر است. برای یک تبدیل یا ویژگی منفرد، تابع میتواند سادهتر باشد.
۳. چرا شناسههای متادیتا نباید Hard-code شوند؟
زیرا شناسهها در پایگاه دیگر، پس از بازسازی شیء یا در محیط استقرار متفاوت میتوانند تغییر کنند. نام معتبر یا کاتالوگ باید در زمان اجرا شناسه را حل کند.
۴. Metadata Visibility چه اثری بر نتیجه دارد؟
کاربر معمولاً فقط متادیتای Securableهایی را میبیند که مالک آنهاست یا مجوز مرتبط دارد. بنابراین NULL الزاماً نبود شیء را ثابت نمیکند.
۵. چگونه کارایی Query متادیتا را میسنجید؟
نسخهها را با IO، TIME، Plan واقعی، تعداد ردیف و مجوز یکسان مقایسه میکنم و تکرار تابع، Predicate و Joinهای کاتالوگ را بررسی میکنم.
چکلیست نهایی
- Syntax تابع APP_NAME با نوع ورودی صحیح نوشته شده است.
- Context پایگاه داده و Schema پیش از اجرا کنترل شدهاند.
- NULL، صفر و یک بر اساس قرارداد property از هم تفکیک شدهاند.
- هیچ شناسه داخلی بین محیطها Hard-code نشده است.
- نامهای واردشده به SQL پویا با QUOTENAME ایمن شدهاند.
- نسخه کاتالوگی برای گزارشهای انبوه بررسی و Benchmark شده است.
- مجوز مشاهده متادیتا با اصل حداقل دسترسی تنظیم شده است.
- تست پس از تغییر Schema و ارتقای SQL Server وجود دارد.
جمعبندی
APP_NAME ابزاری دقیق برای شناسایی نام برنامه کلاینتی که نشست جاری را ایجاد کرده است است، به شرط آنکه Context، مجوز و معنای NULL جدی گرفته شود. مثالهای این مقاله نشان دادند چگونه از Query ساده به ممیزی سازمانی، مدیریت خطا و انتخاب روش کاراتر برسیم.
برای مقایسه این تابع با سایر اعضای خانواده و دسترسی به مقالههای مرتبط، به مقاله مادر توابع Metadata در SQL Server بازگردید. در پیادهسازی نهایی، مستندات نسخه هدف و Plan واقعی Query مرجع تصمیم باشند.