آموزش دستور DROP EVENT SESSION در SQL Server | آموزش SQL Server

آموزش دستور DROP EVENT SESSION در SQL Server

توسط admin | گروه SQL Server | 1405/05/06

نظرات 0

آموزش دستور DROP EVENT SESSION در SQL Server

مسئله‌ای که این دستور حل می‌کند

وقتی یک نشست Extended Events فقط در حد تعریف باقی نماند و قرار باشد در چرخه استقرار، عیب‌یابی و نگهداری استفاده شود، شناخت دقیق DROP EVENT SESSION ضروری است. این مقاله مسئله عملی «برای پاک‌سازی نشست‌های آزمایشی، نسخه‌های منسوخ یا منابعی که دیگر نباید شروع شوند استفاده می‌شود.» را از دید SQL Server بررسی می‌کند و تفاوت Metadata با وضعیت Runtime را روشن نگه می‌دارد.

پیش‌نیاز مطالعه، آشنایی پایه با Event، Action، Predicate و Target است. در پایان می‌توانید Syntax را درست بنویسید، نتیجه را از Catalog یا DMV کنترل کنید، خطاهای رایج را پیش از اجرا تشخیص دهید و اثر Performance را متناسب با removal بسنجید.

برای دیدن جایگاه این دستور در کل چرخه، راهنمای جامع دستورات Extended Events را نیز در دسترس داشته باشید؛ این صفحه روی جزئیات مستقل همین Topic تمرکز می‌کند.

دسترسی سریع

  1. تعریف و جایگاه
  2. نحو و اجزا
  3. ده مثال عملی
  4. کارایی و خطاها
  5. پرسش‌های تکمیلی

تعریف و جایگاه فنی

DROP EVENT SESSION تعریف نشست Extended Events را از Metadata حذف می‌کند و پایان قطعی چرخه عمر آن است.

برای پاک‌سازی نشست‌های آزمایشی، نسخه‌های منسوخ یا منابعی که دیگر نباید شروع شوند استفاده می‌شود.

در معماری Extended Events، این Topic در گروه «removal» قرار می‌گیرد. تصمیم درباره Scope، وضعیت Session و مقصد داده باید قبل از اجرا روشن باشد؛ زیرا موفقیت DDL لزوماً به معنی دریافت داده قابل استفاده نیست.

DROP EVENT SESSION — نقشه مفهومینمودار اختصاصی DROP EVENT SESSION — نقشه مفهومی با برچسب‌های فنی مرتبط با Extended Events.DROP EVENT SESSION — نقشه مفهومیDROP EVENT SESSIONExecution ScopeSTATE = STOPCatalog Removalxel FilesRetentionRollback ScriptScopeCleanupRecommended Use

این نقشه نشان می‌دهد DROP EVENT SESSION چگونه با Scope، Metadata، Event/Target و کنترل عملیاتی مرتبط می‌شود؛ برچسب‌ها مخصوص همین دستور انتخاب شده‌اند.

Syntax، پارامترها و رفتار خروجی

Syntax استاندارد

DROP EVENT SESSION [SessionName]
ON SERVER;

پارامترها و اجزای اثرگذار

  • SessionName نام نشست موجود است.
  • ON SERVER یا ON DATABASE باید با Scope ایجاد نشست تطابق داشته باشد.
  • پیش از حذف معمولاً STATE = STOP اجرا می‌شود تا فرآیند عملیاتی روشن باشد.

Return Type، NULL و سازگاری

Result Set تولید نمی‌کند؛ پس از موفقیت ردیف نشست از Catalog حذف می‌شود، اما فایل‌های قبلی Target لزوماً از دیسک پاک نمی‌شوند.

این یک دستور DDL یا عبارت کنترلی است و Return Type تابعی ندارد؛ بنابراین رفتار NULL فقط در Predicateها، SET valueها یا Queryهای کنترلی اطراف آن مطرح می‌شود. Scopeهای Server و Database، نام DMVها و دسترسی‌های لازم می‌توانند بین نسخه‌ها و سرویس‌های Azure تفاوت داشته باشند؛ قبل از انتقال اسکریپت، مستندات نسخه مقصد و sys.dm_xe_objects همان Instance را کنترل کنید.

منطق اجرا و نکات فنی

مرز Metadata و Runtime

DROP EVENT SESSION روی یکی از دو لایه تعریف یا اجرا اثر می‌گذارد. Catalog مانند sys.server_event_sessions وضعیت تعریف‌شده را نگه می‌دارد، در حالی که sys.dm_xe_sessions فقط نشست‌های فعال را نشان می‌دهد.

کنترل هر دو لایه مانع برداشت اشتباه از موفقیت عملیات می‌شود.

وابستگی به Scope و Permission

ON SERVER معمولاً به مجوزهای سطح Server نیاز دارد و نام Objectها در sys.server_event_* دیده می‌شود. برای ON DATABASE باید Catalog و Permission متناظر همان Database را به کار برد.

اسکریپت قابل‌انتقال باید Scope را به‌عنوان یک تصمیم صریح نگه دارد، نه یک مقدار ضمنی.

طراحی قابل بازگشت

برای DROP EVENT SESSION همواره یک مسیر Rollback یا Recreate تعریف کنید. تغییرهای Extended Events اغلب در زمان Incident انجام می‌شوند و نبود اسکریپت بازگشت می‌تواند پوشش تشخیصی را ناقص کند.

  • ثبت DDL فعلی
  • کنترل وجود Object
  • اعمال تغییر کوچک
  • اعتبارسنجی Target و Runtime
DROP EVENT SESSION — جریان اجرانمودار اختصاصی DROP EVENT SESSION — جریان اجرا با برچسب‌های فنی مرتبط با Extended Events.DROP EVENT SESSION — جریان اجرا1STATE = STOP2Catalog Removal3xel Files4Retention5Rollback ScriptPredicateMetric 59DispatchMetric 76TargetMetric 23Output ShapeMetric 40

جریان دوم ترتیب بررسی پیش‌نیاز، اجرای DROP EVENT SESSION، ثبت Metadata و اعتبارسنجی خروجی را نمایش می‌دهد؛ Badgeها نقاط کنترل هزینه و Dispatch هستند.

مثال‌های عملی از ساده تا پیشرفته

مثال 1: حذف مستقیم نشست

سناریو: در این مرحله هدف، حذف مستقیم نشست برای Session نمونه است. Query عمداً کامل نوشته شده تا بتوان آن را در محیط آزمایشی اجرا یا با نام واقعی جایگزین کرد.

DROP EVENT SESSION [XE_Article_Demo] ON SERVER;
GO
شاخصخروجی نمونه
وضعیتموفق در صورت وجود پیش‌نیازها
کنترل پیشنهادیCatalog یا DMV مرتبط با همان سناریو

این مثال روی جنبه «حذف مستقیم نشست» تمرکز دارد. در محیط واقعی نام Session، مسیر فایل، Scope و سطح دسترسی را با استاندارد استقرار خود هماهنگ کنید.

مثال 2: حذف Idempotent

سناریو: در این مرحله هدف، حذف Idempotent برای Session نمونه است. Query عمداً کامل نوشته شده تا بتوان آن را در محیط آزمایشی اجرا یا با نام واقعی جایگزین کرد.

IF EXISTS (SELECT 1 FROM sys.server_event_sessions WHERE name = N'XE_Article_Demo')
    DROP EVENT SESSION [XE_Article_Demo] ON SERVER;
GO
شاخصخروجی نمونه
وضعیتموفق در صورت وجود پیش‌نیازها
کنترل پیشنهادیCatalog یا DMV مرتبط با همان سناریو

این مثال روی جنبه «حذف Idempotent» تمرکز دارد. در محیط واقعی نام Session، مسیر فایل، Scope و سطح دسترسی را با استاندارد استقرار خود هماهنگ کنید.

مثال 3: توقف سپس حذف

سناریو: در این مرحله هدف، توقف سپس حذف برای Session نمونه است. Query عمداً کامل نوشته شده تا بتوان آن را در محیط آزمایشی اجرا یا با نام واقعی جایگزین کرد.

IF EXISTS (SELECT 1 FROM sys.dm_xe_sessions WHERE name = N'XE_Article_Demo')
    ALTER EVENT SESSION [XE_Article_Demo] ON SERVER STATE = STOP;
IF EXISTS (SELECT 1 FROM sys.server_event_sessions WHERE name = N'XE_Article_Demo')
    DROP EVENT SESSION [XE_Article_Demo] ON SERVER;
GO
شاخصخروجی نمونه
وضعیتموفق در صورت وجود پیش‌نیازها
کنترل پیشنهادیCatalog یا DMV مرتبط با همان سناریو

این مثال روی جنبه «توقف سپس حذف» تمرکز دارد. در محیط واقعی نام Session، مسیر فایل، Scope و سطح دسترسی را با استاندارد استقرار خود هماهنگ کنید.

مثال 4: ثبت مسیر Target پیش از حذف

سناریو: در این مرحله هدف، ثبت مسیر Target پیش از حذف برای Session نمونه است. Query عمداً کامل نوشته شده تا بتوان آن را در محیط آزمایشی اجرا یا با نام واقعی جایگزین کرد.

SELECT s.name, CAST(f.value AS nvarchar(4000)) AS FileName
FROM sys.server_event_sessions AS s
JOIN sys.server_event_session_targets AS t ON t.event_session_id=s.event_session_id
JOIN sys.server_event_session_fields AS f ON f.event_session_id=s.event_session_id AND f.object_id=t.target_id
WHERE s.name=N'XE_Article_Demo' AND f.name=N'filename';
شاخصخروجی نمونه
ستون نمونهمقدار مورد انتظار
nameXE_Article_Demo یا ردیف‌های مرتبط

این مثال روی جنبه «ثبت مسیر Target پیش از حذف» تمرکز دارد. در محیط واقعی نام Session، مسیر فایل، Scope و سطح دسترسی را با استاندارد استقرار خود هماهنگ کنید.

مثال 5: حذف Database-scoped Session

سناریو: در این مرحله هدف، حذف Database-scoped Session برای Session نمونه است. Query عمداً کامل نوشته شده تا بتوان آن را در محیط آزمایشی اجرا یا با نام واقعی جایگزین کرد.

IF EXISTS (SELECT 1 FROM sys.database_event_sessions WHERE name = N'XE_DbScope')
    DROP EVENT SESSION [XE_DbScope] ON DATABASE;
GO
شاخصخروجی نمونه
وضعیتموفق در صورت وجود پیش‌نیازها
کنترل پیشنهادیCatalog یا DMV مرتبط با همان سناریو

این مثال روی جنبه «حذف Database-scoped Session» تمرکز دارد. در محیط واقعی نام Session، مسیر فایل، Scope و سطح دسترسی را با استاندارد استقرار خود هماهنگ کنید.

مثال 6: کنترل حذف از Catalog

سناریو: در این مرحله هدف، کنترل حذف از Catalog برای Session نمونه است. Query عمداً کامل نوشته شده تا بتوان آن را در محیط آزمایشی اجرا یا با نام واقعی جایگزین کرد.

SELECT s.name, s.event_retention_mode_desc, s.startup_state
FROM sys.server_event_sessions AS s
WHERE s.name = N'XE_Article_Demo';
شاخصخروجی نمونه
ستون نمونهمقدار مورد انتظار
nameXE_Article_Demo یا ردیف‌های مرتبط

این مثال روی جنبه «کنترل حذف از Catalog» تمرکز دارد. در محیط واقعی نام Session، مسیر فایل، Scope و سطح دسترسی را با استاندارد استقرار خود هماهنگ کنید.

مثال 7: حذف چند نشست آزمایشی

سناریو: در این مرحله هدف، حذف چند نشست آزمایشی برای Session نمونه است. Query عمداً کامل نوشته شده تا بتوان آن را در محیط آزمایشی اجرا یا با نام واقعی جایگزین کرد.

DECLARE @sql nvarchar(max)=N'';
SELECT @sql += N'DROP EVENT SESSION ' + QUOTENAME(name) + N' ON SERVER;' + CHAR(13)
FROM sys.server_event_sessions
WHERE name LIKE N'XE_Test[_]%';
SELECT @sql AS ReviewBeforeExecute;
شاخصخروجی نمونه
وضعیتموفق در صورت وجود پیش‌نیازها
کنترل پیشنهادیCatalog یا DMV مرتبط با همان سناریو

این مثال روی جنبه «حذف چند نشست آزمایشی» تمرکز دارد. در محیط واقعی نام Session، مسیر فایل، Scope و سطح دسترسی را با استاندارد استقرار خود هماهنگ کنید.

مثال 8: پرهیز از حذف نشست سیستمی

سناریو: در این مرحله هدف، پرهیز از حذف نشست سیستمی برای Session نمونه است. Query عمداً کامل نوشته شده تا بتوان آن را در محیط آزمایشی اجرا یا با نام واقعی جایگزین کرد.

SELECT name
FROM sys.server_event_sessions
WHERE name = N'system_health';
-- نشست system_health را حذف نکنید.
شاخصخروجی نمونه
ستون نمونهمقدار مورد انتظار
nameXE_Article_Demo یا ردیف‌های مرتبط

این مثال روی جنبه «پرهیز از حذف نشست سیستمی» تمرکز دارد. در محیط واقعی نام Session، مسیر فایل، Scope و سطح دسترسی را با استاندارد استقرار خود هماهنگ کنید.

مثال 9: ذخیره DDL بازسازی

سناریو: در این مرحله هدف، ذخیره DDL بازسازی برای Session نمونه است. Query عمداً کامل نوشته شده تا بتوان آن را در محیط آزمایشی اجرا یا با نام واقعی جایگزین کرد.

SELECT name, event_retention_mode_desc, startup_state
FROM sys.server_event_sessions
WHERE name = N'XE_Article_Demo';
-- خروجی را همراه اسکریپت CREATE در کنترل نسخه نگه دارید.
شاخصخروجی نمونه
وضعیتموفق در صورت وجود پیش‌نیازها
کنترل پیشنهادیCatalog یا DMV مرتبط با همان سناریو

این مثال روی جنبه «ذخیره DDL بازسازی» تمرکز دارد. در محیط واقعی نام Session، مسیر فایل، Scope و سطح دسترسی را با استاندارد استقرار خود هماهنگ کنید.

مثال 10: پاک‌سازی پس از Incident

سناریو: در این مرحله هدف، پاک‌سازی پس از Incident برای Session نمونه است. Query عمداً کامل نوشته شده تا بتوان آن را در محیط آزمایشی اجرا یا با نام واقعی جایگزین کرد.

IF EXISTS (SELECT 1 FROM sys.dm_xe_sessions WHERE name=N'XE_Incident_20260728')
    ALTER EVENT SESSION [XE_Incident_20260728] ON SERVER STATE=STOP;
IF EXISTS (SELECT 1 FROM sys.server_event_sessions WHERE name=N'XE_Incident_20260728')
    DROP EVENT SESSION [XE_Incident_20260728] ON SERVER;
GO
شاخصخروجی نمونه
وضعیتموفق در صورت وجود پیش‌نیازها
کنترل پیشنهادیCatalog یا DMV مرتبط با همان سناریو

این مثال روی جنبه «پاک‌سازی پس از Incident» تمرکز دارد. در محیط واقعی نام Session، مسیر فایل، Scope و سطح دسترسی را با استاندارد استقرار خود هماهنگ کنید.

کاربردهای واقعی در پروژه

حذف نشست‌های موقت پس از Incident، بازنشسته‌کردن نسخه قدیمی یک جلسه یا پاک‌سازی استقرار ناموفق.

در پروژه سازمانی بهتر است اجرای DROP EVENT SESSION بخشی از Runbook باشد: مالک Session، زمان شروع و پایان، مسیر داده، سقف نگهداری و Query کنترل بعد از اجرا ثبت شود. این ساختار به تیم DBA و توسعه اجازه می‌دهد تغییر را از یک اقدام دستی به فرآیند قابل حسابرسی تبدیل کنند.

برای محیط‌های پرترافیک، ابتدا نشست را در بار مشابه Production آزمایش کنید. مقدار Event تولیدشده، حجم فایل، رخدادهای Drop و زمان Parse باید با هدف مانیتورینگ مقایسه شوند؛ تنها مشاهده چند Event موفق معیار کافی نیست.

هشدار مهم

حذف تعریف نشست به معنی حذف فایل‌های xel نیست؛ پاک‌سازی فایل باید با سیاست نگهداری جداگانه انجام شود.

دستور را ابتدا در محیط آزمایشی اجرا کنید و برای نشست‌های امنیتی، Audit یا system_health از تغییر بدون تأیید مالک سرویس پرهیز کنید.

اشتباهات رایج و روش اصلاح

  • اجرای DROP EVENT SESSION با Scope اشتباه؛ راه اصلاح: محل ایجاد Session را از Catalog متناظر پیدا کنید و ON SERVER یا ON DATABASE را همان‌جا به کار ببرید.
  • اتکا به پیام Commands completed successfully؛ راه اصلاح: نتیجه را با Catalog و در صورت نیاز DMV Runtime تأیید کنید.
  • استفاده از نام Package یا Object ناقص؛ راه اصلاح: نام رسمی را از sys.dm_xe_objects استخراج کنید.
  • نادیده‌گرفتن مصرف Target و فایل؛ راه اصلاح: ظرفیت، Rollover و سیاست پاک‌سازی را قبل از اجرا تعیین کنید.
  • تغییر مستقیم در Production بدون Script بازگشت؛ راه اصلاح: نسخه قبل و بعد DDL را در کنترل نسخه ثبت کنید.

Performance Considerations

خود DDL سبک است، اما حذف بدون استخراج آخرین داده ممکن است شواهد عیب‌یابی را از دسترس گردش کاری خارج کند.

Extended Events نسبت به بسیاری از روش‌های قدیمی سبک‌تر است، اما بدون طراحی درست بی‌هزینه نیست. Actionهای Context، Eventهای بسیار پرتکرار، Predicate ضعیف، Target حافظه‌ای بزرگ یا فایل با Rollover نامناسب می‌توانند CPU، حافظه، I/O و زمان تحلیل را افزایش دهند.

برای سنجش واقعی، شمارنده‌های sys.dm_xe_sessions، اندازه target_data، نرخ رشد xel و زمان Queryهای Parser را در یک بازه ثابت ثبت کنید. مقایسه قبل و بعد از تغییر بهتر از اتکا به حدس یا توصیه عمومی است.

Best Practices

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

  1. Session را با نام و هدف قابل جست‌وجو تعریف کنید.
  2. Scope و Permission را پیش از DDL کنترل کنید.
  3. برای Eventهای پرتکرار Predicate دقیق بنویسید.
  4. پس از هر تغییر Catalog و Runtime را جداگانه اعتبارسنجی کنید.
  5. اسکریپت توقف، حذف یا بازگشت را کنار اسکریپت اصلی نگه دارید.
  6. ظرفیت Target و عمر داده را به Runbook اضافه کنید.
DROP EVENT SESSION — تصمیم عملینمودار اختصاصی DROP EVENT SESSION — تصمیم عملی با برچسب‌های فنی مرتبط با Extended Events.DROP EVENT SESSION — تصمیم عملیDecision GridScopeRollback ScriptRetentionxel FilesOverhead vs CoverageCatalog RemovalSTATE = STOPDROP EVENT SESSIONBest PathCommon Error → Fix

ماتریس تصمیم پایانی برای DROP EVENT SESSION تعادل میان پوشش تشخیصی، Overhead، قابلیت بازگشت و مسیر درست اجرا را به‌صورت مقایسه‌ای نشان می‌دهد.

مزایا، محدودیت‌ها و زمان نامناسب استفاده

بعد تصمیمارزیابی اختصاصی
مزیت اصلیبرای پاک‌سازی نشست‌های آزمایشی، نسخه‌های منسوخ یا منابعی که دیگر نباید شروع شوند استفاده می‌شود.
محدودیتحذف تعریف نشست به معنی حذف فایل‌های xel نیست؛ پاک‌سازی فایل باید با سیاست نگهداری جداگانه انجام شود.
زمان مناسبحذف نشست‌های موقت پس از Incident، بازنشسته‌کردن نسخه قدیمی یک جلسه یا پاک‌سازی استقرار ناموفق.
زمان نامناسبوقتی هدف تشخیصی، Scope یا برنامه نگهداری داده مشخص نیست؛ در این وضعیت ابتدا طراحی Session را کامل کنید.

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

آیا این دستور داده‌ای برمی‌گرداند؟

Result Set تولید نمی‌کند؛ پس از موفقیت ردیف نشست از Catalog حذف می‌شود، اما فایل‌های قبلی Target لزوماً از دیسک پاک نمی‌شوند.

چطور بفهمیم تغییر در Catalog ثبت شده است؟

برای Scope سطح Server از sys.server_event_sessions و Viewهای وابسته استفاده کنید؛ برای Session فعال، sys.dm_xe_sessions و sys.dm_xe_session_targets را نیز بررسی کنید.

آیا می‌توان آن را در Transaction برنامه کاربردی قرار داد؟

DDLهای Extended Events را بهتر است در اسکریپت مدیریت مستقل، با TRY/CATCH و کنترل وضعیت اجرا کنید؛ رفتار Transaction را در نسخه مقصد آزمایش کنید و به Rollback منطقی متکی باشید.

تفاوت ON SERVER و ON DATABASE چیست؟

Scope مالکیت، Permission، Catalog و DMVها را تغییر می‌دهد. اسکریپت نباید این دو را بدون بررسی سرویس مقصد جایگزین یکدیگر کند.

چرا Session در Catalog هست ولی داده ندارد؟

ممکن است Start نشده باشد، Predicate هیچ Eventی را عبور نداده باشد، Target باز نشده باشد یا مسیر فایل/مجوز مشکل داشته باشد.

برای اتوماسیون چه کنترل‌هایی لازم است؟

وجود Session، وضعیت Runtime، وجود Event/Target، Permission، مسیر فایل، نتیجه DDL و Query اعتبارسنجی بعد از اجرا را ثبت کنید.

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

در یک مصاحبه چگونه نقش DROP EVENT SESSION را توضیح می‌دهید؟

با تفکیک نقش آن در removal، اثر روی Metadata/Runtime و نیاز به کنترل Scope پاسخ دهید.

چرا Predicate روی Performance مهم است؟

زیرا رویداد نامرتبط را پیش از Dispatch حذف می‌کند و حجم Target و Parse را کاهش می‌دهد.

چه تفاوتی میان Catalog و DMV Runtime وجود دارد؟

Catalog تعریف پایدار را نگه می‌دارد؛ DMV Runtime فقط وضعیت نشست فعال و Targetهای باز را نشان می‌دهد.

چطور یک تغییر Extended Events را قابل بازگشت می‌کنید؟

DDL فعلی را ثبت، تغییر را کوچک، Query کنترل را مشخص و Script معکوس یا Recreate را آماده می‌کنید.

چه زمانی event_file را به ring_buffer ترجیح می‌دهید؟

وقتی دوام، حجم بیشتر، تحلیل بعدی و مدیریت Rollover مهم است؛ ring_buffer برای مشاهده کوتاه و محدود مناسب‌تر است.

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

  1. هدف مانیتورینگ و Scope را ثبت کنید.
  2. وجود پیش‌نیازهای DROP EVENT SESSION را کنترل کنید.
  3. DDL را با نام Session آزمایشی اجرا کنید.
  4. Catalog و Runtime را جداگانه Query بگیرید.
  5. حجم Target و رخداد Drop را بسنجید.
  6. اسکریپت بازگشت را ذخیره کنید.
  7. زمان و مالک تغییر را در Runbook ثبت کنید.

جمع‌بندی تصمیم‌محور

DROP EVENT SESSION زمانی انتخاب درستی است که نقش آن در چرخه Session روشن، پیش‌نیازهای Scope و Permission کنترل و نتیجه با Viewهای Metadata و Runtime تأیید شود. برای این دستور، توصیه محوری چنین است: قبل از حذف، وضعیت، مالکیت، مسیر فایل و نیاز تیم پشتیبانی به داده تاریخی را ثبت کنید و اسکریپت بازسازی را در کنترل نسخه نگه دارید.

قدم بعدی، مرور نقشه کامل دستورات Extended Events و سپس آزمایش Queryهای همین مقاله روی یک Session غیرحیاتی است.

خدمات برنامه‌نویسی و پایگاه داده

قبول سفارش‌های برنامه‌نویسی و پایگاه داده در اصفهان با شماره 09131253620؛ مجموعه‌ای معتبر با سابقه فعالیت حرفه‌ای از سال ۱۳۷۵ شمسی تاکنون.

انجام پروژه، آموزش برنامه‌نویسی و آموزش پایگاه داده SQL Server برای دانشجویان، برنامه‌نویسان و سازمان‌ها انجام می‌شود. برای سفارش پروژه از ایتا، واتساپ یا تماس مستقیم استفاده کنید.

 

0 نظر

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

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

حرف 500 حداکثر