You are on page 1of 463

www.takbook.

com
‫‪www.takbook.com‬‬

‫کتاب آموزشی‬
‫‪SQL Server 2019‬‬

‫مؤلف‪ :‬فرشید بابجانی زاده‬


‫‪www.takbook.com‬‬

‫سرشناسه‪ :‬بابجانی زاده‪ ،‬فرشید‪1365 ،‬‬


‫عنوان و نام پدیدآور‪ :‬کتاب آموزشی ‪ / SQL Server 2019‬فرشید بابجانی زاده‬
‫مشخصات نشر‪3isco.ir :‬‬
‫مشخصات ظاهری ‪ 463:‬ص‬
‫شابک‪:‬‬
‫وضعیت فهرستنو یسی‪ :‬فیپا‬
‫موضوع‪:‬‬
‫موضوع‪:‬‬
‫ردهبندی کنگره‪: PIR‬‬
‫ردهبندی دیو یی‪:‬‬
‫شماره کتابشناسی ملی‪:‬‬
‫‪www.takbook.com‬‬

‫تقدیم هب‬

‫روح بلند ماردم‪...‬‬


‫‪www.takbook.com‬‬

‫‪5‬‬ ‫فهرست‬

‫فهرست‬
‫مقدمه ‪11 ................................................................................................................................‬‬

‫فصل اول ‪13 ............................................................................................................................‬‬

‫مباحث بنیادی پایگاهداده‪13...................................................................................................................................................‬‬

‫‪ 1-1‬بررسی اولیه‪13 ............................................................................................................‬‬

‫‪ 1-1-1‬داده چیست ‪13 .....................................................................................................‬‬

‫‪ 1-1-2‬اطالعات چیست ‪14 ...............................................................................................‬‬

‫‪ 1-1-3‬موجوديت چیست ‪14 .............................................................................................‬‬

‫‪ 1-1-4‬پايگاهداده چیست ‪15 ..............................................................................................‬‬

‫‪ 1-1-4-1‬ويژگیهاي داده در پايگاهداده ‪15 .........................................................................‬‬

‫‪ 1-1-4-2‬روشهاي ذخیره داده‪16 ...................................................................................‬‬

‫‪ 1-1-4-3‬سیستم پايگاهداده (‪17 ............................................................... )database system‬‬

‫‪ 1-1-4-4‬عناصر اصلی سیستم پايگاهداده‪17 ........................................................................‬‬

‫‪ 1-1-4-5‬مزايا و معايب سیستمهاي پايگاهداده ‪18 .................................................................‬‬

‫‪ 1-1-5‬سیستم مديريت پايگاهداده ‪19 ....................................................................................‬‬

‫‪ 1-1-5-1‬وظايف سیستم مديريت پايگاهداده ‪19 ...................................................................‬‬

‫‪ 1-1-5-2‬تراکنش ‪20 ...................................................................................................‬‬

‫‪ 1-1-5-3‬اجزاي سیستم مديريت پايگاهداده ‪21 ....................................................................‬‬

‫‪ 1-1-6‬انواع سیستمهاي مديريت پايگاهداده ‪22 ........................................................................‬‬

‫‪ 1-1-6-1‬سیستم مديريت پايگاهداده توزيع شده ‪22 ...............................................................‬‬

‫‪ 1-1-6-2‬سیستم مديريت پايگاهداده بالدرنگ ‪23 ..................................................................‬‬

‫‪ 1-1-6-3‬سیستم مديريت پايگاهداده تحملپذير خطا‪23 ..........................................................‬‬

‫‪ 1-1-6-4‬سیستم مديريت پايگاهداده امن ‪23 ........................................................................‬‬

‫‪ 1-1-6-5‬سیستم مديريت پايگاهداده ناهمگون ‪24 .................................................................‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪6‬‬

‫‪ 1-1-6-6‬سیستم مديريت پايگاهداده چندرسانهاي ‪24 .............................................................‬‬

‫‪ 1-1-6-7‬سیستم مديريت پايگاهداده متحد ‪24 ......................................................................‬‬

‫‪ 1-1-7‬کاربران پايگاهداده ‪24 ..............................................................................................‬‬

‫‪ 1-1-7-1‬تحلیل گران سیستم ‪24 .....................................................................................‬‬

‫‪ 1-1-7-2‬طراحان پايگاهداده ‪24 .......................................................................................‬‬

‫‪ 1-1-7-3‬پیاده سازان برنامههاي کاربردي ‪25 .......................................................................‬‬

‫‪ 1-1-7-4‬مدير پايگاهداده ‪25 ..........................................................................................‬‬

‫‪ 1-1-7-5‬کاربران نهائی ‪25 ............................................................................................‬‬

‫‪ 1-1-8‬ديکشنري داده ‪26 ..................................................................................................‬‬

‫‪ 1-1-9‬پايگاهداده‪26 .................................................................................................. XML‬‬

‫فصل دوم ‪27 ...........................................................................................................................‬‬

‫پیادهسازي ‪27.......................................................................................................................................SQL Server 2019‬‬

‫‪ 2-1‬نیازمنديهاي ‪27 ..................................................................................... SQL Server 2019‬‬

‫‪ 2-2‬نصب و راهاندازي ‪ SQL Server 2019‬در ويندوز ‪30 ..................................................................‬‬

‫‪ 2-3‬دسترسی از طريق شبکه به ‪41 ............................................................................ SQL Server‬‬

‫‪ 2-4‬نصب و راهاندازي ‪ SQL Server 2019‬در لینوکس ‪50 ...................................................... Ubuntu‬‬

‫فصل سوم ‪61 ...........................................................................................................................‬‬


‫آشنايی با پايگاهداده‪61.............................................................................................................................................................‬‬

‫‪ 3-1‬ايجاد پايگاهداده و کار با آن ‪61 .........................................................................................‬‬

‫‪ 3-1-1‬ايجاد پايگاهداده‪61 .................................................................................................‬‬

‫‪ 3-1-2‬ايجاد جدول در ديتابیس ‪63 ......................................................................................‬‬

‫‪ 3-1-3‬انواع ‪ Data Type‬در جداول ‪66 ...................................................................................‬‬

‫‪ 3-1-4‬حذف ديتابیس در ‪70 ............................................................................... SQL Server‬‬


‫‪www.takbook.com‬‬

‫‪7‬‬ ‫فهرست‬

‫‪ 3-1-5‬تعريف پرسوجو يا ‪ Query‬در ‪71 ......................................................................... SQL‬‬

‫‪ 3-1-5-1‬بررسی دستور ‪71 ..................................................................................SELECT‬‬

‫‪ 3-1-5-2‬بررسی دستور ‪75 ................................................................................... Insert‬‬

‫‪ 3-5-1-3‬بررسی دستور ‪76 ................................................................................. Update‬‬

‫‪ 4-5-1-3‬بررسی دستور ‪77 ................................................................................. DELETE‬‬

‫‪ 3-1-5-5‬بررسی دستور ‪78 ................................................................................. WHERE‬‬

‫‪ 3-1-5-6‬بررسی دستور ‪ OR ،AND‬و ‪80 ...................................................................... NOT‬‬

‫‪ 3-1-5-7‬بررسی دستور ‪83 ..................................................................................... LIKE‬‬

‫‪ 3-1-5-8‬بررسی دستور ‪84 .............................................................................. BETWEEN‬‬

‫‪ 3-1-5-9‬بررسی دستور ‪86 ........................................................................................ IN‬‬

‫‪ 3-1-5-10‬بررسی دستور ‪86 ....................................................................................TOP‬‬

‫‪ 3-1-5-11‬بررسی دستور ‪88 ....................................................................... MIN and MAX‬‬

‫‪90 ..............................................................‬‬ ‫‪SUM‬‬ ‫‪ 3-1-5-12‬بررسی دستور ‪ AVG ،COUNT‬و‬

‫‪ 3-1-5-13‬بررسی ‪92 ..................................................................................... Wildcards‬‬

‫‪ 3-1-5-14‬بررسی دستور ‪94 .................................................................................. Aliass‬‬

‫‪ 3-1-5-15‬بررسی دستور ‪95 ............................................................................ GROUP BY‬‬

‫‪ 3-1-5-16‬بررسی دستور ‪97 ...............................................................................HAVING‬‬

‫‪ 3-1-5-17‬بررسی ‪97 ................................................................................ PRIMARY KEY‬‬

‫‪ 3-1-5-18‬بررسی ‪ JOIN‬در ‪99 .................................................................................. SQL‬‬

‫‪ 3-1-5-19‬بررسی دستور ‪107 ........................................................................... synonym‬‬

‫‪ 3-1-6‬کار با ‪ View‬در ‪110 .......................................................................................... SQL‬‬

‫‪ 3-1-7‬بررسی ‪ FileStream‬در ‪117 ........................................................................ SQL Server‬‬

‫‪ 3-1-7-1‬ايجاد ديتابیس براي استفاده از ‪121 ...................................................... FILESTREAM‬‬

‫‪ 3-1-7-2‬ايجاد جدول در ديتابیس ‪124 ............................................................ FILESTREAM‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪8‬‬

‫‪ 3-1-8‬ارتباط با ‪ SQL‬از طريق ‪126 ..................................................................... Visual Studio‬‬

‫‪ 3-1-8-1‬ايجاد ديتابیس از طريق دستورات در ‪128 ............................................. Visual Studio‬‬

‫‪ 3-1-8-2‬ايجاد ديتابیس از طريق ابزار ‪130 ....................................................... Visual Studio‬‬

‫‪ 3-1-8-3‬ايجاد فرم در ‪ Visual Studio‬و ثبت اطالعات در جدول ‪133 ................................... SQL‬‬

‫‪ 3-1-9‬واردکردن فايل اکسل در ‪136 .............................................................................. SQL‬‬

‫‪ 3-1-10‬بررسی دستور ‪140 ...................................................................... Stored Procedures‬‬

‫‪ 3-1-10-2‬تغییر يک ‪142 ...................................................................... Stored procedure‬‬

‫‪ 3-1-10-3‬حذف يک ‪143 ..................................................................... Stored procedure‬‬

‫‪ 3-1-10-1‬استفاده از پارامتر در دستور ‪144 .......................................................... Procedure‬‬

‫‪ 3-1-11‬بررسی ‪ Trigger‬در ‪151 ........................................................................... SQL Server‬‬

‫‪ 3-1-12‬توابع در ‪153 ................................................................................ SQL Server 2019‬‬

‫‪ 3-1-12-1‬توابع اسکالر در ‪157 ....................................................................... SQL Server‬‬

‫‪ 3-1-12-2‬توابع تاريخ يا ‪160 ................................................................................. Date‬‬

‫‪ 3-1-12-3‬توابع رشتهاي ‪198 ........................................................................................‬‬

‫‪ 3-1-12-4‬توابع سیستمی ‪219 .......................................................................................‬‬

‫فصل چهارم ‪235 ......................................................................................................................‬‬


‫امنیت در ‪235...................................................................................................................................................SQL Server‬‬

‫‪ 4-1‬روشهاي احراز هويت ‪235 .........................................................................................‬‬

‫‪ 4-2‬ايجاد کاربر و اعطاي دسترسی به آن ‪236 .........................................................................‬‬

‫‪ 4-3‬ايجاد کاربر از طريق ‪246 .................................................................................... Query‬‬

‫‪ 4-4‬رمزگذاري بر روي ديتابیس ‪249 .......................................................................................‬‬

‫‪ 4-4-1‬کلیدهاي متقارن (‪ )Symmetric‬و نامتقارن (‪250 .............................................. )Asymmetric‬‬

‫‪ 4-4-2‬هش کردن (‪251 ....................................................................................... )Hashing‬‬


‫‪www.takbook.com‬‬

‫‪9‬‬ ‫فهرست‬

‫‪ 4-4-3‬رمزگذاري بر روي ستونهاي جداول در ‪252 ........................................................... SQL‬‬

‫‪ 4-4-3-1‬ايجاد ‪ Master Key‬براي رمزگذاري رو ستون ‪254 .....................................................‬‬

‫‪ 4-4-3-2‬ايجاد ‪ Certificate‬در ‪255 ............................................................................ SQL‬‬

‫‪ 4-4-3-3‬ايجاد کلید متقارن ‪256 .....................................................................................‬‬

‫‪ 4-4-3-4‬رمزگذاري داده ‪257 ........................................................................................‬‬

‫فصل پنجم ‪263 ........................................................................................................................‬‬

‫پشتیبانگیري و بازيابی‪263......................................................................................................................................................‬‬

‫‪ 5-1‬پشتیبانگیري از طريق نرمافزار ‪263 ...........................................................................SQL‬‬

‫‪ 5-1-1‬پشتیبانگیري بهصورت دستی در ‪285 .................................................................. SQL‬‬

‫‪ 5-1-2‬نحوهي بازگرداندن فايلهاي ‪287 .................................................................. Backup‬‬

‫‪ 5-1-3‬بازگرداندن ديتابیس حذف شده ‪289 ........................................................................‬‬

‫‪ Attach 5-1-4‬و ‪ Detach‬کردن ديتابیس ‪291 .......................................................................‬‬

‫‪ 5-2‬پشتیبانگیري از طريق نرمافزار ‪293 ............................................................. Veeam Backup‬‬

‫‪ 5-2-1‬نصب نرمافزار ‪293 ..................................................... Veeam Backup and Replication‬‬

‫‪ 5-2-2‬اضافهکردن سرورها براي پشتیبانگیري‪298 ................................................................‬‬

‫‪ 5-2-3‬اضافهکردن سرور ‪305 .............................................................................. Backup‬‬

‫‪ 5-2-4‬پشتیبانگیري از ماشین مجازي ‪314 .........................................................................‬‬

‫‪ 5-2-5‬استفاده از ‪320 ................................................................................ Veeam Agent‬‬

‫فصل ششم ‪331 ........................................................................................................................‬‬


‫‪331‬‬ ‫‪...............................................................................................................................................SQL Replication‬‬

‫‪ 8-1‬بررسی سرويس ‪331 ...................................................................................... Replication‬‬

‫‪ 8-2‬نصب و راهاندازي سرويس ‪347 .........................................................................Replication‬‬

‫فصل هفتم ‪371 ........................................................................................................................‬‬

‫‪371...........................................................................................................................................SQL Reporting Service‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪10‬‬

‫نصب و راهاندازي ‪386 ......................................................................................... Power BI‬‬

‫فصل هشتم ‪403 .......................................................................................................................‬‬


‫‪403...........................................................................................................................................SQL Failover Clustring‬‬

‫فصل نهم ‪437 ..........................................................................................................................‬‬

‫هوش تجاري – ‪437..................................................................................................................Business Intelligence‬‬

‫‪ 9-1‬هوش تجاري چیست ‪437 ..............................................................................................‬‬

‫‪ 9-2‬چگونه کار را آغاز کنیم ‪437 ............................................................................................‬‬

‫‪ 9-3‬مقدمهاي بر ‪438 ..................................................................................................... SSIS‬‬

‫‪ 9-4‬نصب و راهاندازي سرويس ‪438 ..................................................................................SSIS‬‬

‫‪ 9-5‬ايجاد پروژه ‪440 .................................................................................................... SSIS‬‬

‫‪ 9-5-1‬بررسی ‪ Package‬در ‪442 ....................................................................................... SSIS‬‬

‫‪ 9-5-2‬بررسی ‪443 ................................................................................. Connection Manager‬‬

‫‪ 9-5-3‬استفاده از ‪ FTP‬در ‪444 ..........................................................................................SSIS‬‬

‫در ‪448 ........................................................... SSIS‬‬ ‫‪Integrity, Shrink, Backup, Email‬‬ ‫‪ 9-5-4‬کار با‬

‫‪ 9-5-5‬گرفتن خروجی تصادفی از جداول با ‪455 .................................................................. SSIS‬‬

‫منابع ‪463 ...............................................................................................................................‬‬


‫‪www.takbook.com‬‬

‫مقدمه‬
‫که بهعنوان کاملترين کتاب در اين‬ ‫‪SQL Server 2019‬‬ ‫با تشکر از انتخاب اين کتاب بهعنوان مرجع کامل آموزش‬
‫زمینه ارائه شده است‪ ،‬در اين کتاب سعی کرديم همهي جنبههاي ‪ SQL Server‬را بررسی و آموزش دهیم و امیدواريم‬
‫با موفقیت همراه بوده باشد‪ ،‬البته براي اين که کتاب به صورت کامل ارائه شود از منابع مختلف در کتاب استفاده شده‬
‫است که لیست آن در آخر کتاب ذکر شده است‪.‬‬
‫مباحث کلی که در اين کتاب بررسی شده است شامل‪:‬‬

‫‪SQL Server‬‬ ‫‪ -1‬بررسی بنیادي نرمافزار‬


‫پیادهسازي‪SQL Server 2019‬‬ ‫‪-2‬‬
‫‪ -3‬کار با پايگاهداده و دستورات آن‬
‫‪SQL Server 2019‬‬ ‫‪ -4‬امنیت در‬
‫‪ -5‬پشتیبانگیري و بازيابی اطالعات‬
‫‪SQL Replication‬‬ ‫‪ -6‬بررسی‬
‫‪SQL Failover Clustring‬‬ ‫‪ -7‬پیادهسازي سرويس‬
‫‪Business Intelligence‬‬ ‫‪ -8‬هوش تجاري –‬
www.takbook.com
‫‪www.takbook.com‬‬

‫فصل اول‬
‫مباحث بنیادی پایگاهداده‬
‫تقريباً بیشتر برنامههاي کاربردي‪ ،‬امروزه به روش پايگاهداده طراحی میشوند‪ .‬پايگاهداده امکان ذخیرهسازي متمرکز‬
‫داده با حداقل افزونگی و استفادهي اشتراکی توسط کاربران مختلف را میدهد‪.‬‬

‫‪ 1-1‬بررسی اولیه‬
‫‪ 1-1-1‬داده چیست‬

‫شکل ‪1-1‬‬

‫داده (‪ )data‬داراي تعاريف مختلفی است‪ ،‬به طور کلی دادهها کلمات و ارزشهاي واقعی هستند که از طريق مشاهده‬
‫و تحقیق بدست میآيند‪ ،‬به عبارت ديگر داده نمودي از وقايع‪ ،‬معلومات‪ ،‬رخدادها‪ ،‬پديدهها و مفاهیم هستند‪.‬‬
‫در محاسبات‪ ،‬داده به اطالعاتی گفته میشود که به شکلی مناسب براي انتقال و پردازش ترجمه شود‪ .‬در کامپیوتر و‬
‫رسانههاي ارتباطاتی امروزي داده به شکل باينري تبديل میشود‪ .‬بنابراين داده يک نمايش باينري از يک موجوديت‬
‫منطقی ذخیره شده در حافظه کامپیوتر است‪.‬‬
‫ريشه کلمهي داده از عبارت التین ‪ datum‬گرفته شده که به معنی اطالع است و ‪ data‬فرم جمع آن است‪ .‬اما ‪ datum‬به‬
‫ندرت استفاده میشود و اکثراً ترجیح میدهند ‪ data‬را بهصورت يک کلمه مفرد استفاده کنند‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪14‬‬

‫‪ 1-1-2‬اطالعات چیست‬

‫شکل ‪1-2‬‬

‫اطالعات (‪ )information‬مفهومی است که براي گیرنده آن قابلدرک بوده و با دانستن آن میتواند براي حل يک مسئله‬
‫تصمیمگیري يا ارزيابی کند‪.‬‬
‫وقتی اطالعات وارد کامپیوتر شود‪ ،‬ذخیره میشود و به داده تبديل میشود‪ .‬بعد از پردازش‪ ،‬داده خروجی مجدداً‬
‫بهعنوان اطالعات دريافت میشود‪.‬‬
‫هنگامیکه اطالعات در يک بسته خاص قرار میگیرند و براي درک موضوعی يا انجام کاري استفاده میشود به دانش‬
‫(‪ )knowledge‬تبديل میشود‪.‬‬
‫‪ 1-1-3‬موجوديت چیست‬

‫شکل ‪1-3‬‬

‫موجوديت (‪ )entity‬مفهوم کلی پديده‪ ،‬شیء يا فردي است که در مورد آن میخواهیم اطالع داشته باشیم و در کامپیوتر‬
‫ذخیره کنیم‪.‬‬
‫هر نوع موجوديت داراي مجموعهاي از صفات خاصه (‪ )attribute‬است که ويژگی جداکننده يک نوع موجوديت از‬
‫نوع ديگر محسوب میشود‪.‬‬
‫اگر در نظر داريم يک سیستم پايگاهداده براي يک دبیرستان پیادهسازي کنیم مواردي چون دانشجويان‪ ،‬استادان‪ ،‬دروس‪،‬‬
‫کالسها و غیره جزء موجوديتهاي سیستم به شمار میروند‪.‬‬
‫‪www.takbook.com‬‬

‫‪15‬‬ ‫فصل ‪ / 1‬مباحث بنیادي پايگاهداده‬

‫موجوديت دانشجو در سیستم دانشگاه میتواند داراي صفات خاصه‪ :‬نام‪ ،‬نام خانوادگی‪ ،‬سن‪ ،‬سال تولد‪ ،‬رشته تحصیلی‪،‬‬
‫سال ورود و ‪ ...‬باشد و يا موجوديت درس صفات خاصه‪ :‬کد درس‪ ،‬نام درس و تعداد واحد باشد‪.‬‬
‫‪ 1-1-4‬پايگاهداده چیست‬

‫شکل ‪1-4‬‬

‫يک بانک اطالعاتی يا پايگاهداده (‪ )database‬مجموعهاي سازمانيافته و بدون افزونگی از دادههاي مرتبط به هم است‬
‫که میتواند توسط سیستمهاي کاربردي مختلف به اشتراک گذاشته شود و بهراحتی دسترسی‪ ،‬مديريت و بهنگام شود‪.‬‬
‫وقتی داده بهصورت پايگاهداده سازماندهی میشود‪ ،‬کاربر و برنامهنويس نیازي به دانستن جزئیات ذخیرهسازي داده‬
‫ندارند‪ .‬عالوه بر اين داده میتواند بدون تأثیر روي اجزاي ديگر سیستم تغییر کند‪ .‬براي مثال از اعداد حقیقی به صحیح‪،‬‬
‫از يک ساختار فايل به ديگري يا از دستگاه ذخیرهسازي نوري به مغناطیسی تغییر کند‪.‬‬

‫‪ 1-1-4-1‬ويژگیهاي داده در پايگاهداده‬


‫ويژگیهايی که داده در پايگاهداده بايد داشته باشند در لیست زير آمده است‪:‬‬
‫‪ .1‬اشتراکی شدن (‪)Shared‬‬
‫داده در پايگاهداده بین چندين کاربر و برنامه کاربردي به اشتراک گذاشته میشود‪.‬‬

‫‪ .2‬ماندگاري (‪)Persistence‬‬
‫وقتی داده در پايگاهداده ذخیره شد پايدار است و از بین نمیرود‪ ،‬مگر آنکه توسط سیستم پايگاهداده تغییر کند‪.‬‬

‫‪ .3‬امنیت (‪)Security‬‬
‫داده در پايگاهداده از فاش شدن‪ ،‬تغییر و تخريب بدون مجوز محافظت میشود‪ .‬مدير سیستم توسط سطوح دسترسی‬
‫و قیدهاي امنیتی نحوه دستیابی به داده را مشخص میکند و اطمینان میدهد که دستیابی از طريق مناسب انجام میشود‪.‬‬

‫‪ .4‬اعتبار (‪)Validity‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪16‬‬

‫يا جامعیت (‪ )Integrity‬و يا صحت (‪ )Correctness‬بهدرستی داده در پايگاهداده نسبت به موجوديت دنیاي واقعی‬
‫معتبر اشاره دارد‪ .‬مثالً موجودي بانک نبايد منفی باشد‪.‬‬

‫‪ .5‬سازگاري (‪)Consistency‬‬
‫داده در پايگاهداده با مقدار واقعی داده در دنیاي خارج سازگار است‪ .‬وقتی يک فقره اطالع در بیش از يک نقطه‬
‫ذخیره شود و الزم باشد بههنگام شود‪ ،‬اگر بههنگامسازي در همه نقاط انجام نشود ناسازگاري ايجاد میشود‪.‬‬

‫‪ .6‬کاهش افزونگی (‪)Non redundancy‬‬


‫داده در پايگاهداده داراي حداقل اف زونگی است‪ .‬افزونگی به اين معناست که هیچ دو فقره داده در بانک معرف يک‬
‫موجوديت در دنیاي خارج نباشد‪.‬‬

‫‪ .7‬استقالل (‪)independence‬‬
‫تغییر در نمايش فیزيکی‪ ،‬تکنیکهاي دستیابی و سازماندهی داده تأثیري روي برنامههاي کاربردي ندارد‪.‬‬

‫‪ 1-1-4-2‬روشهاي ذخیره داده‬


‫دو روش کلی براي ذخیره و بازيابی خودکار دادهها وجود دارد‪ :‬سیستم فايل ساده و سیستم پايگاهداده‪.‬‬

‫سیستم فایل (‪)file system‬‬


‫در اين روش‪ ،‬دادهها در فايلهاي مجزا قرار گرفته و سیستمهاي جداگانهاي به نام سیستم پردازش فايل براي استفاده‬
‫از فايلهاي دادهاي طراحی میشوند‪ .‬در اين سیستمها هر برنامهي کاربردي تنها به فايل دادهاي مربوط به خود میتواند‬
‫مراجعه کند‪.‬‬
‫اشکاالت چنین طراحی در ذخیره داده به طور خالصه عبارتاند‪:‬‬

‫‪ .1‬افزونگی و ناسازگاري داده به دلیل چندين فرمت فايل و تکرار اطالعات در فايلهاي مختلف‪.‬‬
‫کار‪.‬‬ ‫‪ .2‬مشکل در دستیابی داده و نیاز به نوشتن برنامه جديدي براي انجام هر‬
‫‪ .3‬قیدهاي جامعیت بهجاي اينکه صريحاً بیان شوند در کد برنامه از نظر پنهان میشوند‪ .‬اضافهکردن قیدهاي جديد‬
‫يا تغییر قیدهاي موجود بهسختی صورت میگیرد‪.‬‬
‫‪ .4‬ايجاد ناسازگاري به دلیل وجود چندين کپی از فقرههاي داده‪.‬‬
‫‪ .5‬مشکالت امنیتی به دلیل دسترسی همروند و بدون کنترل توسط چند کاربر‬
‫‪www.takbook.com‬‬

‫‪17‬‬ ‫فصل ‪ / 1‬مباحث بنیادي پايگاهداده‬

‫‪ 1-1-4-3‬سیستم پايگاهداده (‪)database system‬‬


‫در اين روش کلیه دادهها بهصورت مجتمع در پايگاهداده ذخیره میشود‪ ،‬ولی هر کاربر ديد خاص خود را نسبت به‬
‫دادهها دارد‪ .‬کاربران مختلف میتوانند به طور مشترک با پايگاهداده کار کنند‪ .‬به دلیل تجمع داده افزونگی به حداقل‬
‫ممکن کاهش میيابد‪.‬‬
‫نرمافزاري به نام سیستم مديريت پايگاهداده (‪ )DBMS‬بهعنوان واسطه بین برنامههاي کاربردي و پايگاهداده ايفاي نقش‬
‫میکند لذا امنیت دادهها در اين روش بیشتر است‪.‬‬
‫چند نمونه از کاربردهاي سیستم پايگاهداده موارد زير هستند‪:‬‬
‫• انجام کلیه تراکنشهاي بانکداري‪.‬‬
‫• رزرواسیون و زمانبندي خطوط هوائی‪.‬‬
‫• ثبتنام دانشجويان‪ ،‬واحدگیري و ثبت نمرات در مراکز آموزشی‪.‬‬
‫• ثبت اطالعات مشتريان‪ ،‬محصوالت و فاکتورهاي خريدوفروش‪.‬‬
‫• پیگیري سفارشات و پیشنهادها در فروش ‪.online‬‬
‫• ثبت رکوردهاي کارمندان و محاسبات حقوق‪ ،‬کسورات مالیاتی در سازمانها‪.‬‬

‫‪ 1-1-4-4‬عناصر اصلی سیستم پايگاهداده‬


‫اجزاء اصلی سیستم بانک اطالعاتی عبارتاند از‪:‬‬
‫‪ .1‬دادهها‬
‫شامل دادههايی درباره موجوديتهاي مختلف محیط و ارتباط بین موجوديتها‪.‬‬
‫‪ .2‬سختافزار‬
‫شامل عناصر پردازشی‪ ،‬رسانههاي ذخیرهسازي داده‪ ،‬دستگاههاي جانبی‪ ،‬سختافزارهاي ارتباطی و غیره‪.‬‬
‫‪ .3‬نرمافزار‬
‫شامل سیستمعامل و نرمافزارهاي ارتباطی شبکه‪ ،‬نرمافزار سیستم مديريت پايگاهداده و برنامههاي کاربردي‪.‬‬
‫‪ .4‬رويههاي عملیاتی‬
‫شامل کلیه عملیاتی که روي پايگاهداده انجام میشود‪ ،‬نظیر تهیه پشتیبان‪ ،‬آمارگیري و ‪...‬‬
‫‪ .5‬کاربر‬
‫شامل کاربران يا کسانی که به نحوي با سیستم در ارتباط هستند نظیر مدير پايگاهداده (‪ ،)DBA‬طراحان پايگاهداده‬
‫(‪ ،)DBD‬برنامهنويسان پايگاهداده (‪ )DBP‬و کاربران نهائی (‪.)end users‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪18‬‬

‫‪ 1-1-4-5‬مزايا و معايب سیستمهاي پايگاهداده‬

‫مزایای مهم سیستم پایگاهداده‬


‫‪ -1‬تجمع‪ ،‬وحدت ذخیرهسازي و کنترل متمرکز دادهها‪.‬‬
‫کاهش افزونگی‪ .‬تجمع داده و وحدت ذخیرهسازي باعث کاهش افزونگی میشود‪ .‬مثالً آدرسهاي مختلف‬
‫براي يک مشتري در قسمتهاي مختلف اداره ثبت نمیشود‪.‬‬
‫‪ -2‬به اشتراک گذاشتن دادهها‬
‫چند کاربر میتوانند همزمان به يک پايگاهداده دسترسی داشته باشند‪ .‬برنامههاي کاربردي موجود قادر به‬
‫اشتراک گذاردن دادهها در پايگاهداده بوده و برنامههاي کاربردي جديد نیز میتوانند از اين دادهها استفاده‬
‫کنند‪.‬‬
‫‪ -3‬پرهیز از ناسازگاري‬
‫با کاهش افزونگی‪ ،‬کنترل متمرکز و جامعیت‪ ،‬سازگاري و يکپارچگی دادهها تضمین میشود‪.‬‬
‫‪ -4‬اعمال محدوديتهاي امنیتی‬
‫سیستمهاي امنیتی در پايگاهداده امکان اعمال کنترلهاي مختلف را براي هر نوع دسترسی (بازيابی‪ ،‬اصالح‪،‬‬
‫حذف و غیره) بر روي پايگاهداده فراهم میکند‪.‬‬
‫‪ -5‬صحت بیشتر داده و استقالل از برنامههاي کاربردي‪.‬‬
‫‪ -6‬راحتی پیادهسازي برنامههاي کاربردي جديد‪.‬‬

‫معایب سیستم پایگاهداده‬

‫‪ -1‬طراحی سیستمهاي پايگاهداده پیچیدهتر‪ ،‬دشوارتر و زمان برتر است‪.‬‬


‫‪ -2‬هزينه قابلتوجه‪ ،‬صرف سختافزار و نصب نرمافزار میشود‪.‬‬
‫‪ -3‬آسیبديدن پايگاهداده‪ ،‬روي کلیهي برنامههاي کاربردي تأثیر میگذارد‪.‬‬
‫‪ -4‬هزينه زياد براي تبديل از سیستم فايلی به سیستم پايگاهداده نیاز است‪.‬‬
‫‪ -5‬نیازمند تعلیم اولیه برنامهنويسان و کاربران و استخدام کارمندان خاص پايگاهداده است‪.‬‬
‫‪ -6‬نیاز به تهیه چندين کپی پشتیبان از پايگاهداده میباشد‪.‬‬
‫‪ -7‬خطاهاي برنامه میتوانند فاجعه برانگیز باشند‪.‬‬
‫‪ -8‬زمان اجراي هر برنامه طوالنیتر میشود‪.‬‬
‫‪ -9‬بسیار وابسته به عملیات سیستم مديريت پايگاهداده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪19‬‬ ‫فصل ‪ / 1‬مباحث بنیادي پايگاهداده‬

‫‪ 1-1-5‬سیستم مديريت پايگاهداده‬

‫شکل ‪1-5‬‬

‫سیستم مديريت پايگاهداده يا به طور خالصه ‪ (DataBase Management System) DBMS‬مهمترين نرمافزاري در سیستم‬
‫پايگاهداده است که بهعنوان رابط بین پايگاهداده و کاربر و برنامههاي کاربردي عمل مینمايد‪.‬‬
‫امکانپذير‬ ‫‪DBMS‬‬ ‫کلیه فايلهاي پايگاهداده فقط در اختیار اين نرمافزار قرار گرفته و دستیابی به آنها تنها از طريق‬
‫است‪.‬‬
‫‪ DBMS‬سرويسهايی جهت دسترسی داده در پايگاهداده فراهم میکند بهنحويکه از کلیه خواص داده محافظت شود‪.‬‬

‫‪ 1-1-5-1‬وظايف سیستم مديريت پايگاهداده‬


‫وظايف ‪ DBMS‬در سیستمهاي مختلف تا حدودي متفاوت بوده و بستگی به نوع کاربران آن دارد‪ .‬اما بهطورکلی اين‬
‫وظايف عبارتاند از‪:‬‬
‫‪ -1‬امکان تعريف پايگاهداده‪.‬‬
‫‪ -2‬امکان ايجاد پايگاهداده‪.‬‬
‫‪ -3‬امکان دستکاري در دادهها‪.‬‬
‫‪ -4‬بازيابی پايگاهداده‪.‬‬
‫‪ -5‬بههنگامسازي پايگاهداده (عملیات درج‪ ،‬حذف و جايگزينی)‪.‬‬
‫‪ -6‬تأمین تسهیالتی براي کاربر بهمنظور توسعه سیستم‪.‬‬
‫‪ -7‬امکان سازماندهی مجدد‪.‬‬
‫‪ -8‬کنترل امنیت و جامعیت دادهها‪.‬‬
‫‪ -9‬ايجاد ديکشنري دادهها‪.‬‬
‫‪ -10‬امکان کنترل کارايی‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪20‬‬

‫‪ 1-1-5-2‬تراکنش‬

‫شکل ‪1-6‬‬

‫تراکنش (‪ )transaction‬يک برنامه فعال است که دنبالهاي از دستورات را شامل میشود و به طور خاص بعضی عملیات‬
‫آن روي پايگاهداده است‪.‬‬
‫سه عمل تراکنشی خاص وجود دارد‪:‬‬
‫‪ Start‬که نشان میدهد يک تراکنش در حال شروع شدن است‪.‬‬
‫‪ Commit‬که داللت بر اتمام عادي تراکنش دارد‪.‬‬
‫‪ Abort‬که بیانکننده پايان يافتن تراکنش به دلیل لغو آن است و کلیه اثرات تراکنش لغو شده بايد ‪ rollback‬يا بیاثر‬
‫شود‪ .‬وقتی تراکنش ‪ commit‬میشود تأثیرش روي پايگاهداده بايد دائمی شود‪.‬‬
‫‪ACID‬‬ ‫هر تراکنش بايد پايگاهداده را از يک حالت سازگار به حالت سازگار بعدي ببرد‪ .‬تراکنش بايد داراي خواص‬
‫باشد تا پايگاهداده را در حالت سازگار باقی نگهدارند‪ .‬خواص ‪ ACID‬حروف اول چهار خاصیت زير است‪:‬‬
‫‪.1‬اتمی بودن (‪)Atomicity‬‬
‫تراکنشها اتمیک هستند يا اصالً شروع نمیشوند يا وقتی آغاز شدند حتماً به پايان میرسند‪ .‬يا تمام عملیات انجام‬
‫میشود يا هیچکدام‪.‬‬
‫نگهداشتن خاصیت اتمیک به عهدهي کنترل همروندي و ترمیم است‪.‬‬

‫‪ .2‬سازگاري (‪)Consistency‬‬
‫يک تراکنش يا پايگاهداده را به حالت سازگار جديدي میبرد يا اگر شکستی رخ داد کلیه دادهها به حالت قبل از شروع‬
‫تراکنش برمیگردند‪.‬‬

‫‪ .3‬ايزوله بودن (‪)Isolation‬‬


‫شده باشند‪.‬‬ ‫‪commit‬‬ ‫تراکنشی که در حال اجراست و هنوز به پايان نرسیده تأثیرش از بقیه مخفی است مگر اينکه‬
‫اجراي همروند تراکنشها بايد بهصورتی باشد که انگار پشتسرهم اجرا شدهاند‪ .‬حفظ اين خاصیت برعهده کنترل‬
‫همروندي است‪.‬‬

‫‪ .4‬ماندگاري (‪)Durability‬‬
‫‪www.takbook.com‬‬

‫‪21‬‬ ‫فصل ‪ / 1‬مباحث بنیادي پايگاهداده‬

‫از وقتی تراکنشی ‪ commit‬شد تأثیرش دائمی است؛ حتی اگر سیستم خراب شود‪ ،‬داده در حالت درست خود باقی‬
‫میماند‪.‬‬

‫‪ 1-1-5-3‬اجزاي سیستم مديريت پايگاهداده‬


‫توسط تعدادي مؤلفه نرمافزاري انجام میشود‪ .‬هرکدام از اين مؤلفهها ممکن است مرکب از چند‬ ‫‪DBMS‬‬ ‫وظايف‬
‫واحد کوچکتر باشند‪ .‬تعدادي از سرويسهاي که توسط مؤلفههاي ‪ DBMS‬داده میشوند در زير لیست شده است‪:‬‬

‫پردازش تراکنش (‪)Transaction Processing‬‬


‫پردازش تراکنش‪ ،‬عملیاتی که از منابع مختلف میرسد را روي پايگاهداده اجرا میکند بهنحويکه خواص مطلوب‬
‫کمک‬ ‫‪ACID‬‬ ‫تراکنش خدشهدار نشود‪ .‬سرويسهاي کنترل همروندي و ترمیم به اين مؤلفه براي برقراري خواص‬
‫میکنند‪ .‬بهاينترتیب اجراي همروند تراکنشها و سازگاري پايگاهداده حتی در صورت وقوع شکستی در سیستم‬
‫تضمین میشود‪.‬‬

‫کنترل همروندي (‪)Concurrency Control‬‬


‫مديريت اجراي همروند تراکنشها روي پايگاهداده در حین برقراري سازگاري را به عهده دارد‪.‬‬

‫ترمیم (‪)Recovery‬‬
‫ترمیم تضمین میکند که اگر اجراي تراکنش با عدم موفقیت يا لغو روبرو شد‪ ،‬تأثیر نامطلوبی بر روي پايگاهداده يا‬
‫تراکنشهاي ديگر نگذارد و حالت پايگاهداده را همیشه سازگار نگه دارد‪.‬‬

‫مديريت ثبت (‪)Log Management‬‬


‫هر اتفاقی در سیستم در يک فايل ذخیره میشود و توسط مديريت ترمیم براي حفظ صحت و اعتبار پايگاهداده هنگام‬
‫خرابی يا لغو سیستم استفاده میشود‪.‬‬

‫واسطه زبانی (‪)Language Interface‬‬


‫دستوراتی را براي تعريف داده‪ ،‬کارکردن با آن اختیار کاربران و برنامههاي کاربردي قرار میدهد‪.‬‬

‫تحملپذيري خطا (‪)Fault Tolerancy‬‬


‫توانايی ارائه سرويسهاي قابلاطمینان توسط ‪ DBMS‬حتی در صورت بروز نقص را تحملپذيري خطا میگويند‪ .‬انواع‬
‫خطاهايی که ممکن است پیش بیايد عبارتاند از‪:‬‬
‫• خطاي منطقی‪ :‬تراکنش موفق نمیشود مثالً به دلیل ورودي بد‪ ،‬سرريزي‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪22‬‬

‫• خطاي سیستمی‪ :‬تراکنش موفق نمیشود مثالً به دلیل بنبست‪.‬‬


‫• لغو سیستم‪ :‬قطع برق‪ ،‬پاک شدن حافظه اصلی‪ ،‬پرشدن ديسک‪.‬‬
‫• ناتوانی ديسک‪ :‬خرابی هد‪ ،‬خرابکاري عمدي‪ ،‬آتشسوزي‪.‬‬

‫کاتالوگ داده (‪)Data Catalog‬‬


‫يک ديکشنري داده يک پايگاهداده سیستمی شامل اطالعاتی درباره داده‪ ،‬ارتباطات و قیدها در پايگاه اصلی است‪ .‬گاهی‬
‫به آن متا داده هم گفته میشود‪.‬‬

‫امنیت (‪)Security‬‬
‫امنیت به محافظت داده در مقابل افشا شدن‪ ،‬تغییر و خرابی اشاره دارد‪ .‬هر کاربر و برنامه کاربردي امتیاز ويژهاي براي‬
‫دسترسی به داده دارند‪ .‬کاربران ممکن است ديدگاههاي مختلفی نسبت به دادههاي پايگاهداده با توجه امتیازات ويژه‬
‫خود داشته باشند‪ .‬سیستم امنیتی همچنین‪ ،‬توسط رويههاي شناسايی و مجوز‪ ،‬دسترسی به پايگاهداده را محدود میکند‪.‬‬

‫مديريت ذخیرهسازي (‪)Storage Management‬‬


‫‪ DBMS‬مکانیسمهاي خاصی براي ذخیره دائمی داده و دسترسی به منبع فیزيکی و بازيابی داده دارد‪ .‬مدير ذخیرهسازي‬
‫بین داده ذخیره شده در پايگاهداده و برنامه کاربردي و پرسوجوهاي ارسال شده به سیستم واسطه میشود‪.‬‬

‫مديريت قفل (‪)Lock Management‬‬


‫هنگام استفاده اشتراکی از داده انواع مختلفی از قفل روي داده گذاشته میشود (مثل ‪ Read Lock‬و ‪.)Write Lock‬‬
‫مديريت بنبست (‪)Deadlock Management‬‬
‫بنبست وقتی اتفاق میافتد که تراکنشها براي بهدستآوردن منابع در يک دايره بسته قرار گیرند يعنی هر يک منبعی‬
‫در اختیار دارد که مورد تقاضاي ديگري است و درخواست منبعی را میکند که در اختیار تراکنش منتظر منبع است‪.‬‬
‫در پايگاهداده منابع رکوردها هستند‪ .‬مديريت منبع مسئول رفع اين مشکل هستند‪.‬‬

‫‪ 1-1-6‬انواع سیستمهاي مديريت پايگاهداده‬


‫انواع مختلفی از سیستمهاي پايگاهداده وجود دارند که هرکدام بهمنظور خاصی طراحی و پیادهسازي شدهاند‪ .‬دستهبندي‬
‫سیستمهاي پايگاهداده بهصورت زير انجامگرفته است‪:‬‬

‫‪ 1-1-6-1‬سیستم مديريت پايگاهداده توزيع شده‬


‫‪www.takbook.com‬‬

‫‪23‬‬ ‫فصل ‪ / 1‬مباحث بنیادي پايگاهداده‬

‫سیستمهاي توزيع شده (‪ )Distributed DataBase Management System‬بر توزيع داده و همچنین همبستگی فعالیتها‬
‫و کنترل روي اجزاي توزيع شده سیستم داللت دارند‪ .‬اکثر سیستمهاي توزيع شده براي تقسیم کردن بار کاري يا براي‬
‫انتقال عملکردهاي پردازش داده به نزديکی محل انجام اين وظايف است‪ .‬در هر دو حالت هدف نامحسوس بودن‬
‫توزيعشدگی از ديد کاربر است‪.‬‬

‫‪ 1-1-6-2‬سیستم مديريت پايگاهداده بالدرنگ‬

‫سیستمهاي بالدرنگ (‪ )Real-Time DataBase Management System‬سیستمهاي سريع با سرعت پاسخگويی باال هستند‬
‫که زمان انجام کلیه عملیات نقش مهمی در آنها دارد‪ .‬سیستم بالدرنگ در تعامل با دنیاي واقعی پاسخ قابل پیشبینی‬
‫را در قاب زمان میدهد‪ .‬ورودي‪ ،‬پردازش و پاسخها همگی از قبل تعريف شده هستند و حد زمانی مشخصی دارند‬
‫و به نحوي بهینه میشوند که هر حالت ورودي يک حالت خروجی قابلپیشبینی دارد که همیشه در يکزمان و به‬
‫يک روش اتفاق میافتد‪.‬‬

‫‪ 1-1-6-3‬سیستم مديريت پايگاهداده تحملپذير خطا‬

‫سیستم تحملپذير خطا (‪ )Fault Tolerance DataBase Management System‬سرويسهايی را دارد که با ناتوانیهاي‬
‫اجزاي سختافزاري و نرمافزاري برخورد میکند‪ .‬براي رسیدن به اين منظور بايد کلیه نقاطی که احتمال نقصی در‬
‫آنها وجود دارد از قبل بررسی شده‪ ،‬ابزارهايی براي تشخیص‪ ،‬اصالح و يا ترمیم آنها به نحوي طراحی شود که کمترين‬
‫تأثیر را روي برنامههاي کاربردي بگذارند‪ .‬مکانیسمهاي ‪ Shadow Memory ،RAID‬و کپی از جمله روشهايی هستند‬
‫که استفاده میشوند‪.‬‬

‫‪ 1-1-6-4‬سیستم مديريت پايگاهداده امن‬


‫در يک سیستم پايگاهداده مطمئن (‪ )Secure DataBase Management System‬کلیه اعمالی که کاربران و برنامههاي‬
‫کاربردي اجازه دارند انجام دهند همچنین زمان و مقدار انجام آنها کنترل میشوند‪ .‬بهعنوان مثال يک سیستم پرسنلی‬
‫ممکن است درنظرداشته باشد به کلیه کاربران اجازه دستیابی به سابقه پرسنلی خودشان و استخراج اطالعات شغلیشان‬
‫را بدهد اما دسترسی به سابقه کارمندان ديگر يا حتی برخی اطالعات مربوط به خودشان امکانپذير نباشد‪ .‬براي دادن‬
‫چنین سرويسی سیستم پايگاهداده بايد قابلیـت تعريف حقوق دسترسی و رسیدگی به آنها را درقبال کاربرانی که به‬
‫داده دسترسی دارند داشته باشد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪24‬‬

‫‪ 1-1-6-5‬سیستم مديريت پايگاهداده ناهمگون‬


‫سیستم ناهمگون (‪ )Hetrogenouse DataBase Management System‬از ‪DBMS‬هاي مختلف تشکیل شده است‪ .‬براي‬
‫مثال شعب يک شرکت هرکدام منحصراً نیازهاي پردازشی خود را با سختافزار و نرمافزار جداگانه برطرف میکنند‪.‬‬
‫‪HTDBMS‬‬ ‫اگر نیاز باشد اين سیستمها با هم فعلوانفعال داشته باشند و از طريق شبکه به همپیوند داده شوند يک‬
‫ايجاد میشود تا پايگاهدادههاي مختلف با هم ارتباط برقرار کند‪.‬‬
‫‪ 1-1-6-6‬سیستم مديريت پايگاهداده چندرسانهاي‬
‫‪ )Multimedia DataBase‬انواع متنوعی از منابع دادهاي‬ ‫(‪Management System‬‬ ‫سیستمهاي محاسباتی چندرسانهاي‬
‫گرافیکی‪ ،‬تصاوير ويدئويی‪ ،‬صوت و متن را استفاده و يا با هم ترکیب میکنند‪ .‬اين منابع دادهاي پیچیده بايد براي‬
‫سیستم محاسباتی بهسهولت قابلدسترس باشند‪ .‬براي استفاده در برنامههاي کاربردي ‪ interactive‬چنین سیستمهايی از‬
‫ترکیب الزامات پايگاهدادههاي بالدرنگ با سیستمهاي گرافیکی تعاملی استفاده میکنند تا ارائه اطالعات سنکرون شده‬
‫و بالدرنگ حاصل شود‪.‬‬

‫‪ 1-1-6-7‬سیستم مديريت پايگاهداده متحد‬


‫‪ ،Federated‬نسل جديد سیستمهاي مديريت پايگاهداده سعی دارند اطالعات‬ ‫‪DataBase Management System‬‬

‫جمعآوريشده از سنسورها را مستقیماً ذخیره کنند‪ .‬اين سیستمها از پايگاههاي دانش نیز حمايت میکنند‪.‬‬

‫‪ 1-1-7‬کاربران پايگاهداده‬
‫کاربران يک سیستم پايگاهداده توسط روشهايی که با سیستم تعامل میکنند از هم تفکیک میشوند‪.‬‬

‫‪ 1-1-7-1‬تحلیل گران سیستم‬


‫تحلیل گران سیستم (‪ )system analysts‬با گروه کاربران پايگاهداده بهمنظور درک نیازهاي اطالعاتی و پردازشی آنها‬
‫ارتباط دارند‪ .‬نیازهاي اطالعاتی و پردازشی هر گروه را مجتمع میکنند و مستندسازي میکنند‪.‬‬

‫‪ 1-1-7-2‬طراحان پايگاهداده‬
‫طراحان پايگاهداده (‪ )database designers‬ساختار مناسبی را براي نمايش اطالعات مشخص شده توسط تحلیلگر‬
‫‪DDL‬‬ ‫سیستم به طريق نرمالسازي شده بهمنظور تضمین جامعیت و سازگاري داده انتخاب میکنند و با استفاده از‬
‫دادههاي پايگاهداده را تعريف میکنند‪.‬‬
‫‪www.takbook.com‬‬

‫‪25‬‬ ‫فصل ‪ / 1‬مباحث بنیادي پايگاهداده‬

‫‪ 1-1-7-3‬پیاده سازان برنامههاي کاربردي‬


‫‪ )Application‬براي برآوردن نیازهاي کاربران و کار با پايگاهداده‬ ‫(‪Developers‬‬ ‫برنامهنويسان برنامههاي کاربردي‬
‫برنامههايی را آماده میکنند‪ .‬تست‪ ،‬اشکالزدايی و مستندسازي برنامه و پايگاهداده از وظايف برنامهنويسان است‪.‬‬
‫برنامهنويسان با سیستم توسط احکام ‪ DML‬ارتباط برقرار میکنند‪.‬‬

‫‪ 1-1-7-4‬مدير پايگاهداده‬
‫مدير پايگاهداده (‪ )database administrator‬يا به طور خالصه ‪ DBA‬فردي است که مسئول کنترل عملیات کل سیستم‬
‫کلیه فعالیتهاي سیستم پايگاهداده را هماهنگ میکنند‪ .‬اين فرد بايد درک خوبی از منابع و‬ ‫‪DBA‬‬ ‫پايگاهداده است‪.‬‬
‫نیازهاي اطالعاتی کل سازمان داشته باشد و براي حصول اطمینان از اينکه داده موردنیاز قابلدسترس کاربران قرار‬
‫میگیرد با آنها در ارتباط باشد‪.‬‬

‫بعضی از وظايف ‪ DBA‬شامل‪:‬‬

‫‪DDL‬‬ ‫• تعريف شِماها توسط‬


‫‪DDL‬‬ ‫• تعريف ساختار ذخیرهسازي و متدهاي دسترسی توسط‬
‫• اصالح شِما و سازماندهی فیزيکی‬
‫• اعطاي مجوز دسترسی پايگاهداده به کاربران‬
‫• تعیین قیدهاي جامعیت‬
‫• عامل ارتباطی کاربران‬
‫• نظارت اجرا و واکنش براي تغییر درصورت نیاز‬
‫• برقراري ديکشنري داده‬

‫‪ 1-1-7-5‬کاربران نهائی‬

‫کاربران نهائی (‪ )End Users‬شامل‪:‬‬


‫• کاربران پارامتري‪ :‬که توسط برنامههاي کاربردي نوشته شده با سیستم سروکار دارند‪ .‬مانند تحويلدار بانک و‬
‫کارکنان دفتري‪.‬‬
‫• کاربران ماهر‪ :‬که نیازهاي پیچیدهتري دارند و باقابلیتهاي ‪ DBMS‬آشنائی کامل دارند‪ .‬درخواستهاي خود از‬
‫پايگاهداده را توسط يک زبان پرسوجو میسازند‪.‬‬
‫• کاربران نهايی اتفاقی‪ :‬کسانی که دسترسی گاهوبیگاه به پايگاهداده دارند اما ممکن است هر بار نیازهاي متفاوتی‬
‫داشته باشند‪ .‬از زبانهاي پرسوجوي و مرورگرهاي حرفهايتر استفاده میکنند‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪26‬‬

‫‪ 1-1-8‬ديکشنري داده‬
‫قرار میگیرد‪.‬‬ ‫‪DBA‬‬ ‫ديکشنري دادهها (‪ )Data Catalog‬يکی از امکاناتی است که در سیستم پايگاهداده در اختیار‬
‫ديکشنري دادهها که به آن راهنماي سیستم نیز میگويند يک متا داده است يعنی اطالعاتی درباره خود پايگاهداده و‬
‫دادههاي ذخیره شده در آن را نگهداري میکند‪.‬‬
‫ديکشنري داده تعیین میکند چه دادهاي موجود است و چه معنی دارد‪ ،‬داده چگونه ذخیره میشود و در کجا قرار‬
‫دارد‪ ،‬مالک آن چه کسی است و چه کسانی اجازه دسترسی به داده را دارند‪ ،‬تاريخچه و آمار استفاده از داده را در‬
‫بردارد‪.‬‬

‫‪ 1-1-9‬پايگاهداده‪XML‬‬

‫شود ‪.‬‬ ‫يک پايگاهداده ‪ XML‬سیستم نرمافزاري است که اجازه میدهد داده در فرمت ‪ XML‬وارد‪ ،‬پردازش و ارسال‬

‫دارد‪:‬‬ ‫دودسته اصلی پايگاهداده ‪ XML‬وجود‬

‫‪ -‬پايگاه دادهاي که مستند ‪ XML‬را بهعنوان ورودي گرفته به يک پايگاهداده ديگر نظیر رابطهاي تبديل‬ ‫‪XML-enabled‬‬

‫گردند ‪.‬‬ ‫میکند و پس از انجام عملیات آنها را مجددا به ‪ XML‬بر می‬

‫مدل داخلی چنین پايگاهداده اي بر پايه ‪ XML‬است و مستندات ‪ XML‬را بهعنوان منبع‬ ‫)‪- Native XML (NXD‬‬

‫میکند‪.‬‬ ‫ذخیرهسازي مستقیماً استفاده‬

‫دلیل استفاده ‪ XML‬در پايگاهداده شفافیت داده است‪ .‬داده از پايگاهداده استخراج میشود و در مستندات ‪ XML‬قرار‬
‫میشود ‪.‬‬ ‫میگیرد و برعکس‪ .‬به اين صورت هزينه ذخیره داده در فرمت ‪ XML‬هم کمتر‬
‫‪www.takbook.com‬‬

‫فصل دوم‬
‫‪SQL Server 2019‬‬ ‫پیادهسازي‬
‫‪ 2-1‬نیازمنديهاي ‪SQL Server 2019‬‬
‫براي اينکه سرور ‪ SQL‬خود را راهاندازي کنیم‪ ،‬نیاز داريم بدانیم که اين سرور چقدر از منابع سختافزاري ما را قرار‬
‫است مصرف کند‪ ،‬براي همین به جدول ‪ 2-1‬توجه کنید‪.‬‬
‫جدول ‪ 2-1‬نیازمندی سختافزاری‬

‫نیازمندی‬ ‫سختافزار‬
‫نرمافزار ‪ SQL‬براي نصب اولیه نیازمند ‪ 6‬گیگابايت فضا در هارد ديسک است‪ ،‬اما براي يک‬
‫محیط عملیاتی بايد مشخص شود آن سازمان نیازمند چقدر از فضاي هارد ديسک است؛ مثالً‬
‫براي محیطی که داراي ‪ 100‬کارمند است بايد حداقل ‪ 200‬گیگ فضا براي آن در نظر گرفت‪ ،‬البته‬
‫هارد دیسک‬
‫همهي اينها مربوط به کاري است که انجام میدهید‪ ،‬توجه داشته باشید حتماً از ‪RAID‬بندي در‬
‫سرور خود براي هارد ديسک استفاده کنید تا در صورت خرابی هاردها اطالعات شما از دست‬
‫نرود‪.‬‬
‫سرور ‪ SQL‬براي اجرا نیازمند رزولیشن )‪ Super-VGA (800x600‬است‪.‬‬ ‫مانیتور‬

‫براي آپديت نرمافزار ‪ SQL‬و استفاده از بخشهاي ديگر نیازمند اينترنت هستیم‪.‬‬ ‫اینترنت‬

‫حداقل نیازمندي يک گیگبايت است‪ ،‬براي عملکرد بهتر بايد حداقل ‪ 4‬گیگبايت رم براي اين‬
‫سرور در نظر بگیريد‪ ،‬البته در محیط عملیاتی واقعی امروزه‪ ،‬حداقل ‪ 10‬گیگابايت يک انتخاب‬ ‫رم‬

‫ايدهال است‪.‬‬
‫است‪ ،‬اما براي عملکرد بهتر بايد از پردازنده ‪2‬‬ ‫‪1.4 GHz‬‬ ‫حداقل پردازنده ‪ X64‬با سرعت‬
‫سرعت پردازنده‬
‫گیگاهرتز به باال استفاده شود‪.‬‬
‫پردازندههاي امروزي از نوع ‪ Intel‬و ‪ AMD‬به خوبی پاسخگوي نیاز اين نرمافزار هستند‪.‬‬ ‫نوع پردازنده‬

‫نکته‪:‬‬
‫پشتیبانی‬ ‫‪x86‬‬ ‫پشتیبانی میشود و در پردازندههاي‬ ‫‪x64‬‬ ‫فقط در پردازندههاي‬ ‫‪SQL Server‬‬ ‫نصب‬
‫نمیشود که بايد به اين نکته توجه کنید‪.‬‬

‫است‪:‬‬ ‫جدول ‪ 2-2‬نشان میدهد که کدام نسخه هاي ‪ SQL Server 2019‬با کدام نسخههاي ‪ Windows‬سازگار‬
www.takbook.com

SQL Server 2019 ‫آموزش‬ 28


‫ سیستمعامل‬2-2 ‫جدول‬

‫پشتیبانی سیستمعامل‬
Express Web Standard Developer Enterprise SQL ‫نسخههاي مختلف‬
Yes Yes Yes Yes Yes Windows Server 2019 Datacenter
Yes Yes Yes Yes Yes Windows Server 2019 Standard
Yes Yes Yes Yes Yes Windows Server 2019 Essentials
Yes Yes Yes Yes Yes Windows Server 2016 Datacenter
Yes Yes Yes Yes Yes Windows Server 2016 Standard
Yes Yes Yes Yes Yes Windows Server 2016 Essentials
Yes No Yes Yes No Windows 10 IoT Enterprise
Yes No Yes Yes No Windows 10 Enterprise
Yes No Yes Yes No Windows 10 Professional
Windows 10 Home
‫ اشاره کرد که بايد نسخهي مورد نظر آن را که در خود ويندوز ارائه میشود‬. NET Framework ‫ میتوان به‬SQL Server ‫از نیازمنديهاي ديگر‬
.‫ البته اين نرمافزار بهصورت پیشفرض بر روي سرور نصب خواهد شد‬،‫نصب کنید‬
:‫ اجزاي زير بر روي سرور نصب خواهد شد‬SQL Server ‫توجه داشته باشید در هنگام نصب‬
• SQL Server Native Client
• SQL Server Setup support files
‫ نیازمند‬2-3 ‫ هرکدام از اجزا طبق جدول‬،‫ را به همراه اجزاي کامل آن بر روي سرور نصب کنید‬SQL ‫اگر بخواهید‬
.‫فضاي موردنیاز هستند‬
.‫ انتخاب خواهیم کرد‬SQL ‫توجه داشته باشید که اين مورد را در موقع نصب‬
SQL ‫ اجزای‬2-3 ‫جدول‬

‫ویژگی مورد نظر‬ ‫مقدار فضای موردنیاز‬


Database Engine and data files, Replication, Full-Text Search, and Data
1480 MB
Quality Services
Database Engine (as above) with R Services (In-Database) 2744 MB
Database Engine (as above) with PolyBase Query Service for External
4194 MB
Data
Analysis Services and data files 698 MB
Reporting Services 967 MB
Microsoft R Server (Standalone) 280 MB
Reporting Services - SharePoint 1203 MB
Reporting Services Add-in for SharePoint Products 325 MB
Data Quality Client 121 MB
Client Tools Connectivity 328 MB
Integration Services 306 MB
Client Components (other than SQL Server Books Online components and
445 MB
Integration Services tools)
Master Data Services 280 MB
SQL Server Books Online Components to view and manage help content* 27 MB
All Features 8030 MB
‫‪www.takbook.com‬‬

‫‪29‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫نکته‪:‬‬
‫از ديسک با سکتورهاي ‪ 512‬بايت تا ‪ 4‬کیلوبايت پشتیبانی میکند و اگر بخواهید از سکتورهاي‬ ‫‪SQL Server‬‬

‫باالي ‪ 4‬کیلوبايت استفاده کنید‪ ،‬مطمئناً با خطا روبرو خواهید شد‪ ،‬براي دريافت اطالعات بیشتر میتوانید از‬
‫لینک زير استفاده کنید‪.‬‬
‫‪https://support.microsoft.com/en-us/topic/hard-disk-drive-sector-size-support-boundaries-in-sql-server-‬‬
‫‪4d5b73fa-7dc4-1d8a-2735-556e6b60d046‬‬

‫‪ SQL Server‬براي ذخیرهي اطالعات از منابع ذخیرهسازي زير میتواند استفاده کند‪:‬‬
‫‪ -1‬حافظه داخلی سرور يا همان هاردديسک محلی‪.‬‬
‫‪ -2‬محل ذخیرهسازي به اشتراک گذاشته شده در شبکه‪.‬‬
‫‪.SQL Server failover cluster -3‬‬
‫)‪( Storage Spaces Direct (S2D‬تکنولوژي شبیه به ‪ RAID‬که اطالعات ديتابیس در چند سرور قابلدسترس است‪ ،‬اين ويژگی‬ ‫‪-4‬‬
‫همان ‪ Fault Tolerance‬است)‪.‬‬
‫ذخیرهسازي ‪( SMB‬میتوانید از يک ‪ Windows Server‬بهعنوان ‪ FileServer‬براي انکار استفاده کنید)‪.‬‬ ‫‪ -5‬فضاي‬

‫به داليل امنیتی که مايکروسافت اعالم کرده‪ ،‬بهتر است که ‪ SQL Server‬را بر روي ‪ Domain Controller‬نصب نکنید‪،‬‬
‫چون موارد زير را در پی خواهد داشت‪:‬‬
‫‪ -1‬نمیتوانید سرويسهاي ‪ SQL Server‬را در يک ‪ Domain Controller‬تحت اکانت ‪ local service‬اجرا کنید که‬
‫بسیار اذيتکننده خواهد بود‪.‬‬
‫‪ -2‬پس از نصب ‪ SQL Server‬بر روي سیستم مورد نظر‪ ،‬نمیتوانید سیستم مورد نظر را از يک عضو دامنه به يک‬
‫کنترلکنندهي دامنه تغییر دهید؛ قبل از تغییر سیستم میزبان به يک کنترلکنندهي دامنه‪ ،‬بايد ‪ SQL Server‬را حذف نصب‬
‫کنید‪.‬‬
‫‪ -3‬پس از نصب ‪ SQL Server‬بر روي رايانه‪ ،‬نمیتوانید رايانه را از يک کنترلکنندهي دامنه به يک عضو دامنه‬
‫تغییر دهید‪ .‬قبل از تغییر رايانه میزبان به عضو دامنه‪ ،‬بايد ‪ SQL Server‬را حذف و بعد نصب کنید‪.‬‬
‫‪ SQL Server failover cluster -4‬در يک دومین کنترل خواندنی پشتیبانیی نمیشوند‪.‬‬
‫‪ SQL Server -5‬در يک کنترلکنندهي دامنه فقط خواندنی پشتیبانی نمیشود‪ SQL Server Setup .‬نمیتواند گروههاي‬
‫امنیتی يا حسابهاي ارائهدهندهي خدمات ‪ SQL Server‬را در يک کنترلکنندهي دامنهي فقط خواندنی ايجاد کند‪ .‬در‬
‫اين سناريو‪ ،‬نصب ناموفق است‪.‬‬
‫‪ -6‬يک نمونه خوشهي شکستخورندهي ‪ SQL Server‬در محیطی که فقط يک کنترلکنندهي دامنهي فقط خواندنی‬
‫قابلدسترسی است پشتیبانی نمیشود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪30‬‬


‫‪ 2-2‬نصب و راهاندازي ‪ SQL Server 2019‬در ويندوز‬
‫بهتر است يک موضوع بسیار مهم را بررسی کنیم‪ ،‬همانطور که میدانید دو نوع‬ ‫‪SQL Server 2019‬‬ ‫قبل از نصب‬
‫سیستم داريم‪:‬‬
‫‪ -1‬فیزيکی‬
‫‪ -2‬مجازي‬
‫در نظر‬ ‫‪SQL Server‬‬ ‫به طور معمول يک سیستم فیزيکی با رم و هارد و فضاي ذخیرهسازي مناسب را براي نصب‬
‫میگیريد و فکر میکنید بهترين عملکرد را ارائه داديد‪ ،‬اما اگر در اين بین‪ ،‬اطالعات شما از دست برود و هاردديسک‬
‫شما خراب شود‪ ،‬آنوقت چه کاري بايد انجام دهید‪ ،‬آيا به نظر شما استفاده از سیستم فیزيکی براي استفادهي مستقیم‬
‫از ‪ SQL Server‬کار درستی خواهد بود؟‬

‫هرچند میتوانید با روشهايی مانند ‪ Raid‬بندي و روشهاي ديگر جلوي ازبینرفتن اطالعات را بگیريد‪ ،‬اما بهترين‬
‫کار اين است که از مجازيسازي استفاده کنیم و ازروي ماشینی که ايجاد میکنیم‪ ،‬پشتیبان تهیه کنیم تا در موقع‬
‫يک‬ ‫‪SQL‬‬ ‫ازدسترفتن سرور در سريعترين زمان ممکن بتوانیم آن را برگردانیم‪ ،‬البته روشهاي پشتیبانگیري در‬
‫موضوع مفصل خواهد بود که در فصل مربوط به پشتیبانگیري بهصورت کامل به آن خواهیم پرداخت‪.‬‬
‫ما براي اين کتاب سرور مجازي را انتخاب میکنیم‪ ،‬بهترين عملکرد در مجازيسازي را شرکت ‪ VMware‬ارائه میدهد‬
‫و شما میتوانید ماشین مورد نظر خود را توسط نرمافزار ‪ VMware Workstation‬و يا با سیستمعامل ‪ ESXi‬ايجاد کنید‬
‫که کار با اين نرمافزارها را در کتاب ‪ VMware Systems‬به طور کامل توضیح داديم و میتوانید نسخهي الکترونیکی را‬
‫از سايت بنده دريافت کنید‪.‬‬
‫براي اين کتاب ما از يک سرور ‪ ESXi‬استفاده کرديم که روي آن يک ماشین مجازي ايجاد کرديم و سختافزار مناسب‬
‫را براي آن در نظر گرفتیم‪ ،‬بعد از اين کار بر روي آن ويندوز سرور ‪ 2019‬نصب کرديم تا همه چیز براي نصب‬
‫نرمافزار ‪ SQL‬آماده باشد‪.‬‬
‫براي اينکه نرمافزار ‪ SQL Server 2019‬را دانلود کنید میتوانید بهصورت مستقیم از سايت مايکروسافت دانلود کنید و‬
‫يا اينکه آن را از سايتهاي ايرانی دانلود کنید که آدرس آن هم در زير قرار دارد‪:‬‬
‫‪https://soft98.ir/software/programming/3594-microsoft-sql-server-all-2017-full-1.html‬‬
‫بعد از دانلود فايل مورد نظر‪ ،‬بهمانند شکل ‪ 2-1‬بر روي فايل ‪ Setup.exe‬دو بار کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪31‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪ 2-1‬فایل ‪Setup‬‬

‫اولین صفحهاي که به شما نمايش داده میشود‪ ،‬شکل ‪ 2-2‬است که گزينههاي مختلفی را به شما ارائه میدهد‪ ،‬مثالً‬
‫توضیح میدهد و‬ ‫‪SQL Server‬‬ ‫در گزينهي اول اطالعاتی را در مورد سختافزار و نرمافزار موردنیاز براي نصب‬
‫همچنین در گزينههاي ديگر میتوانید موارد ديگر را هم بررسی کنید‪.‬‬
‫بر روي آن هستیم آيا مناسب است يا نه بايد در شکل‬ ‫‪SQL‬‬ ‫براي اينکه متوجه شويم که سیستمی که در حال نصب‬
‫‪ 2-2‬بر روي لینک ‪ System Configuration Checker‬کلیک کنید‪ ،‬تا بهمانند شکل ‪ 2-3‬همهي گزينهها اوکی باشد‪.‬‬

‫شکل ‪ 2-2‬نصب ‪SQL Server‬‬

‫شکل ‪ 2-3‬بررسی نصب ‪SQL‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪32‬‬


‫‪New SQL‬‬ ‫شويد و بر روي‬ ‫‪Installation‬‬ ‫براي اينکه نصب ‪ SQL Server‬را آغاز کنید‪ ،‬بايد بهمانند شکل ‪ 2-4‬وارد‬
‫‪ Server stand-alone installation or add fearure to an existing installation‬کلیک کنید‪.‬‬

‫شکل ‪ 2-4‬نصب ‪SQL‬‬

‫در شکل ‪ 2-5‬بايد سريال نرمافزار را وارد و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 2-5‬سریال برنامه‬

‫‪I‬‬ ‫در شکل ‪ 2-6‬بايد توافقنامهي استفاده از اين نرمافزار را مطالعه و درصورتیکه آن را قبول داريد‪ ،‬تیک گزينهي‬
‫‪ accept the license terms‬را انتخاب و بر روي ‪ Next‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪33‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪ 2-6‬تأیید توافقنامه‬

‫‪SQL‬‬ ‫بهمانند شکل ‪ 2-7‬میتوانید با انتخاب تیک گزينهي … ‪ Use Microsoft Updates To‬آخرين آپديتهاي نرمافزار‬
‫را از سايت مايکروسافت دريافت کنید‪.‬‬

‫شکل ‪ 2-7‬دریافت آپدیت‬

‫در شکل ‪ 2-8‬بررسی اولیه انجام میشود و در اين قسمت همه چیز بايد ‪ Passed‬باشد‪ ،‬اگر به شکل ‪ 2-8‬توجه کنید‪،‬‬
‫متوجه خواهید شد که قسمت ‪ Firewall‬با يک اخطار روبرو شده است و به اين موضوع اشاره دارد که براي استفاده‬
‫از ‪ SQL‬در شبکه بايد پورتهاي مورد نظر آن در فايروال باز باشد که با ياري خدا در ادامه اين کار را انجام خواهیم‬
‫داد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪34‬‬

‫شکل ‪ 2-8‬بررسی نیازمندیهای اولیه‬

‫در شکل ‪ 2-9‬بايد تیک گزينهي ‪ Database Engine‬را انتخاب کنید و همچنین میتوانید مسیر نصب را تغییر دهید‪.‬‬

‫شکل ‪ 2 -9‬انتخاب ‪Feature‬‬

‫در شکل ‪ 2-10‬بايد ‪ Instance‬را مشخص کنید‪ Instance ،‬را بهعنوان يک ظرف در نظر بگیريد که داخل آن میتوانید‬
‫ديتابیس خود را قرار دهید و نرمافزارهاي خاص خود را داشته باشید‪ ،‬مثالً اطالعاتی که در ‪ Instance‬با نام ‪ DB1‬قرار‬
‫را بهعنوان يک مزرعهي جدا‬ ‫‪Instance‬‬ ‫قرار دارد متفاوت است‪ ،‬اصو ًال‬ ‫‪DB2‬‬ ‫با نام‬ ‫‪Instance‬‬ ‫دارد با اطالعاتی که در‬
‫میشناسند که داخل آن میتوانید ديتابیسها و سرويسهای خود را داشته باشید‪ ،‬در شکل ‪ Instance 2-10‬با نام‬
‫پیشفرض ‪ MSSQLSERVER‬قرار دارد که سرویس را بر روی آن فعال یمکنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪35‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪ 2-10‬بررسی ‪Instance‬‬

‫در نظر بگیريد‪ ،‬توجه داشته باشید که آن کاربر‬ ‫‪SQL‬‬ ‫در شکل ‪ 2-11‬بايد يک کاربر را براي اجراي سرويسهاي‬
‫دسترسی الزم در شبکه را داشته باشد‪ ،‬براي همین منظور کاربر ‪ babajani‬که يک کاربر تحت دومین است با دسترسی‬
‫کامل به شبکه وارد شده است و با همین کاربر هم بايد در ادامه وارد ‪ SQL‬شويم‪.‬‬

‫شکل ‪ 2-11‬تنظیم سرور‬

‫‪Add‬‬ ‫داشته باشند که با کلیک بر روي‬ ‫‪Database‬‬ ‫در شکل ‪ 2-12‬بايد مشخص کنید که چه کاربرانی دسترسی به‬
‫هستید‪ ،‬آن را به لیست اضافه کنید و يا اينکه هر کاربر‬ ‫‪SQL‬‬ ‫میتوانید با کاربري که در حال نصب‬ ‫‪Current User‬‬

‫آن را به لیست اضافه کنید‪ ،‬توجه داشته باشید دو حالت احراز‬ ‫‪Add‬‬ ‫ديگري که مورد نظر شماست با کلیک بر روي‬
‫هويت وجود دارد که بهصورت پیشفرض ‪ Windows aythentication mode‬انتخاب شده است و اگر بخواهید کاربر‬
‫‪ sa‬که کاربر پیشفرض در ‪ SQL‬است بايد در اين قسمت گزينه ‪ Mixed Mode‬را انتخاب و يک رمز عبور براي آن در‬
‫نظر بگیريد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪36‬‬

‫شکل ‪ 2-12‬تنظیم دسترسی به دیتابیس‬

‫در شکل ‪ 2-13‬بر روي ‪ Install‬کلیک کنید تا کار نصب آغاز شود‪.‬‬

‫شکل ‪Install SQL 2-13‬‬

‫همانطور که در شکل ‪ 2-14‬مشاهده میکنید نرمافزار ‪ SQL Server‬بهدرستی بر روي سرور نصب شده است‪.‬‬

‫شکل ‪Finish Install 2-14‬‬


‫‪www.takbook.com‬‬

‫‪37‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬


‫اگر بعد از نصب بهمانند شکل ‪ 2-15‬وارد ‪ Services‬شويد‪ ،‬مشاهده خواهید کرد که سرويس ‪ SQL Server‬بهدرستی‬
‫در حال اجرا است‪.‬‬

‫شکل ‪ 2-15‬سرویس ‪SQL Server‬‬

‫را مديريت کنیم‪ ،‬يعنی کاربر جديد‬ ‫‪SQL‬‬ ‫نیاز به يک نرمافزاري داريم تا بتوانیم‬ ‫‪SQL Server‬‬ ‫بعد از نصب نرمافزار‬
‫‪SQL‬‬ ‫تعريف کنیم‪ ،‬دسترسی آن را مشخص کنیم‪ ،‬ديتابیس جديد و موارد ديگر؛ همهي اين کارها توسط نرمافزار‬
‫انجام خواهد گرفت‪ ،‬در نسخههاي جديد اين نرمافزار بهصورت‬ ‫‪SSMS‬‬ ‫يا بهاختصار‬ ‫‪Server Management Tools‬‬

‫جداگانه ارائه میشود و میتوانید از طريق لینک زير آن را دانلود کنید‪:‬‬


‫‪https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-‬‬
‫‪ver15‬‬
‫بعد از ورود به صفحه شکل ‪ 2-16‬بر روي لینک دانلود کلیک کنید تا نرمافزار مورد نظر دانلود شود و بعد از دانلود‬
‫آن را بر روي سرور و يا هر سیستمی که میخواهید نصب کنید‪.‬‬

‫شکل ‪ 2- 16‬دانلود ‪SSMS‬‬

‫بعد از نصب و از طريق منوي ‪ Start‬نرمافزار ‪ SSMS‬را اجرا کنید که بهمانند شکل ‪ 2-17‬صفحه مورد نظر براي شما‬
‫ظاهر خواهد شد‪ .‬در اين صفحه شما بايد در قسمت ‪ ،Server Type‬گزينهي ‪ Database Engine‬را انتخاب کنید که شامل‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪38‬‬


‫ديتابیس شما خواهد بود؛ در قسمت ‪ Server Name‬بايد نام سرور ‪ SQL‬خود را وارد کنید‪ ،‬توجه داشته باشید اگر داخل‬
‫سرور هستید میتوانید از نام ‪ localhost‬نیز استفاده کنید‪ ،‬اما براي دسترسی از بیرون بايد از نام سرور استفاده کنید‪ .‬در‬
‫کرديد‬ ‫‪Login‬‬ ‫قرار دهید با همان نام کاربري که‬ ‫‪Windows Authentication‬‬ ‫نیز اگر بر روي‬ ‫‪Authentication‬‬ ‫قسمت‬
‫وارد خواهد شد که مسلماً بايد دسترسی الزم را داشته باشد و يا اينکه میتوانید از ‪ SQL Server Authentication‬استفاده‬
‫کنید‪.‬‬

‫شکل ‪ 2-17‬ورود به ‪SQL Server‬‬

‫در شکل ‪ 2-18‬يک نماي کلی از نرمافزار ‪ SSMS‬را که به ‪ Database Engine‬متصل شده است را مشاهده میکنید‪ ،‬در‬
‫قسمت ‪ Databases‬میتوانید ديتابیسهاي خود و ديتابیسهايی که توسط نرمافزارهاي ديگر بهصورت اتوماتیک ايجاد‬
‫میشود را مشاهده کنید‪ .‬در قسمت ‪ Security‬بايد کاربران خود را معرفی و دسترسیهاي الزم براي آنها را مشخص‬
‫وجود دارد که براي مانیتور کردن عملکرد سرور‬ ‫‪Object‬‬ ‫يک سري اشیا يا همان‬ ‫‪Server Objects‬‬ ‫کنید؛ در قسمت‬
‫خواهد بود‪ .‬در قسمت ‪ Replication‬نیز يک سري ابزار وجود دارد تا بتوانید ديتابیسها را از يک پايگاهداده به يک‬
‫نیز يک ابزار براي انتقال اطالعات از يک پايگاهداده متفاوت‪،‬‬ ‫پايگاهداده بهصورت درست و امن انتقال دهید‪PolyBase ،‬‬

‫براي ايجاد يک گروه از سرورها براي پايدار‬ ‫‪Always On High Availability‬‬ ‫است؛ گزينهي‬ ‫‪SQL‬‬ ‫به‬ ‫‪Oracle‬‬ ‫مانند‬
‫نگهداشتن ديتابیسها و سرورها است که يک روش جديد در میان روشهاي ديگر است‪ .‬در قسمت ‪ Managemnt‬يک‬
‫بسیار‬ ‫‪SQL‬‬ ‫گیري و موارد ديگر که در مديريت‬ ‫‪LOG‬‬ ‫سري ابزار وجود دارد‪ ،‬مانند پشتیبانگیري از ديتابیسها‪،‬‬
‫نیز براي يکپارچهسازي دادهها در سازمان شما است‬ ‫‪Inetgaration Service Catalog‬‬ ‫کمککننده خواهد بود؛ قسمت‬
‫براي انجام‬ ‫‪SQL Agent‬‬ ‫که با ياري خدا همهي اين گزينهها را در ادامه توضیح خواهیم داد و در آخر نیز سرويس‬
‫پشتیبانگیري و کارهايی ديگر موردنیاز است‪.‬‬
‫‪www.takbook.com‬‬

‫‪39‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪SQL Server Management Studio 2-18‬‬

‫اولین قسمتی که بررسی میکنیم ‪ Databases‬است‪ ،‬بهمانند شکل ‪ ،2-19‬بعد از بازکردن قسمت ‪ ،Databases‬دو گزينه‬
‫را مشاهده میکنید‪ ،‬يکی ‪ Systems‬و ديگري ‪ Database Snapshots‬است؛ در قسمت ‪ ،Systems‬چهار ديتابیس را مشاهده‬
‫میکنید که بهصورت پیشفرض ايجاد میشوند‪.‬‬

‫شکل ‪ 2-19‬بررسی ‪Database‬‬

‫جدول ‪ 2-4‬دیتابیسهای سیستم‬

‫توضیحات‬ ‫ديتابیس سیستم‬


‫است و اگر از دست برود با مشکل‬ ‫‪SQL‬‬ ‫بهعنوان قلب تپنده‬ ‫‪Master‬‬ ‫پايگاهداده‬ ‫‪master‬‬

‫مواجه خواهید شد‪ ،‬ديتابیس ‪ Master‬شامل اطالعاتی حیاتی زير است‪:‬‬


‫زمانی که يک کاربر ايجاد میکنید‪ ID ،‬آن در اين ديتابیس قرار میگیرد‪.‬‬ ‫•‬

‫تمام رويدادها يا همان ‪Log‬ها در اين ديتابیس قرار میگیرد‪.‬‬ ‫•‬

‫نام و اطالعات مربوط به پايگاه دادهها‪.‬‬ ‫•‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪40‬‬


‫خطاهاي سیستم و تمام پیامهاي موجود در سرور‪.‬‬ ‫•‬

‫مقداردهی اولیهي ‪. SQL Server‬‬ ‫•‬

‫پايگاه دادههاي محلی‪.‬‬ ‫•‬

‫جدولهاي خاص پايگاه دادهها‪.‬‬ ‫•‬

‫همانطور که از اسم آن مشخص است‪ ،‬يک پايگاهداده موقت است‪ ،‬زمانی که شما‬ ‫‪tempdb‬‬

‫را اجرا میکنید‪ ،‬اطالعات موقت در اين پايگاهداده قرار‬ ‫‪Server SQL‬‬ ‫‪2019‬‬
‫میگیرد‪ ،‬مثالی که در اين رابطه میتوان زد‪ ،‬مانند ‪ RAM‬سیستم‬
‫شما که زمانی نرمافزاري را اجرا میکنید‪ ،‬اطالعات بهصورت موقت در اين حافظه‬
‫قرار میگیرد و بعد از بستن نرمافزار‪ ،‬اطالعات نیز از حافظه پاک میشوند‪.‬‬
‫اجرا میکنید‪ ،‬اطالعات اين دستور بهصورت‬ ‫‪SQL‬‬ ‫زمانی که يک دستور را در‬
‫موقت در اين پايگاهداده قرار میگیرد و پردازش میشود و طول عمر آن به کار‬
‫کاربر مورد نظر برمیگردد‪.‬‬
‫اين پايگاهداده بهعنوان يک الگو در نظر گرفته میشود‪ ،‬يعنی اينکه يک سري‬ ‫‪model‬‬

‫استانداردهايی در آن تعريف شده است که همهي پايگاه دادهها از آن استاندارد‬


‫پیروي میکنند‪ .‬مجموعههاي از پیش تعیینشده در اين پايگاه وجود دارد که براي‬
‫ساخت پايگاه دادههاي ديگر به کار میرود‪ ،‬مانند حجم پايگاه دادهها‪ ،‬اندازهي‬
‫جدولها و موارد ديگر‪.‬‬
‫در آن نگهداري‬ ‫‪System Object‬‬ ‫يک پايگاهدادهي فقط خواندنی که اطالعات‬ ‫‪Resource‬‬

‫میشود‪ ،‬البته در لیست ظاهري وجود ندارد‪.‬‬


‫در اين پايگاهداده يک سري کارهاي از پیش تعیینشده قرار دارد اين کارها میتواند‬ ‫‪msdb‬‬

‫پشتیبانگیري و يا بازگردانی اطالعات باشد که اين کار بدون دخالت کسی و‬


‫بهصورت خودکار انجام میشود‪.‬‬

‫در باالي نرمافزار چندين منو قرار دارد که با هم آنها را بررسی میکنیم‪:‬‬
‫در منوي فايل میتوانید با کلیک بر روي ‪ Connect Object Explorer‬به ديتابیس جديد خود متصل شويد و يا با انتخاب‬
‫گزينهي ‪ ،Disconnect‬ارتباط را قطع کنید؛ گزينههاي ديگر براي ايجاد پروژهي جديد و يا بازکردن پروژههاي قبلی‬
‫است؛ در قسمت ‪ Recent Projects and Solutuin‬میتوانید آخرين پروژههايی را که باز کرديد را مشاهده کنید‪.‬‬
‫در منوي ‪ Edit‬میتوانید اطالعات را جستجو‪ ،‬کپی‪ ،‬حذف و‪ ...‬کنید‪.‬‬
‫در منوي ‪ ،View‬گزينهي ‪ Explorer Object‬ابزاري براي نمايش کلی ديتابیسها‪ ،‬سرويسها و‪ ...‬است که اگر به نرمافزار‬
‫توجه کنید در سمت چپ‪ ،‬اين ابزار را میتوانید ببینید؛ گزينهي ‪ Details Explorer Object‬ابزاري است زيرمجموعهي‬
‫که اطالعات داخلی آن را نمايش میدهد‪.‬‬ ‫‪Explorer Object‬‬ ‫ابزار‬
‫‪www.takbook.com‬‬

‫‪41‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬


‫گزينهي ‪ ،Explorer Solution‬ابزاري که در سمت راست برنامه ظاهر میشود و براي نمايش اطالعات پروژهي شما‬
‫ايجاد شده است؛ اين پروژهها میتواند پروژههاي در ‪ Visual Studio‬شما باشد‪.‬‬
‫گزينهي ‪ ،Window Bookmark‬اين ابزار مفید براي ايجاد ‪Bookmark‬هايی در کد است که شما را سريع به کد مورد‬
‫نظر در پروژه میرساند‪.‬‬
‫گزينهي ‪ ،Explorer Utility‬ابزاري براي مديريت پايگاهدادهها و نظارت کلی بر روي آنها در داخل سازمان و يا‬
‫سازمانهايی در فواصل دورتر از آن است‪.‬‬
‫منوي ‪ ،Debug‬اين منو براي کنترل پروژه است و براي بررسی و اشکالزدايی پروژه کاربرد دارد که در خالل کار بیشتر‬
‫با آن آشنا خواهیم شد‪.‬‬
‫منوي ‪ ،Tools‬با استفاده از ‪ Profiler Server SQL‬میتوانیم تمام ‪Log‬هاي مربوط به پروژه را در مسیر مشخصی ذخیره‬
‫کنیم تا بتوانیم در صورت مواجهشدن با مشکل آنها را بررسی کنیم‪.‬‬
‫اگر در منوي فايل بر روي ‪ Options‬کلیک کنید‪ ،‬میتوانید تنظیمات کلی نرمافزار ‪ SQL‬را مشاهده و آنها را تغییر دهید‪.‬‬

‫‪ 2-3‬دسترسی از طريق شبکه به ‪SQL Server‬‬


‫شايد شما در سازمان خود احتیاج داشته باشید که همزمان چندين کاربر به ‪ SQL‬سرور شما متصل شوند و اين کار‬
‫نیاز به فعالکردن دسترسی از طريق شبکه به ‪ SQL‬است‪.‬‬
‫شما میتوانید سرور ‪ SQL‬خود را عضو شبکه دومین خود کنید و به کاربرانی که نیاز به دسترسی به پايگاهداده دارند‪،‬‬
‫دسترسی الزم را اعمال کنید‪.‬‬
‫‪SQL Server‬‬ ‫براي شروع بايد وارد سرور ‪ SQL‬خود شويد و گزينهي ‪ Configuration‬را در جستجو وارد کنید و ابزار‬
‫‪ 2019 Configuration Manager‬را بهمانند شکل ‪ 2-20‬اجرا کنید‪.‬‬

‫شکل ‪ 2-20‬سرویس ‪Configuration‬‬

‫در شکل ‪ ،2-21‬از سمت چپ وارد ‪ SQL Server network Configuration‬شويد و بر روي گزينهي مورد نظر کلیک‬
‫کنید تا لیست آن باز شود‪.‬‬
‫در لیست مورد نظر بر روي ‪ TCP/IP‬دو بار کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪42‬‬

‫شکل ‪ 2-21‬تنظیم پروتکل دسترسی‬

‫در شکل ‪ 2-22‬و در تب ‪ ،Protocol‬گزينهي ‪ Enabled‬را در حالت ‪ Yes‬قرار دهید و وارد تب ‪ IP Addresses‬شويد‪.‬‬

‫شکل ‪ 2-22‬بررسی ‪TCP/IP‬‬

‫بهمانند شکل ‪ ،2-23‬در تب ‪ IP addresses‬و در قسمتی که ‪ IP‬سرور شما مشخص شده است بايد دو گزينهي اول را‬
‫قرار دهید و در قسمت ‪ ،TCP Port‬شمارهي پورت ‪ 1433‬را وارد کنید‪ ،‬زمانیکه اين پورت را وارد‬ ‫‪Yes‬‬ ‫در حالت‬
‫میکنید بايد آن را در ‪ Firewall‬سیستم خود باز کنید تا کاربران بتوانند از طريق شبکه به ‪ SQL‬دسترسی داشته باشند‪.‬‬
‫(در صورت خاموش بودن ‪ Firewall‬نیاز به اين کار نیست)‪.‬‬

‫شکل ‪ 2-23‬تنظیم ‪TCP/IP‬‬

‫براي اينکه تنظیمات پورت بر روي همهي گزينهها انجام شود‪ ،‬بهتر است در پايین شکل ‪ 2-23‬گزينهي ‪ TCP Port‬را‬
‫بهمانند شکل ‪ 2-24‬بر روي ‪ 1433‬قرار دهید‪.‬‬
‫‪www.takbook.com‬‬

‫‪43‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪2-24‬‬

‫براي تست عملکرد ارتباطی با ‪ SQL‬از طريق شبکه‪ ،‬در يکی از کالينتهايی که عضو شبکه است نرمافزار ‪ SSMS‬را‬
‫نصب و اجرا میکنیم‪.‬‬
‫همانطور که در شکل ‪ 2-25‬مشاهده میکنید در قسمت ‪ ،Server Name‬نام سرور ‪ SQL‬خود را وارد کرديم و بعد از‬
‫کلیک بر روي ‪ Connect‬با خطاي مورد نظر روبرو شديم؛ اين خطا چند دلیل میتواند داشته باشد‪:‬‬
‫‪ -1‬شبکه در دسترس نباشد‪.‬‬
‫‪ Firewall -2‬مربوط به سرور ‪ SQL‬روشن باشد و جلوي ورود را بگیرد‪.‬‬
‫‪ -3‬تنظیمات سرور ‪ SQL‬مشکلی داشته باشد‪.‬‬

‫شکل ‪ 2-25‬خطای ورود به ‪SQL Server‬‬

‫در گزينهي اول که بايد براي تست يکی از سرورهاي ديگر در شبکه را تست بگیريد‪ ،‬توجه کنید که آن را میبینید يا‬
‫نه‪ ،‬اگر اوکی بود که هیچ‪ ،‬اگر نه که بايد شبکه را بهصورت فیزيکی بررسی کنید‪ ،‬شايد کابل يا کارت شبکه ايراد دارد‬
‫و يا مشکل نرمافزاري است‪.‬‬
‫در گزينهي دوم بايد وارد سرور ‪ SQL‬شويد و سرويس ‪ Firewall‬را اجرا کنید‪ ،‬براي اين کار بايد بهمانند شکل ‪2-26‬‬
‫بر روي ‪ Advanced settings‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪44‬‬

‫شکل ‪ 2-26‬تنظیم فایروال‬

‫در شکل ‪ 2-27‬براي اينکه به ترافیک ورودي به سرور ‪ SQL‬دسترسی الزم دهید بايد بر روي ‪ Inbound Rules‬کلیک‬
‫کنید و در صفحهي باز شده بر روي ‪ New Rule‬کلیک کنید‪.‬‬

‫شکل ‪ 2-27‬تنظیم فایروال‬

‫در شکل ‪ 2-28‬بايد گزينهي ‪ Port‬را انتخاب و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 2-28‬تنظیم ‪Port SQL‬‬

‫در شکل ‪ 2-29‬بايد گزينهي ‪ TCP‬را انتخاب کنید و در قسمت ‪ ،Spicific Local ports‬پورت ‪ 1433‬مربوط به ‪ SQL‬را‬
‫وارد کنید تا درخواستهايی که از بیرون به داخل سرور با اين پورت وارد میشود‪ ،‬مجوز دسترسی داشته باشد‪.‬‬
‫‪www.takbook.com‬‬

‫‪45‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪ 2-29‬تنظیم ‪Port SQL‬‬

‫در شکل ‪ 2-30‬بايد گزينهي ‪ Allow the connection‬را انتخاب کنید‪.‬‬

‫شکل ‪ 2-30‬دسترسی به ‪Port‬‬

‫در شکل ‪ 2-31‬بايد مشخص کنید که اين دسترسی در چه قسمتی اعمال شود‪ ،‬اگر چنانچه کالينت شما در منطقهي‬
‫دومین قرار دارد بايد فقط گزينهي دومین را انتخاب کنید‪ ،‬اما اگر کالينت در منطقهي ديگر‪ ،‬مثالً در ‪ Workgroup‬قرار‬
‫داشته باشد‪ ،‬نمیتواند به ‪ SQL‬متصل شود‪.‬‬

‫شکل ‪ 2-31‬دسترسی به ‪Port‬‬


‫يک نام بهمانند شکل ‪ 2-32‬وارد کنید و بر روي ‪ Finish‬کلیک کنید تا ‪ Rule‬مورد نظر ايجاد شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪46‬‬

‫شکل ‪ 2-32‬دسترسی به ‪Port‬‬

‫از‬ ‫‪SQL‬‬ ‫بايد از طريق کالينت تست بگیريم تا ببینیم میتوانیم به سرور‬ ‫‪SQL‬‬ ‫در فايروال سرور‬ ‫‪Rule‬‬ ‫بعد از ايجاد‬
‫طريق شبکه متصل بشويم يا نه؛ براي اين کار ‪ SQL Server Management Studio‬را طبق شکل ‪ 2-33‬اجرا‬
‫کنید و در قسمت ‪ Server Name‬بايد نام سرور ‪ SQL‬خود را وارد و بر روي ‪ Connect‬کلیک کنید‪.‬‬

‫شکل ‪ 2-33‬ورود به ‪SQL Server‬‬

‫اگر مشکلی در ارتباط شبکه و دومین شما وجود نداشته باشد بهراحتی به سرور ‪ SQL‬متصل خواهید شد‪ ،‬اما اگر طبق‬
‫شکل ‪ 2-34‬با خطا روبرو شديد‪ ،‬بايد دوباره وارد فايروال سرور ‪ SQL‬شويد و منطقهي کاري را تغییر بدهید‪.‬‬

‫شکل ‪ 2-34‬خطای ورود به ‪SQL‬‬

‫را‬ ‫‪Properties‬‬ ‫مورد نظر خود کلیک راست و گزينهي‬ ‫‪Rule‬‬ ‫شويد و بر روي‬ ‫‪SQL‬‬ ‫طبق شکل ‪ 2-35‬وارد فايروال‬
‫انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪47‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪ 2-35‬بررسی ‪Firewall‬‬

‫در شکل ‪ 2-36‬وارد تب ‪ Advanced‬شويد و تیک گزينهي ‪ Private‬را انتخاب و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪ 2-36‬دسترسی ‪Private‬‬

‫همانطور که در شکل ‪ 2-37‬مشاهده میکنید بهدرستی توانستیم به سرور ‪ SQL‬از طريق شبکه متصل شويم‪.‬‬

‫شکل ‪ 2-37‬متصل شدن به ‪SQL‬‬

‫شايد در سازمان خود چندين سرور ‪ SQL‬داشته باشید و به همهي آنها از طريق شبکه متصل میشويد‪ ،‬براي راحتی‬
‫کار خود بهتر است يک گروه ايجاد کنید و همهي آنها را در گروه مورد نظر خود قرار دهید‪.‬‬
‫براي اين کار در نرمافزار ‪ SQL Management Studio‬بهمانند شکل ‪ 2-38‬وارد منوي ‪ View‬شويد و بر روي گزينهي‬
‫‪ Registered Servers‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪48‬‬

‫شکل ‪Register Server 2-38‬‬

‫در شکل ‪ 2-39‬بر روي ‪ Local Server Groups‬کلیک راست کنید و گزينهي ‪ New Server Group‬را انتخاب کنید‪.‬‬

‫شکل ‪Register Server 2-39‬‬

‫در شکل ‪ 2-40‬بايد يک اسم براي گروه خود وارد کنید و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪Register Server 2-40‬‬

‫را‬ ‫‪New Server Registration‬‬ ‫بر روي نام گروهی که ايجاد کرديد‪ ،‬طبق شکل ‪ 2-41‬کلیک راست کنید و گزينهي‬
‫انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪49‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪Register Server 2-41‬‬

‫در شکل ‪ 2-42‬بايد نام سرور را در قسمت ‪ Server name‬وارد کنید و بر روي ‪ Save‬کلیک کنید‪.‬‬

‫شکل ‪Register Server 2-42‬‬

‫همانطور که در شکل ‪ 2-43‬مشاهده میکنید‪ ،‬سرور به لیست اضافه شده است و با کلیک بر روي آن بهراحتی به‬
‫سرور ‪ SQL‬متصل خواهید شد‪.‬‬

‫شکل ‪Register Server 2-43‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪50‬‬


‫‪ 2-4‬نصب و راهاندازي ‪ SQL Server 2019‬در لینوکس ‪Ubuntu‬‬
‫را بر روي ويندوز نصب کنیم و آن را اجرا و از راه دور به آن متصل شويم‪ ،‬اما‬ ‫‪SQL‬‬ ‫تا به اينجا توانستیم نرمافزار‬
‫شرکت مايکروسافت در نسخههاي جديد خود‪ ،‬توانايی نصب ‪ SQL‬را بر روي سیستمعامل لینوکس فعال کرده است‬
‫که با هم در اين قسمت نحوهي راهاندازي آن را فرا خواهیم گرفت‪.‬‬
‫براي شروع کار بايد يک نسخه از سیستم عامل لینوکس که واقعاً هم زياد است را انتخاب کنید؛ براي اين قسمت‪،‬‬
‫‪ Linux Ubuntu‬را انتخاب میکنیم‪ .‬براي دانلود ‪ Linux Ubuntu‬میتوانید از لینک زير استفاده کنید‪.‬‬
‫‪https://ubuntu.com/download/desktop‬‬

‫بعد از دانلود لینوکس ‪ Ubuntu‬بايد آن را پیادهسازي کنید‪ ،‬بهترين کار اين است که از يک نرمافزار مجازيسازي‪ ،‬مانند‬
‫‪ VMware Workstation‬و يا برنامهي ديگر براي اين کار استفاده کنید تا سهولت دسترسی و عملکرد بهتري را شاهد‬
‫باشید‪ ،‬اگر برنامه ‪ VMware Workstation‬را در دسترس نداريد میتوانید از لینک زير آن را دانلود کنید‪:‬‬
‫‪https://soft98.ir/os/virtual-machine/1232-vmware-workstation.html‬‬

‫‪New‬‬ ‫شويد و گزينهي‬ ‫‪File‬‬ ‫بعد از دانلود‪ ،‬آن را نصب کنید و براي آغاز کار بايد بهمانند شکل ‪ 2-44‬وارد منوي‬
‫‪ Virtual Machine‬را انتخاب کنید‪.‬‬

‫شکل ‪ 2-44‬ایجاد ماشین مجازی‬

‫در شکل ‪ 2-45‬گزينهي ‪ Typical‬را انتخاب و بر روي ‪ Next‬کلیک کنید‪.‬‬


‫‪www.takbook.com‬‬

‫‪51‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪ 2-45‬ایجاد ماشین مجازی‬

‫در شکل ‪ 2-46‬بايد فايل ‪ ISO‬مربوط به لینوکس ‪ Ubuntu‬را که لینک آن را در قسمت پیش قرار داديم معرفی کنید‪،‬‬
‫بعد از معرفی بهصورت اتوماتیک نوع سیستمعامل در زير آن مشخص خواهد شد‪.‬‬

‫شکل ‪ 2-46‬ایجاد ماشین مجازی‬

‫در شکل ‪ 2-47‬بايد اطالعات تکمیلی را وارد کنید‪ ،‬مانند نام کاربري و رمز عبور براي لینوکس ‪.Ubuntu‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪52‬‬

‫شکل ‪ 2-47‬ایجاد ماشین مجازی‬

‫در شکل ‪ 2-48‬بايد نام ماشین مجازي خود به همراه آدرس ذخیرهسازي آن در هاردديسک را مشخص کنید‪.‬‬

‫شکل ‪ 2-48‬ایجاد ماشین مجازی‬

‫در شکل ‪ 2-49‬بايد مقدار فضاي هاردديسک را مشخص کنید که براي اين سیستمعامل‪ 20 ،‬گیگابايت کفايت میکند‬
‫و براي اينکه هاردديسک مجازي فقط يک فايل تکی باشد بايد گزينهي‪ Store Virtual disk as single Files‬را انتخاب‬
‫کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪53‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪ 2-49‬ایجاد ماشین مجازی‬

‫در شکل ‪ 2-50‬اطالعات کلی را مشاهده میکنید که اگر نیاز باشد تغییراتی در سختافزار اعمال کنید و يا اينکه‬
‫کلیک کنید‪ ،‬در پايان براي‬ ‫‪Customize Hradware‬‬ ‫بخواهید سختافزار جديد به اين ماشین اضافه کنید بايد بر روي‬
‫اينکه ماشین بعد از ايجاد شدن‪ ،‬روشن شود تیک گزينهي ‪ Power on.‬را انتخاب کنید‪.‬‬

‫شکل ‪ 2-50‬ایجاد ماشین مجازی‬

‫بعد از اجراي ماشین مورد نظر مراحل نصب بهصورت اتوماتیک انجام خواهد شد‪ ،‬اما بهمانند شکل ‪ 2-51‬چون نام‬
‫کاربري ‪ admin‬يک نام رزرو شده است بايد يک نام جديد‪ ،‬وارد و رمز آن را مشخص کنید و بر روي ‪ Continue‬کلیک‬
‫کنید تا کار نصب به پايان برسد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪54‬‬

‫شکل ‪ 2-51‬نصب سیستمعامل لینوکس‬

‫در ادامهي کار و بعد از نصب کامل لینوکس ‪ Ubuntu‬بايد بهمانند شکل ‪ 2-52‬بر روي ‪ Show Applications‬کلیک کنید‬
‫و در کادر جستجو‪ Terminal ،‬را اجرا کنید‪.‬‬

‫شکل ‪ 2-52‬لینوکس ‪Ubuntu‬‬

‫بعد از اجرا شدن سرويس بايد بهمانند شکل ‪ 2-53‬کاربر ‪ Root‬را فعال کنید‪ ،‬براي اين کار از دو دستور زير استفاده‬
‫کنید‪:‬‬
‫‪sudo passwd root‬‬
‫‪sudo passwd -u root‬‬
‫وارد کنید تا بتوانید از آن‬ ‫‪Root‬‬ ‫توجه داشته باشید بعد از اجراي دستور اول بايد يک رمز عبور جديد براي کاربر‬
‫استفاده کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪55‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪ 2-53‬فعالسازی کاربر ‪root‬‬

‫در ادامهي کار با دستور ‪ ،sudo –i‬کاربر را به ‪ root‬تغییر دهید تا بتوانید دستورات مورد نظر خود را با باالترين دسترسی‬
‫اجرا کنید‪.‬‬

‫شکل ‪ 2-54‬اجرای کاربر ‪root‬‬

‫براي فعالسازي ‪ SQL Server‬بر روي لینوکس ‪ Ubuntu‬بايد دستورات زير را وارد کنید‪.‬‬
‫دو دستور زير آخرين آپديتها را بر روي لینوکس ‪ Ubuntu‬نصب میکند تا در ادامه بتوانید‪ ،‬دستورات را بهراحتی‬
‫اجرا کنید که نتیجهي آن را در شکل ‪ 2-55‬مشاهده میکنید‪.‬‬
‫‪sudo apt-get update‬‬
‫‪sudo apt-get -y upgrade‬‬

‫شکل ‪ 2-55‬آپدیت لینوکس ‪Ubuntu‬‬

‫با دستور زير‪ ،‬بعد از اينکه آپديتها فعال شدند لینوکس را يکبار ‪ Restart‬کنید‪.‬‬

‫‪sudo reboot‬‬
‫بعد از اجرا شدن سرور مجازي لینوکس‪ ،‬وارد ترمینال شويد و دستور زير را براي فعالسازي ‪ repository‬اجرا کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪56‬‬


‫‪sudo wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo‬‬
‫‪apt-key add -‬‬
‫همانطور که در شکل ‪ 2-56‬مشاهده میکنید‪ ،‬دستور مورد نظر بهدرستی اجرا شده است‪.‬‬

‫شکل ‪ 2-56‬فعالسازی ‪Repository‬‬

‫در ادامهی کار با دستور زير‪ Repository ،‬يا همان مخزن مربوط به ‪ SQL Server‬را دانلود و فعال میکنیم‪ ،‬اگر به شکل‬
‫‪ 57-2‬دقت کنید اين دستور بهدرستی اجرا شده است‪.‬‬

‫‪sudo add-apt-repository "$ (wget -qO-‬‬


‫")‪https://packages.microsoft.com/config/ubuntu/18.04/mssql server-2019.list‬‬

‫شکل ‪ 2-57‬نصب ‪Repository‬‬

‫در ادامهي کار با دستور زير‪ MSSQL Server ،‬را بر روي لینوکس ‪ Ubuntu‬نصب کنید‪:‬‬
‫‪sudo apt update‬‬
‫‪sudo apt install mssql-server‬‬
‫همانطور که در شکل ‪ 2-58‬مشاهده میکنید‪ ،‬دستورات باال اجرا و ‪ MSSQL‬نصب شده است که در ادامه بايد آن را‬
‫تنظیم کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪57‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪ 2-58‬نصب ‪MSSQL‬‬

‫براي تنظیم و استارت سرویس ‪ MSSQL‬باید دستور زیر را وارد کنید‪:‬‬


‫‪/opt/mssql/bin/mssql-conf setup‬‬
‫با اجرای دستورر باال‪ ،‬شکل ‪ 2-59‬ظاهر خواهد شد که باید یک نسخه از ‪ SQL‬سرور را انتخاب کنید که در اینجا گزینهی یک را انتخاب میکنیم‪.‬‬

‫شکل ‪ 2-59‬اجرای سرویس ‪MSSQL‬‬

‫بعد از وارد کردن عدد يک بايد کلمهي ‪ Yes‬را بهمانند شکل ‪ 2-60‬براي تأيید اليسنس برنامه وارد کنید تا کار ادامه‬
‫پیدا کند‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪58‬‬

‫شکل ‪ 2-60‬اجرای سرویس ‪MSSQL‬‬

‫در ادامه بهمانند شکل ‪ 2-61‬بايد يک رمز عبور براي مديريت ‪ SQL‬وارد کنید‪ ،‬بعد از آن سرويس ‪ SQL‬اجرا خواهد‬
‫شد‪.‬‬

‫شکل ‪ 2-61‬اجرای سرویس ‪SQL‬‬

‫براي اينکه متوجه شويم‪ ،‬سرويس فعال شده است يا نه بايد دستور زير را وارد کنید‪ ،‬تا شکل ‪ 2-62‬ظاهر شود‪.‬‬
‫‪systemctl status mssql-server.service‬‬
‫‪www.takbook.com‬‬

‫‪59‬‬ ‫‪SQL Server 2019‬‬ ‫فصل ‪ / 2‬پیادهسازي‬

‫شکل ‪ 2-62‬سرویس ‪SQL‬‬

‫در ادامهي کار بايد ابزار مورد نیاز را بر روي سرور لینوکس براي کار با ‪ SQL‬نصب کنید؛ براي اين کار دستورات زير‬
‫را به صورت متوالی اجرا کنید‪:‬‬
‫‪curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -‬‬

‫> ‪curl https://packages.microsoft.com/config/ubuntu/19.10/prod.list‬‬


‫‪/etc/apt/sources.list.d/mssql-release.list‬‬

‫‪sudo apt update‬‬

‫‪sudo ACCEPT_EULA=Y apt-get install mssql-tools unixodbc-dev‬‬

‫با اجراي دستورات باال بهمانند شکل ‪ 2-63‬ابزار مربوط به ‪ SQL‬بر روي لینوکس نصب میشود‪.‬‬

‫شکل ‪ 2-63‬نصب ابزار ‪SQL‬‬

‫را وارد کنید تا ابزار ‪ MSSQL‬که‬ ‫‪Yes‬‬ ‫در ادامهي دستورات در قسمتی که در شکل ‪ 2-64‬مشخص شده است بايد‬
‫حجمی حدود ‪ 102‬مگابايت دارد بر روي سرور لینوکس نصب شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪60‬‬

‫شکل ‪ 2-64‬نصب ابزار ‪SQL‬‬

‫در ادامهي کار‪ ،‬دو دستور زير را وارد کنید تا کار نصب و تنظیم ‪ SQL‬به پايان برسد‪:‬‬
‫‪echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile‬‬

‫‪echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc‬‬


‫‪source ~/.bashrc‬‬
‫بعد از نصب ‪ SQL‬و ابزارهاي آن بر روي سرور لینوکس‪ ،‬حال میتوانید بر روي ‪ SQL‬کار کنید‪ ،‬براي تست کارايی‬
‫سرويس ‪ SQL‬دستور زير را وارد کنید تا به آن متصل شويد‪:‬‬
‫‪sqlcmd -S 127.0.0.1 -U SA‬‬
‫همانطور که در شکل ‪ 2-65‬مشاهده میکنید‪ ،‬بعد از اجراي دستور باال از ما رمز عبوري را میخواهد که در هنگام‬
‫نصب ‪ SQL‬وارد کرديم‪ ،‬يعنی شکل شمارهي ‪2-61‬؛ بعد از وارد کردن رمز عبور حاال وارد خط فرمان ‪ SQL‬شديم و‬
‫میتوانیم دستورات مورد نظر را اجرا کنیم‪ .‬براي تست دستور زير را اجرا میکنیم‪:‬‬
‫;‪select name from sys.databases‬‬
‫‪go‬‬
‫با اجراي دستور باال‪ ،‬لیست ديتابیسهاي اصلی و مربوط به تنظیمات خود ‪ SQL‬را مشاهده میکنید که در مورد اين‬
‫ديتابیسها در فصل سوم بهصورت کامل صحبت خواهیم کرد‪.‬‬

‫شکل ‪ 2-65‬لیست دیتابیس ‪SQL‬‬


‫‪www.takbook.com‬‬

‫فصل سوم‬
‫آشنايی با پايگاهداده‬
‫‪ 3-1‬ايجاد پايگاهداده و کار با آن‬
‫‪ 3-1-1‬ايجاد پايگاهداده‬
‫در ادامهي کار میخواهیم براي شروع‪ ،‬يک ديتابیس ايجاد و بر روي آن کارهاي مختلفی را انجام میدهیم‪ ،‬ايجاد‬
‫ديتابیس را میتوانیم به دو صورت انجام دهیم‪ ،‬يکی بهصورت گرافیکی و از طريق نرمافزار ‪ SSMS‬و يکی از طريق‬
‫کد ‪ T-SQL‬که در ادامه هر دو روش را بررسی خواهیم کرد‪.‬‬
‫‪New‬‬ ‫کلیک راست کنید و بر روي‬ ‫‪Databases‬‬ ‫شويد و بر روي‬ ‫‪SSMS‬‬ ‫براي شروع بهمانند شکل ‪ 3-1‬وارد‬
‫‪ Database‬کلیک کنید‪.‬‬

‫شکل ‪ 3-1‬ایجاد دیتابیس‬

‫در شکل ‪ 3-2‬بايد نام ديتابیس مورد نظر خود را در قسمت ‪ Database Name‬وارد کنید و در قسمت ‪ Owner‬بايد يک‬
‫کاربر را بهعنوان صاحب اين ديتابیس انتخاب کنید که اگر انتخاب نکنید‪ ،‬همین کاربري که با آن در حال ايجاد ديتابیس‬
‫هستید بهعنوان صاحب آن در نظر گرفته خواهد شد؛ بعد از واردکردن نام در قسمت ‪ ،Database name‬دو گزينه با نام‬
‫ديتابیس شما ايجاد میشود که اولی (‪ )DB1‬نام ديتابیس و دومی (‪ )DB1_Log‬ديتابیسی براي ثبت ‪ Log‬است‪ ،‬اين دو‬
‫مکمل هم هستند و حتماً براي اجرا به همديگر نیاز دارند‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪62‬‬

‫شکل ‪ 3-2‬ایجاد دیتابیس‬

‫در قسمت ‪ Option‬که در شکل ‪ 3-3‬مشخص شده است‪ ،‬گزينههايی وجود دارد‪ ،‬گزينهي ‪ Collation‬به روشی براي‬
‫مقايسهي اطالعات با هم اشاره دارد؛ قسمت ‪ Recovery model‬که مربوط به عملیات پشتیبانگیري و بازيابی اطالعات‬
‫هم میتوانید مشخص کنید که اين‬ ‫‪Compatibility level‬‬ ‫است که در موقع مناسب توضیح خواهیم داد‪ .‬در قسمت‬
‫ديتابیس با کدام نسخه از ‪ SQL‬سازگاري داشته باشد‪.‬‬

‫شکل ‪ 3-3‬ایجاد دیتابیس‬

‫بعد از ايجاد ديتابیس میتوانید بهمانند شکل ‪ 3-4‬در قسمت ‪ ،Databases‬اين ديتابیس جديد را مشاهده کنید‪.‬‬

‫شکل ‪3-4‬‬
‫‪www.takbook.com‬‬

‫‪63‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫اگر وارد مسیر مورد نظر در شکل ‪ 3-5‬شويد‪ ،‬فايل ديتابیس تولید شده را مشاهده میکنید که همان دو فايلی است‬
‫که اشاره کرديم‪.‬‬

‫شکل ‪ 3-5‬لیست دیتابیس‬

‫نکته‪:‬‬
‫سعی کنید در اول کار زمانیکه میخواهید ديتابیس خود را ايجاد کنید‪ ،‬آدرس آن را در يک مکان مطمئن و با‬
‫حجم باال قرار دهید تا در آينده با اضافه شدن داده‪ ،‬حجم و اطالعات شما حفظ شود‪.‬‬

‫‪ 3-1-2‬ايجاد جدول در ديتابیس‬


‫براي ايجاد جدول در ديتابیس مورد نظر بايد بهمانند شکل ‪ 2-25‬بر روي پوشهي ‪ Tables‬کلیک راست کنید و گزينهي‬
‫‪ Table‬را از قسمت ‪ New‬انتخاب کنید‪.‬‬

‫شکل ‪ 3-6‬ایجاد جدول‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪64‬‬


‫در شکل ‪ 3-7‬بايد در قسمت ‪ ،Column Name‬نام ستون خود را وارد کنید که چهار مورد وارد شده است و در قسمت‬
‫‪ Data Type‬بايد نوع ستون مورد نظر را از نظر عددي‪ ،‬حرفی و ‪ ...‬انتخاب کنید‪ ،‬براي ذخیره کردن اين جدول بايد بر‬
‫روي عنوان جدول کلیک راست کنید و گزينهي ‪ Save‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-7‬ایجاد جدول‬

‫بعد از ايجاد جدول بايد جدول مورد نظر در قسمت ‪ Table‬نمايش داده شود‪ ،‬اگر اينچنین نشد بايد بهمانند شکل ‪-8‬‬
‫‪ 3‬بر روي ‪ Tables‬کلیک راست کنید و گزينهي ‪ Refresh‬را انتخاب کنید تا جدول مورد نظر مشخص شود‪.‬‬

‫شکل ‪ 3-8‬ایجاد جدول‬

‫بعد از ايجاد جدول میخواهیم اطالعاتی در آن وارد کنیم؛ براي اين کار در شکل ‪ 3-9‬بر روي ‪ dbo.Table_1‬کلیک‬
‫راست کنید و گزينهي ‪ Edit Top 200 Rows‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪65‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫شکل ‪ 3-9‬ورود اطالعات در جدول‬

‫در شکل ‪ 3-10‬اطالعاتی را وارد کنید و صفحهي مورد نظر را ببنديد‪.‬‬

‫شکل ‪ 3-10‬ورود اطالعات در جدول‬

‫براي اينکه اطالعات موجود در جدول را مشاهده کنید‪ ،‬میتوانید بهمانند شکل ‪ 3-11‬بر روي جدول مورد نظر کلیک‬
‫راست کنید و گزينهي ‪ Select Top 1000 Rows‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-11‬نمایش اطالعات جدول‬

‫همانطور که در شکل ‪ 3-12‬مشاهده میکنید‪ ،‬اطالعات جدول توسط يک اسکريپت در خروجی به نمايش گذاشته‬
‫شده است که در ادامه‪ ،‬در مورد کد مورد نظر توضیحاتی خواهیم داد‪.‬‬

‫شکل ‪ 3-12‬نمایش اطالعات جدول‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪66‬‬


‫بعد از ايجاد اولیهي جدول و واردکردن مقاديري در آن‪ ،‬میخواهیم در مورد نوع دادهي ورودي صحبت کنیم که بسیار‬
‫مهم است‪.‬‬
‫‪ 3-1-3‬انواع ‪ Data Type‬در جداول‬
‫زمانیکه میخواهیم يک ‪ Filed‬جديد در جدول‪ ،‬مانند‪ :‬نام‪ ،‬نام خانوادگی‪ ،‬شمارهي دانشجويی و‪ ...‬ايجاد کنیم بايد از‬
‫انواع مختلف دادهاي استفاده کنیم‪ ،‬مثالً براي نوشتهاي مانند نام بايد از نوع دادهي ‪ Char/nchar‬استفاده کنید و به همین‬
‫ترتیب از انواع مختلف ديگر میتوان استفاده کرد‪ .‬در زير اين نوع دادهها را بررسی میکنیم‪:‬‬
‫انواع دادههای رشتهای‬

‫جدول ‪ 3-1‬انواع دادههای رشتهای‬

‫توضیحات‬ ‫اندازه داده‬ ‫نوع داده‬

‫طول داده ثابت است‪.‬‬ ‫حداکثر اندازه ‪ 8000‬کاراکتر‪.‬‬ ‫)‪CHAR(size‬‬

‫طول داده متغیر است و توانايی افزايش‬ ‫حداکثر اندازه ‪ 8000‬کاراکتر با‬
‫‪VARCHAR(size) or‬‬
‫حجم تا ‪ 2‬گیگابايت را داراست‪.‬‬ ‫افزايش حجم‪.‬‬ ‫)‪VARCHAR(max‬‬

‫دادههاي غیر يونیک با طول متغیر‪.‬‬ ‫حداکثر اندازه ‪ 2‬گیگابايت‪.‬‬ ‫‪TEXT‬‬

‫دادههاي غیر يونیک با طول ثابت‪.‬‬ ‫حداکثر اندازه ‪ 4000‬کاراکتر‪.‬‬ ‫)‪NCHAR(size‬‬

‫طول داده متغیر است و توانايی افزايش‬ ‫حداکثر اندازه ‪ 4000‬کاراکتر با‬
‫‪NVARCHAR(size) or‬‬
‫حجم تا ‪ 2‬گیگابايت را داراست‪.‬‬ ‫افزايش حجم‪.‬‬ ‫)‪NVARCHAR(max‬‬

‫حداکثر اندازه ‪1,073,741,823‬‬


‫دادههاي غیر يونیک با طول متغیر‪.‬‬ ‫‪NTEXT‬‬
‫‪ bytes‬است‪.‬‬

‫طول داده ثابت است‪.‬‬ ‫حداکثر اندازه ‪ 8000‬کاراکتر‪.‬‬ ‫)‪BINARY(size‬‬

‫طول داده متغیر است و توانايی افزايش‬ ‫حداکثر اندازه ‪ 8000‬کاراکتر با‬
‫‪VARBINARY(size) or‬‬
‫حجم تا ‪ 2‬گیگابايت را داراست‪.‬‬ ‫افزايش حجم‪.‬‬ ‫)‪VARBINARY(max‬‬
‫‪www.takbook.com‬‬

‫‪67‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫دادههاي غیر يونیک با طول متغیر‪.‬‬ ‫حداکثر اندازه ‪ 2‬گیگابايت‪.‬‬ ‫‪IMAGE‬‬

‫انواع دادههای عددی‬

‫جدول ‪ 3-2‬دادههای عددی‬

‫توضیحات‬ ‫حداکثر اندازه‬ ‫نوع داده عددي‬

‫‪NULL‬‬ ‫عدد صحیح است که میتواند ‪ 0‬يا ‪ 1‬يا‬


‫‪BIT‬‬
‫باشد‪.‬‬

‫از ‪ 0‬تا ‪255‬‬ ‫‪TINYINT‬‬

‫از ‪ 32768-‬تا ‪32767‬‬ ‫‪SMALLINT‬‬

‫از ‪ 2,147,483,648-‬تا ‪2,147,483,647‬‬ ‫‪INT‬‬

‫از ‪ 9,223,372,036,854,775,808-‬تا‬
‫‪BIGINT‬‬
‫‪9,223,372,036,854,775,807‬‬

‫‪ M‬اگر مشخص نشده باشد بهصورت پیشفرض‬


‫‪ M‬تعداد ارقام و ‪ d‬تعداد‬ ‫‪ 18‬در نظر گرفته میشود‪.‬‬
‫ارقام اعشار بعد از ممیز‬ ‫)‪DECIMAL(m,d‬‬

‫است‪.‬‬ ‫‪ d‬اگر مشخص نشده باشد‪ ،‬بهصورت پیشفرض ‪0‬‬


‫در نظر گرفته میشود‪.‬‬

‫‪ M‬تعداد ارقام و ‪ d‬تعداد‬ ‫‪ M‬اگر مشخص نشده باشد بهصورت پیشفرض‬


‫)‪DEC(m,d‬‬
‫ارقام اعشار بعد از ممیز‪.‬‬ ‫‪ 18‬در نظر گرفته میشود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪68‬‬

‫‪ d‬اگر مشخص نشده باشد‪ ،‬بهصورت پیشفرض ‪0‬‬


‫در نظر گرفته میشود‪.‬‬

‫‪ M‬اگر مشخص نشده باشد بهصورت پیشفرض‬


‫‪ 18‬در نظر گرفته میشود‪.‬‬
‫‪ M‬تعداد ارقام و ‪ d‬تعداد‬
‫)‪NUMERIC(m,d‬‬
‫ارقام اعشار بعد از ممیز‪.‬‬
‫‪ d‬اگر مشخص نشده باشد‪ ،‬بهصورت پیشفرض ‪0‬‬
‫در نظر گرفته میشود‪.‬‬

‫اعداد شناور‬
‫که در آن ‪ n‬تعداد تعداد بیت‬
‫براي ذخیره بهصورت نماد‬ ‫)‪FLOAT(n‬‬

‫علمی است‪.‬‬ ‫‪ N‬بهصورت پیشفرض ‪ 53‬در نظر گرفته خواهد‬


‫شد‪.‬‬

‫از ‪ 214,748.3648 -‬تا ‪214,748.3647‬‬ ‫‪SMALLMONEY‬‬

‫از ‪ 922,337,203,685,477.5808-‬تا‬
‫‪MONEY‬‬
‫‪922,337,203,685,477.5807‬‬

‫انواع دادههای زمان و تاریخ‬


‫جدول ‪ 3-3‬دادههای زمان و تاریخ‬

‫توضیحات‬ ‫حداکثر اندازه کاراکتر‬ ‫نوع داده‬

‫'‪YYYY-MM-‬‬ ‫فرمت نمايش‬ ‫تا '‪-9999‬‬ ‫از '‪'0001-01-01‬‬ ‫دامنهي اعداد‬


‫‪DATE‬‬
‫'‪"DD‬‬ ‫‪'.12-31‬‬
‫‪www.takbook.com‬‬

‫‪69‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫دامنهي اعداد از '‪'00:00:00 01-01-1753‬‬


‫تا‪'9999-12-31 23:59:59'.‬‬
‫نمايش‪'YYYY-MM-‬‬ ‫فرمت‬
‫‪DATETIME‬‬
‫']‪DD hh:mm:ss[.mmm‬‬
‫دامنهي زمان از '‪ '00:00:00‬تا‬
‫'‪'23:59:59:997‬‬

‫تا '‪-9999‬‬ ‫از '‪'0001-01-01‬‬ ‫دامنهي تاريخ‬


‫‪'.12-31‬‬
‫نمايش‪'YYYY-MM-‬‬ ‫فرمت‬
‫‪DATETIME2(fractional‬‬
‫‪DD hh:mm:ss[.fractional‬‬ ‫)‪seconds precision‬‬
‫']‪seconds‬‬
‫تا‬ ‫از '‪'00:00:00‬‬ ‫دامنهي زمان‬
‫‪'23:59:59:9999999'.‬‬

‫دامنهي تاريخ از '‪ '1900-01-01‬تا '‪-2079‬‬


‫‪'.06-06‬‬
‫نمايش‪'YYYY-MM-‬‬ ‫فرمت‬
‫‪SMALLDATETIME‬‬
‫'‪DD hh:mm:ss‬‬
‫'‪'.23:59:59‬‬ ‫دامنهي زمان از '‪ '00:00:00‬تا‬

‫نمايش‪'YYYY-MM-‬‬ ‫فرمت‬ ‫دامنهي زمان از'‪ '00:00:00.0000000‬تا‬


‫‪TIME‬‬
‫']‪DD hh:mm:ss[.nnnnnnn‬‬ ‫'‪'23:59:59.9999999‬‬

‫دامنهي تاريخ از '‪ '0001-01-01‬تا '‪-9999‬‬


‫‪'.12-31‬‬

‫نمايش‪'YYYY-MM-‬‬ ‫فرمت‬ ‫دامنهي زمان از '‪ '00:00:00‬تا‬ ‫‪DATETIMEOFFSET(fractional‬‬


‫']‪DD hh:mm:ss[.nnnnnnn‬‬ ‫)‪seconds precision‬‬
‫‪'23:59:59:9999999'.‬‬
‫]‪[{+|-}hh:mm‬‬

‫دامنهي منطقه از ‪ 14:00-‬تا ‪.14:00+‬‬

‫در جدولهايی که بررسی کرديم‪ ،‬تمام دادههاي رشتهاي‪ ،‬عددي‪ ،‬زمان و تاريخ تعريف شده است و توضیحات مربوط‬
‫به آن داده شده است‪.‬‬
‫‪Data Type‬هاي ديگري نیز وجود دارد که در نسخههاي جديد ‪ SQL‬میتوانید از آنها استفاده کنید‪:‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪70‬‬


‫جدول ‪ 3-4‬دادههای دیگر‬

‫توضیحات‬ ‫نوع داده‬


‫میکند‪.‬‬ ‫حداکثر ‪ 8000‬بايت داده از انواع مختلف داده‪ ،‬به جز متن‪ ntext ،‬و زمانسنج ذخیره‬ ‫‪sql_variant‬‬

‫شناسه منحصربهفرد جهانی )‪ (GUID‬را ذخیره میکند‪.‬‬ ‫‪uniqueidentifier‬‬

‫دادههاي قالببندي شده ‪ XML‬را ذخیره میکند‪ ،‬حداکثر ‪ 2‬گیگابايت‪.‬‬ ‫‪xml‬‬

‫به ‪store proceduere‬‬ ‫اين نوع داده براي ذخیرهي متغیرها و يا پارامترهاي ‪ OUTPUT‬مربوط‬
‫‪cursor‬‬
‫کاربرد دارد‪.‬‬
‫مجموعهاي از نتايج را براي پردازش بعدي ذخیره میکند‪.‬‬ ‫‪table‬‬

‫‪ 3-1-4‬حذف ديتابیس در ‪SQL Server‬‬


‫بعد از اينکه توانستیم يک ديتابیس را ايجاد کنیم نوبت به حذف آن میرسد‪ ،‬براي حذف ديتابیس کافی است بهمانند‬
‫شکل ‪ 3-13‬بر روي ديتابیس مورد نظر کلیک راست کنید و گزينهي ‪ Delete‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-13‬حذف دیتابیس‬

‫در لیست مشخص شده است و اگر بر روي ‪ Delete‬کلیک کنید‪ ،‬ديتابیس حذف‬ ‫‪DB1‬‬ ‫در شکل ‪ 3-14‬نام ديتابیس‬
‫خواهد شد‪ ،‬اما دو گزينه در زير اين صفحه وجود دارد‪.‬‬
‫‪www.takbook.com‬‬

‫‪71‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-14‬حذف دیتابیس‬

‫گزينهي ‪ :Delete backup and restore history information for databases‬اين گزينه بهصورت پیشفرض فعال است‬
‫و تاريخ و اطالعات اين ديتابیس را از ديتابیس ‪ MSDB‬حذف میکند‪.‬‬
‫گزينهي ‪ ،Close existing connections‬بهصورت پیشفرض فعال نیست و اگر آن را فعال کنید‪ ،‬قبل از حذف‬
‫ديتابیس‪ ،‬اول بررسی میکند که اين ديتابیس در جايی ديگر باز شده و يا در حال استفاده است‪ ،‬ابتدا آن ارتباط را‬
‫میبندد و بعد اقدام به حذف میکند‪ ،‬سعی کنید اين گزينه را فعال نکنید تا حداقل در زمان حذف مشخص شود که‬
‫در جايی ديگر در حال استفاده است‪.‬‬

‫‪ 3-1-5‬تعريف پرسوجو يا ‪ Query‬در ‪SQL‬‬


‫يکی از اصلیترين موضوعاتی که در ‪ SQL‬بايد بررسی شود بحث پرسوجو و يا همان ‪ Query‬است‪ ،‬هر پرسوجو‬
‫میتواند شامل چندين دستور باشد که در زير آنها را بررسی میکنیم‪.‬‬

‫‪SELECT‬‬ ‫‪ 3-1-5-1‬بررسی دستور‬


‫براي اينکه در ‪ SQL‬اطالعات را از جدولهاي بازيابی به قولی فِچ کنیم از دستور ‪ SELECT‬استفاده میکنیم‪ ،‬در زير‬
‫نمونهاي از اين دستور را مشاهده میکنید‪:‬‬
‫‪SELECT column1, column2, ...‬‬
‫;‪FROM table_name‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪72‬‬


‫در دستور باال‪ ،‬دستور ‪ SELECT‬را با حروف بزرگ مینويسیم و بعد از آن بايد ستون (‪ )column1, column2‬مربوط‬
‫به جدولی را که میخواهید دادهها را از آن استخراج کنید مینويسید‪ ،‬در سطر دوم با دستور ‪ ،FROM‬اسم جدول را‬
‫بهجاي ‪ table_name‬مینويسید‪.‬‬
‫براي اينکه اين دستورات را در سرور ‪ SQL‬تست بگیريم بايد بهمانند شکل ‪ 3-15‬وارد ‪ Management‬شويد و بر روي‬
‫ديتابیس مورد نظر خود کلیک راست کنید و گزينهي ‪ New Query‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-15‬ایجاد ‪Query‬‬

‫براي شروع کار به جدول ‪ 3-5‬توجه کنید‪ ،‬میخواهیم با استفاده از اين جدول عملیات مختلف خود را انجام دهیم و‬
‫دادهها را فراخوانی کنیم‪.‬‬

‫جدول ‪Customers 3-5‬‬

‫‪Customer‬‬
‫‪CustomerID‬‬ ‫‪ContactName‬‬ ‫‪Address‬‬ ‫‪City‬‬ ‫‪PostalCode‬‬ ‫‪Country‬‬
‫‪Name‬‬
‫‪Maria‬‬ ‫‪Obere‬‬ ‫‪Str.‬‬
‫‪1‬‬ ‫‪Maria‬‬ ‫‪Berlin‬‬ ‫‪12209‬‬ ‫‪Germany‬‬
‫‪Anders‬‬ ‫‪57‬‬
‫‪Avda. de la‬‬
‫‪2‬‬ ‫‪Ana‬‬ ‫‪Ana Trujillo‬‬ ‫‪Constitució‬‬ ‫‪México‬‬ ‫‪05021‬‬ ‫‪Mexico‬‬
‫‪n 2222‬‬
‫‪Antonio‬‬ ‫‪Mataderos‬‬
‫‪3‬‬ ‫‪Antonio‬‬ ‫‪México‬‬ ‫‪05023‬‬ ‫‪Mexico‬‬
‫‪Moreno‬‬ ‫‪2312‬‬
‫‪120‬‬
‫‪Thomas‬‬ ‫‪WA1‬‬
‫‪4‬‬ ‫‪Thomas‬‬ ‫‪Hanover‬‬ ‫‪London‬‬ ‫‪UK‬‬
‫‪Hardy‬‬ ‫‪1DP‬‬
‫‪Sq.‬‬
‫‪Berguvsväg‬‬
‫‪5‬‬ ‫‪Christina‬‬ ‫‪Christina‬‬ ‫‪Luleå‬‬ ‫‪S-958 22‬‬ ‫‪Sweden‬‬
‫‪en 8‬‬

‫براي ايجاد اين جدول از طريق ‪ SSMS‬يک جدول ايجاد کنید و آن را با اسم ‪ Customers‬ذخیره کنید و بعد از ايجاد‪،‬‬
‫اطالعات جدول ‪ 3-5‬را درون آن وارد کنید تا در ادامه بتوانید از آنها استفاده کنید‪ ،‬اين موضوع را در شکل ‪3-16‬‬
‫مشاهده میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪73‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-16‬ویرایش جدول ‪Customers‬‬

‫شکل ‪ 3-17‬ورود اطالعات در جدول ‪Customers‬‬

‫مثال اول – انتخاب ستون‬


‫‪SELECT [Customer Name] , City FROM Customers‬‬

‫][‬ ‫در دستور باال‪ ،‬ستون ‪ Customer Name‬و ‪ City‬از جدول ‪ Customers‬انتخاب شده است‪ ،‬توجه داشته باشید عالمت‬
‫را بهتر است زمانی قرار دهید که يک جملهي دو حرفی يا بیشتر داريد‪ ،‬مثالً در مثال باال اگر ‪ city‬بود‪ ،‬نیاز به عالمت‬
‫][ نبود‪ ،‬اما چون ‪ Customer Name‬از دو قسمت با فاصله تعريف شده است بايد حتماً عالمت ][ را قرار دهید‪.‬‬
‫بهمانند شکل ‪ 3-18‬دستور مورد نظر را بنويسید و براي دريافت خروجی بايد کلید ‪ F5‬را فشار دهید‪ ،‬اين دستور دو‬
‫ستون ‪ Customer Name‬و ‪ City‬را در خروجی نمايش میدهد‪.‬‬

‫شکل ‪ 3-18‬خروجی دستور ‪SELECT‬‬

‫مثال دوم – نمايش تمام اطالعات جدول‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪74‬‬


‫براي اينکه بتوانید همهي اطالعات جدول مورد نظر خود را مشاهده کنید بايد از دستور زير استفاده کنید‪:‬‬
‫‪SELECT * FROM Customers‬‬
‫همانطور که در شکل ‪ 3-19‬مشاهده میکنید‪ ،‬تمام اطالعات جدول در خروجی نمايشداده شده است‪.‬‬

‫شکل ‪ 3-19‬نمایش جدول ‪Customers‬‬

‫اگر بخواهیم در يک جدول‪ ،‬تنها اطالعات متمايز شده و نه تکراري را نمايش دهیم بايد از دستور زير استفاده کنیم‪:‬‬
‫‪SELECT DISTINCT column1, column2, ...‬‬
‫;‪FROM table_name‬‬
‫در دستور باال بهمانند قبل بايد نام ستونها را جلوي دستور ‪ SELECT‬بنويسید‪ ،‬اما تنها بايد بعد از دستور ‪ SELECT‬از‬
‫‪ DISTINCT‬استفاده کنید تا اطالعات شبیه به هم را تنها يکبار در خروجی نمايش دهد‪.‬‬
‫مثال سوم – نمايش اطالعات شهرهاي مشابه‬
‫دستورات زير را اجرا کنید‪:‬‬
‫;‪SELECT Country FROM Customers‬‬
‫;‪SELECT DISTINCT Country FROM Customers‬‬
‫خروجی دستورات باال را در شکل ‪ 3-20‬مشاهده میکنید‪ ،‬دستور اول تمام شهرها را به شما نمايش داده است‪ ،‬اما در‬
‫را نمايش داده است و اين مورد میتواند در نمايش بهتر اطالعات کمک‬ ‫‪Mexico‬‬ ‫دستور دوم تنها يکی از شهرهاي‬
‫کند‪.‬‬

‫شکل ‪ 3-20‬نمایش جدول‬


‫‪www.takbook.com‬‬

‫‪75‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪Insert‬‬ ‫‪ 3-1-5-2‬بررسی دستور‬
‫اين دستور براي واردکردن اطالعات در جدول کاربرد دارد و میتوانید با استفاده از اين دستور‪ ،‬اطالعات خود را وارد‬
‫جدول کنید‪.‬‬
‫)‪INSERT INTO table_name (column1, column2, column3, ...‬‬
‫; )‪VALUES (value1, value2, value3, ...‬‬

‫را بنويسیم و بعد از آن‪ ،‬نام جدول را بهجاي ‪ table_name‬بنويسیم‪ ،‬سپس‬ ‫‪INSERT INTO‬‬ ‫در دستور باال‪ ،‬ابتدا بايد‬
‫بايد در پرانتز مورد نظر نام ستونهايی که قرار است اطالعات در آن وارد بشود را بنويسیم‪.‬‬
‫روش ديگري هم براي ورود اطالعات بهصورت زير وجود دارد‪:‬‬
‫‪INSERT INTO table_name‬‬
‫; )‪VALUES (value1, value2, value3, ...‬‬
‫در دستور باال‪ ،‬ورود اطالعات به ترتیب ستونهاي موجود انجام میشود‪.‬‬
‫مثال اول – ورود اطالعات با استفاده از نام ستون‬

‫‪INSERT INTO Customers (CustomerID,"Customer Name", "Contact Name", Address, City,‬‬


‫)‪PostalCode, Country‬‬
‫)'‪VALUES ('6','Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway‬‬
‫;‬
‫;‪SELECT * FROM Customers‬‬

‫در دستور باال‪ ،‬ابتدا نام ستونها ذکر شده است و بعد از آن‪ ،‬اطالعاتی که قرار است وارد جدول شود را در قسمت‬
‫‪ VALUES‬وارد میکنیم‪.‬‬
‫به اين نکته توجه کنید که ستونهايی که دوقسمتی هستند‪ ،‬حتماً بايد بین دو تا عالمت " " قرار بگیرند تا در خروجی‬
‫با خطا مواجه نشويد‪.‬‬
‫را براي نمايش اطالعات جدول وارد کرديم که در شکل ‪21-3‬‬ ‫;‪SELECT * FROM Customers‬‬ ‫در آخر‪ ،‬دستور‬
‫خروجی نهايی را مشاهده میکنید که يک سطر جديد به جدول اضافه شده است‪.‬‬

‫شکل ‪ 3-21‬ورود اطالعات در جدول‬

‫مثال دوم – ورود اطالعات به ترتیب ستون‬


‫دستور زير را اجرا کنید‪:‬‬
‫‪INSERT INTO Customers‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪76‬‬


‫; )'‪VALUES ('7','Farshid', 'Babajani', 'Seied Khandan', 'Tehran', '8843', 'Iran‬‬
‫;‪SELECT * FROM Customers‬‬
‫در دستور باال‪ ،‬اطالعات ورودي به ترتیب ستونهاي جدول قرار میگیرند و بايد در ورود اطالعات دقت کنید‪،‬‬
‫اگر به شکل ‪ 3-22‬توجه کنید خروجی مشخص شده است‪.‬‬

‫شکل ‪ 3-22‬ورود اطالعات‬

‫‪Update‬‬ ‫‪ 3-5-1-3‬بررسی دستور‬


‫با استفاده از اين دستور میتوانید اطالعات موجود در هر ستون را تغییر دهید؛ براي اين کار بايد از دستور زير استفاده‬
‫کنید‪:‬‬
‫‪UPDATE table_name‬‬
‫‪SET column1 = value1, column2 = value2, ...‬‬
‫;‪WHERE condition‬‬
‫در دستور باال‪ ،‬ابتدا بايد نام جدول را بعد از دستور ‪ UPDATE‬وارد کنید‪ .‬در قسمت ‪ SET‬بايد مشخص کنید که چه‬
‫گزينههايی بايد تغییر کند و در آخر نیز بايد از دستور شرطی ‪ WHERE‬استفاده کنید تا مشخص شود که به کدام سطر‬
‫اشاره میکنید‪.‬‬
‫مثال اول – آپديت کردن اطالعات جدول‬
‫‪UPDATE Customers‬‬
‫'‪SET "Contact Name" = 'Alfred Schmidt', City= 'Frankfurt‬‬
‫;‪WHERE CustomerID = 1‬‬
‫‪SELECT * FROM Customers‬‬
‫;‪WHERE CustomerID=1‬‬
‫در دستور باال‪ ،‬جدول ‪ Customers‬انتخاب میشود و در قسمت ‪ SET‬ستونها به همراه مقدار آن مشخص میشود و‬
‫در قسمت شرطی ‪ WHERE‬بايد شرط مورد نظر را وارد کنید که در اينجا از شمارهي ‪ CustomerID‬استفاده کرده است؛‬
‫توجه داشته باشید دو خط آخر براي نمايش سطر اول جدول به کار برده شده است‪.‬‬
‫اگر به شکل ‪ 3-23‬توجه کنید‪ ،‬سطر مورد نظر آپديت شده است و در خروجی به نمايش گذاشته شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪77‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-23‬آپدیت اطالعات‬

‫اگر دو خط آخر دستور باال را وارد نکنید‪ ،‬خروجی مانند شکل ‪ 3-24‬خواهد شد‪.‬‬

‫شکل ‪ 3-24‬آپدیت اطالعات‬

‫کارهاي زيادي میتوان با دستور ‪ UPDATE‬انجام داد‪ ،‬مثالً میتوانید با دستور زير نام ‪ ContactName‬مربوط به‬
‫شهرهاي ‪ Mexico‬را با استفاده از شرط تغییر دهید‪:‬‬
‫‪UPDATE Customers‬‬
‫'‪SET "Contact Name"='Juan‬‬
‫;'‪WHERE Country='Mexico‬‬

‫نکتهي مهم‪ :‬اگر چنانچه شرط ‪ WHERE‬را در دستور ‪ UPDATE‬قرار ندهید‪ ،‬تمام ستونهاي انتخابشده آپديت خواهد‬
‫شد؛ در دستور زير تمام ‪ ContactName‬ها به ‪ Juan‬تغییر خواهند کرد‪.‬‬
‫‪UPDATE Customers‬‬
‫;'‪SET ContactName='Juan‬‬
‫‪DELETE‬‬ ‫‪ 4-5-1-3‬بررسی دستور‬
‫اين دستور همانطور که از نامش پیداست‪ ،‬براي حذف اطالعات جدولها کاربرد دارد که شکل کلی آن بهصورت زير‬
‫است‪:‬‬
‫;‪DELETE FROM table_name WHERE condition‬‬
‫در دستور باال بهجاي ‪ table_name‬بايد نام جدول و بهجاي ‪ ،condition‬شرط مورد نظر خود را وارد کنید‪.‬‬
‫مثال اول – حذف اطالعات جدول‬
‫;'‪DELETE FROM Customers WHERE "Customer Name"='Farshid‬‬
‫‪SELECT * FROM Customers‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪78‬‬


‫در دستور باال‪ ،‬جدول ‪ Customers‬انتخاب شده است و در شرط آن اعالم شده است که ‪ CustomersName‬مشخصشده‬
‫بايد حذف شود که در شکل ‪ 3-25‬قبل از اينکه دستور مورد نظر را اجرا کنید‪ ،‬نام ‪ Farshid‬را در قسمت ‪ 7‬مشاهده‬
‫میکنید‪ ،‬اما بعد از اجراي دستور در شکل ‪ 3-26‬سطر مورد نظر حذف شد‪.‬‬

‫شکل ‪ 3-25‬حذف اطالعات‬

‫شکل ‪ 3-26‬حذف اطالعات‬

‫براي حذف اطالعات کامل جدول بايد از دستور زير استفاده کنید‪:‬‬
‫;‪DELETE FROM table_name‬‬
‫در دستور باال بايد بهجاي ‪ ،table_name‬نام جدول خود را وارد کنید‪.‬‬

‫‪WHERE‬‬ ‫‪ 3-1-5-5‬بررسی دستور‬


‫يک دستور شرطی که در قسمت دستور ‪ UPDATE‬مقداري بررسی کرديم‪ ،‬شکل کلی دستور بهصورت زير خواهد‬
‫بود‬
‫‪SELECT column1, column2, ...‬‬
‫‪FROM table_name‬‬
‫;‪WHERE condition‬‬
‫در دستور باال‪ SELECT ،‬نوشتیم که ستونهاي ‪ column1, column2‬را در خروجی نمايش دهد‪ ،‬اما در آخر از دستور‬
‫‪ WHERE‬استفاده شده و شرطی بر خروجی قرار داده است‪.‬‬
‫مثال يک – خروجی دستور ‪ SELECT‬با استفاده از شرط‬
‫‪SELECT * FROM Customers‬‬
‫‪www.takbook.com‬‬

‫‪79‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫;'‪WHERE Country='Mexico‬‬
‫در دستور باال‪ ،‬اطالعات جدول ‪ Customers‬در خروجی نمايش داده میشود‪ ،‬به شرطی که ستون ‪ Country‬برابر‬
‫‪ Mexico‬باشد‪ ،‬خروجی دستور مورد نظر را در شکل ‪ 3-27‬مشاهده میکنید‪.‬‬

‫شکل ‪ 3-27‬بررسی دستور ‪WHERE‬‬

‫نکته‪:‬‬
‫در دستور '‪ ،WHERE Country='Mexico‬کلمهي ‪ Mexico‬بین نقل قول قرار گرفته است‪ ،‬اما اگر‬
‫به جاي ‪ ،Mexico‬از عدد استفاده میکرديد‪ ،‬ديگر نیاز به نقل قول نبود‪ ،‬پس به اين نکته توجه‬
‫کنید‪.‬‬

‫از عملگرهاي جدول ‪ 3-6‬میتوان در بند ‪ WHERE‬استفاده کرد‪.‬‬


‫جدول ‪ 3-6‬عملگر‬

‫توضیحات‬ ‫عملگر‬
‫مساوی‬ ‫=‬

‫بزرگتر از‬ ‫>‬

‫کوچکتر از‬ ‫<‬

‫بزرگتر مساوی‬ ‫=>‬

‫کوچکتر مساوی‬ ‫=<‬

‫=!‬ ‫نابرابر‪ ،‬توجه داشته باشید در بعضی از نسخههای ‪ SQL‬این عالمت شاید بهصورت‬ ‫><‬

‫باشد‪.‬‬
‫بین یک محدودهی مشخص‬ ‫‪BETWEEN‬‬

‫جستجوی یک الگو‬ ‫‪LIKE‬‬

‫برای تعیین چندین مقدار ممکن برای یک ستون‬ ‫‪IN‬‬

‫مثال دوم – استفاده از عملگر‬


‫اگر بخواهیم از اين عملگرها در دستور شرطی استفاده کنید‪ ،‬میتوانید از دستور زير استفاده کنید‪:‬‬
‫‪SELECT * FROM Customers‬‬
‫;‪WHERE CustomerID<>1‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪80‬‬


‫‪SELECT * FROM Customers‬‬
‫;‪WHERE CustomerID<=1‬‬
‫در دستور باال از يک عملگر نابرابر و يک کوچکتر مساوي استفاده شده است که خروجی اين دستور را در شکل‬
‫‪ 28-3‬مشاهده میکنید؛ در قسمت اول‪ ،‬سطر يک نمايش داده نشده و در قسمت دوم تنها سطر يک نمايشداده شده‬
‫است‪.‬‬

‫شکل ‪ 3-28‬بررسی دستور ‪WHERE‬‬

‫‪NOT‬‬ ‫‪ 3-1-5-6‬بررسی دستور ‪ OR ،AND‬و‬


‫همانطور که در درس قبلی خوانديد‪ ،‬دستور ‪ WHERE‬يک دستور شرطی است‪ ،‬شما میتوانید با استفاده از دستورات‬
‫‪ OR ،AND‬و ‪ NOT‬يک ترکیب جديد در شرط ايجاد کنید که در اين قسمت به طور کامل آن را بررسی میکنیم‪.‬‬
‫‪AND‬‬ ‫دستور‬
‫فرم کلی دستور ‪ AND‬بهصورت زير است‪:‬‬
‫‪SELECT column1, column2, ...‬‬
‫‪FROM table_name‬‬
‫; ‪WHERE condition1 AND condition2 AND condition3 ...‬‬

‫در دستور باال با استفاده از ‪ ،SELECT‬نام ستونها را انتخاب میکنیم و در قسمت ‪ WHERE‬بايد شرط خود را با‬
‫استفاده از ‪ AND‬وارد کنید‪ ،‬منظور از ‪ AND‬اين است که يک شرط حتماً بايد اين چند مورد که با ‪ AND‬تعريف‬
‫میشود را داشته باشد‪.‬‬
‫‪AND‬‬ ‫مثال اول –‬
‫‪SELECT * FROM Customers‬‬
‫;'‪WHERE Country='Iran' AND City='Tehran‬‬

‫در دستور باال‪ ،‬خروجی اطالعات جدول ‪ Customers‬در خط اول نمايش داده خواهد شد‪ ،‬اما در خط دوم شرطی‬
‫قرار داده که حتماً بايد نام ‪ Country‬و ‪ City‬به ترتیب برابر ‪ Farshid‬و ‪ Tehran‬باشد‪ ،‬اگر به شکل ‪ 29-3‬توجه کنید‬
‫خروجی بهدرستی نمايشداده شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪81‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-29‬بررسی دستور ‪WHERE‬‬

‫توجه داشته باشید که تمام مثالهاي اين فصل از جدول ‪ 3-1‬برداشته شده است و دقیقاً طبق همان جدول عمل کنید‪.‬‬

‫‪OR‬‬ ‫مثال دوم‪ -‬دستور‬


‫‪SELECT * FROM Customers‬‬
‫;'‪WHERE Country='Iran' OR City='Shiraz‬‬
‫براي دستور ‪ OR‬نیز همان مثال قبلی را اجرا میکنیم با اين تفاوت که شهر را به شیراز تغییر میدهیم‪ ،‬دستور ‪ OR‬به‬
‫اين نکته اشاره دارد که اگر يکی از اين شرايط درست باشد‪ ،‬پس شرط درست است و خروجی آن سطر بايد نمايش‬
‫داده شود که در شکل ‪ 3-30‬اين موضوع را مشاهده میکنید؛ با اينکه شهر ‪ Shiraz‬در دستور وارد شده‪ ،‬چون يکی از‬
‫شرطها‪ ،‬يعنی ‪ Iran‬درست بوده‪ ،‬خروجی نمايش داده شده است‪.‬‬

‫شکل ‪ 3-30‬بررسی دستور ‪WHERE‬‬

‫‪NOT‬‬ ‫مثال سوم دستور‬


‫اين دستور‪ ،‬يعنی منفی کردن شرط‪ ،‬يعنی اينکه اگر ‪ NOT‬قبل از آن قرار دهیم‪ ،‬يعنی اينکه آن کلید نبايد در خروجی‬
‫باشد‪.‬‬
‫‪SELECT * FROM Customers‬‬
‫;'‪WHERE NOT Country='Iran‬‬
‫در دستور باال‪ ،‬اگر کشور ‪ Iran‬در يکی از سطر ها باشد آن سطر در خروجی نمايش داده نخواهد شد که اين موضوع‬
‫را در شکل ‪ 3-31‬مشاهده میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪82‬‬

‫شکل ‪ 3-31‬بررسی دستور ‪WHERE‬‬

‫‪AND, OR, NOT‬‬ ‫مثال چهارم‪ -‬ترکیب سه دستور‬


‫براي اينکه درک کاملتري از اين سه دستور داشته باشیم‪ ،‬میخواهیم يک مثال کلی براي اين سه دستور بزنیم‪.‬‬
‫‪SELECT * FROM Customers‬‬
‫; )'‪WHERE Country='Germany' AND (City='Berlin' OR City='Frankfurt‬‬

‫در دستور باال‪ ،‬کشور مورد نظر ‪ Germany‬در نظر گرفته شده است‪ ،‬اما در شرطی که در داخل پرانتز قرار داده شده‪،‬‬
‫گفته که يکی از شهرها میتواند ‪ Berlin‬و يا ‪ Frankfurt‬باشد که چون شهر ‪ Frunkfurt‬در جدول وجود داشت به اين‬
‫دلیل شرط‪ ،‬درست و بهمانند شکل ‪ 3-32‬در خروجی نمايش داده شده است‪.‬‬

‫شکل ‪ 3-32‬بررسی ‪WHERE‬‬

‫اگر بخواهیم مثالی از ‪ NOT‬بزنیم میتوانیم از دستور زير استفاده کنیم‪:‬‬


‫‪SELECT * FROM Customers‬‬
‫;'‪WHERE NOT Country='Germany' AND NOT Country='USA‬‬
‫در اين دستور‪ ،‬اگر کشور مورد نظر آمريکا و آلمان نباشد بايد لیست نهايی در خروجی چاپ شود که اين موضوع را‬
‫در شکل ‪ 3-33‬مشاهده میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪83‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-33‬بررسی دستور ‪WHERE‬‬

‫‪LIKE‬‬ ‫‪ 3-1-5-7‬بررسی دستور‬


‫شروع‬ ‫‪P‬‬ ‫ايجاد کنید‪ ،‬يعنی اينکه مثالً مشخص کنید که ستونهايی که با حرف‬ ‫‪Pattern‬‬ ‫با اين دستور میتوانید يک‬
‫میشوند در خروجی چاپ شوند؛ در زير شماي کلی اين دستور را مشاهده میکنید‪:‬‬
‫‪SELECT column1, column2, ...‬‬
‫‪FROM table_name‬‬
‫;‪WHERE column LIKE pattern‬‬
‫در اين دستور و در شرط مورد نظر به اين نکته اشاره شده است که خروجی کار بايد طبق ‪ Pattern‬مورد نظر باشد‪،‬‬
‫در لیست زير چند نمونه از عملگرهاي دستور ‪ LIKE‬را مشاهده میکنید که با ‪ %‬و _ اجرا شدهاند‪.‬‬
‫جدول ‪ 3-7‬عملگر ‪Like‬‬

‫توضیحات‬ ‫‪LIKE‬‬ ‫عملگر‬


‫اين دستور مقاديري را پیدا میکند که با حرف "‪ "a‬شروع میشوند‪.‬‬ ‫'‪LIKE 'a%‬‬

‫اين دستور مقاديري را پیدا میکند که به حرف "‪ "a‬ختم میشوند‪.‬‬ ‫'‪LIKE '%a‬‬

‫مقاديري را پیدا میکند که ‪ or‬داشته باشند‪.‬‬ ‫'‪LIKE '%or%‬‬

‫اين دستور به مقاديري اشاره دارد که حرف دوم آنها ‪ r‬باشد‪.‬‬ ‫'‪LIKE '_r%‬‬

‫به مقاديري اشاره دارد که با حرف ‪ a‬شروع شده و داراي حداقل دو حرف است‪.‬‬ ‫'‪LIKE 'a_%‬‬

‫به مقاديري اشاره دارد که با حرف ‪ a‬شروع شده و حداقل داراي سه کاراکتر هستند‪.‬‬ ‫'‪LIKE 'a__%‬‬

‫مقاديري را پیدا میکنند که با حرف ‪ a‬شروع شده و با حرف ‪ o‬پايان میيابد‪.‬‬ ‫'‪LIKE 'a%o‬‬

‫مقاديري را که مقدار دوم آنها‪ 2 ،‬و مقدار آخر‪ 3 ،‬باشد‪.‬‬ ‫'‪LIKE '_2%3‬‬

‫‪a%‬‬ ‫مثال اول –‬


‫‪Customer‬‬ ‫در اين قسمت میخواهیم گزينههايی را پیدا کنیم که با حرف ‪ a‬شروع میشوند‪ ،‬در دستور زير قسمت‬
‫‪ Name‬بررسی میشود و اگر کلمهاي با ‪ a‬شروع شود را در خروجی بهمانند شکل ‪ 3-34‬چاپ میکند‪:‬‬

‫‪SELECT * FROM Customers‬‬


‫;'‪WHERE "Customer Name" LIKE 'a%‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪84‬‬

‫شکل ‪ 3-34‬بررسی دستور ‪LIKE‬‬

‫‪%a‬‬ ‫مثال دوم ‪-‬‬


‫در اين مثال در خروجی در ستون ‪ ،Customers Name‬کلماتی که به ‪ a‬ختم میشوند در خروجی چاپ خواهند شد‪.‬‬
‫‪BETWEEN‬‬ ‫‪ 3-1-5-8‬بررسی دستور‬
‫اين دستور مقدار مشخصشده بین دو محدوده را در خروجی نمايش میدهید‪ ،‬شکل کلی اين دستور بهصورت زير‬
‫میباشد‪:‬‬
‫)‪SELECT column_name(s‬‬
‫‪FROM table_name‬‬
‫;‪WHERE column_name BETWEEN value1 AND value2‬‬

‫براي اينکه دستور ‪ BETWEEN‬را اجرا کنیم بايد يک ستون جديد به جدول اصلی خود اضافه کنیم؛ براي اين کار طبق‬
‫شکل ‪ 3-35‬بر روي جدول مورد نظر خود کلیک راست کنید و قسمت ‪ Design‬را انتخاب کنید و يک ستون با عنوان‬
‫‪ Price‬و از نوع ‪ int‬وارد کنید‪.‬‬

‫شکل ‪ 3-35‬بررسی دستور ‪BETWEEN‬‬

‫‪INSERT‬‬ ‫در ادامه بايد بهمانند شکل ‪ 3-36‬اطالعات ستون ‪ Price‬را وارد کنید؛ براي تمرين میتوانید از طريق دستور‬
‫اين کار را انجام دهید‪.‬‬
‫‪www.takbook.com‬‬

‫‪85‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-36‬نمایش جدول ‪Price‬‬

‫‪BETWEEN‬‬ ‫مثال اول –دستور‬

‫‪SELECT * FROM Customers‬‬


‫;‪WHERE Price BETWEEN 10 AND 20‬‬

‫در دستور باال‪ ،‬قیمت بین ‪ 10‬تا ‪ 20‬در خروجی نمايش داده خواهد شد که اين موضوع را در شکل ‪ 3-37‬مشاهده‬
‫میکنید‪:‬‬

‫شکل ‪ 3-37‬بررسی دستور ‪BETWEEN‬‬

‫مثال دوم‬
‫‪SELECT * FROM Customers‬‬
‫;'‪WHERE "Contact Name" BETWEEN 'A' and 'Z‬‬

‫در دستور باال و در ستون ‪ ،Contact Name‬اسامی که با حروف ‪ A‬تا ‪ Z‬شروع شوند در خروجی چاپ خواهد شد‪.‬‬
‫مثال سوم – منظم کردن خروجی‬
‫‪SELECT * FROM Customers‬‬
‫'‪WHERE "Contact Name" BETWEEN 'Alfred' and 'Juan‬‬
‫;"‪ORDER BY "Contact Name‬‬
‫در دستور باال‪ ،‬يک دستور جديد اضافه شده است با نام ‪ ORDER BY‬که اين دستور براي منظم کردن ستون خروجی‬
‫است که اين موضوع را در شکل ‪ 3-38‬مشاهده میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪86‬‬

‫شکل ‪ 3-38‬بررسی دستور ‪BETWEE‬‬

‫‪IN‬‬ ‫‪ 3-1-5-9‬بررسی دستور‬


‫اين دستور اصو ًال در يک شرط به کار گرفته میشود و مشخص میکند چه گزينههايی بايد در خروجی نمايش داده‬
‫شود‪ ،‬شماي کلی دستور ‪ IN‬بهصورت زير است‪:‬‬
‫)‪SELECT column_name(s‬‬
‫‪FROM table_name‬‬
‫; )‪WHERE column_name IN (value1, value2, ...‬‬
‫روش ديگري نیز براي بهکارگیري دستور ‪ IN‬وجود دارد که شکل کلی آن بهصورت زير است‪:‬‬

‫)‪SELECT column_name(s‬‬
‫‪FROM table_name‬‬
‫;)‪WHERE column_name IN (SELECT STATEMENT‬‬

‫‪IN‬‬ ‫مثال اول – بررسی دستور‬

‫‪SELECT * FROM Customers‬‬


‫; )'‪WHERE City NOT IN ('London','Tehran‬‬

‫نباشند‪ ،‬چون پیش از‬ ‫‪Tehran‬‬ ‫و‬ ‫‪London‬‬ ‫در مثال باال‪ ،‬ستونهايی در خروجی چاپ خواهد شد که داراي شهرهاي‬
‫دستور ‪ ،IN‬دستور ‪ NOT‬به کار برده شده است و به اين دلیل شرط منفی خواهد شد‪.‬‬

‫شکل ‪ 3-39‬بررسی دستور ‪IN‬‬

‫‪TOP‬‬ ‫‪ 3-1-5-10‬بررسی دستور‬


‫اين دستور براي نمايش تعداد سطر در خروجی کاربرد دارد که داراي گزينههاي مختلفی است و شکل کلی آن را در‬
‫زير مشاهده میکنید‪:‬‬
‫)‪SELECT TOP number|percent column_name(s‬‬
‫‪FROM table_name‬‬
‫;‪WHERE condition‬‬
‫‪www.takbook.com‬‬

‫‪87‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪TOP‬‬ ‫مثال اول ‪ -‬بررسی دستور‬

‫;‪SELECT TOP 4 * FROM Customers‬‬


‫در دستور باال‪ 4 ،‬سطر از جدول ‪ Customers‬بهمانند شکل ‪ 3-40‬در خروجی چاپ خواهد شد‪.‬‬

‫شکل ‪ 3-40‬بررسی دستور ‪TOP‬‬

‫‪OFFSET‬‬ ‫مثال دوم – استفاده از‬

‫‪SELECT * FROM Customers‬‬


‫‪ORDER BY CustomerID‬‬
‫;‪OFFSET 2 ROWS‬‬
‫براي استفاده از دستور ‪ OFFSET‬حتماً بايد قبل از آن از دستور ‪ ORDER BY‬استفاده کنید تا ‪ ID‬مورد نظر منظم شود‬
‫و بعد میتوانید از دستور ‪ OFFSET‬استفاده کنید؛ توجه داشته باشید که اين دستور از شمارهاي که در مقابل آن نوشته‬
‫میشود در جدول مورد نظر شمارههاي بعد از آن را در خروجی چاپ میکنند‪ ،‬مانند دستور باال که شمارهي ‪ 2‬نوشته‬
‫شده است‪ ،‬اما از شمارهي ‪ 3‬به بعد در خروجی چاپ خواهد شد‪ ،‬اگر به شکل ‪ 3-41‬توجه کنید اين موضوع را‬
‫مشاهده میکنید؛ توجه داشته باشد که دستور ‪ ROWS‬به رديفها اشاره دارد‪.‬‬

‫شکل ‪ 3-41‬بررسی ‪OFFSET‬‬

‫‪PRESENT‬‬ ‫مثال سوم – استفاده از دستورات ‪ FETCH‬و‬


‫‪SELECT * FROM Customers‬‬
‫‪ORDER BY CustomerID‬‬
‫‪OFFSET 2 ROWS‬‬
‫;‪FETCH FIRST 3 ROWS ONLY‬‬
‫اين دستور از چند قسمت تشکیل شده است؛ در خط اول با دستور ‪ ،SELECT‬جدول ‪ Customers‬انتخاب شده و در‬
‫‪OFFSET‬‬ ‫با دستور‬ ‫‪CustomerID‬‬ ‫با دستور ‪ ORDER BY‬مرتب میشود‪ ،‬بعد از مرتب شدن‬ ‫‪CustomerID‬‬ ‫خط دوم‪،‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪88‬‬


‫مشخص میکنیم که از سطر سوم به بعد در خروجی چاپ شود و در خط آخر نیز مشخص میکنیم که چند سطر در‬
‫خروجی چاپ شود که اين موضوع را در شکل ‪ 3-42‬مشاهده میکنید‪.‬‬

‫شکل ‪ 3-42‬بررسی دستور ‪ FETCH‬و ‪PRESENT‬‬

‫‪TOP‬‬ ‫مثال چهارم – استفاده از ‪ WHERE‬به همراه‬


‫‪SELECT TOP 3 * FROM Customers‬‬
‫;'‪WHERE Country='Germany‬‬

‫در دستور باال با استفاده از ‪ TOP‬تعداد خروجی کار مشخص شده است‪ ،‬يعنی اگر سطر مورد نظر کشورش‬
‫‪ Germany‬باشد در خروجی چاپ خواهد شد‪ ،‬اما تنها ‪ 3‬سطر آن چاپ خواهد شد و اگر بیشتر باشد‪ ،‬چاپ نخواهد‬
‫شد که در شکل ‪ 3-43‬اين موضوع را مشاهده میکنید‪.‬‬

‫شکل ‪ 3-43‬بررسی دستور ‪TOP‬‬

‫دستور ‪MIN and MAX‬‬ ‫‪ 3-1-5-11‬بررسی‬

‫اين دستور کمترين و بیشترين مقدار در يک ستون را برمیگرداند که در زير شکل کلی آن را مشاهده میکنید‪:‬‬
‫‪MIN‬‬
‫)‪SELECT MIN(column_name‬‬
‫‪FROM table_name‬‬
‫;‪WHERE condition‬‬
‫‪MAX‬‬
‫)‪SELECT MAX(column_name‬‬
‫‪FROM table_name‬‬
‫;‪WHERE condition‬‬
‫‪MIN & MAX‬‬ ‫مثال يک – دستور‬
‫‪www.takbook.com‬‬

‫‪89‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫)‪SELECT MIN(Price‬‬
‫;‪FROM Customers‬‬
‫)‪SELECT MAX(Price‬‬
‫;‪FROM Customers‬‬

‫در دستور باال‪ ،‬دو عدد ‪ MIN‬و ‪ MAX‬از ستون ‪ Price‬در خروجی چاپ خواهد شد که اين موضوع را در شکل ‪-44‬‬
‫‪ 3‬مشاهده میکنید‪.‬‬

‫شکل ‪ 3-44‬بررسی دستور ‪ MIN‬و ‪MAX‬‬

‫نکتهي مهم‪:‬‬
‫توجه کنید که ايجاد ‪ Query‬بايد در مسیر درست انجام شود‪ ،‬اگر بهمانند شکل ‪ 3-45‬بر روي ‪ SQLSERVER‬کلیک‬
‫را انتخاب کنید و بعد دستورات باال را در آن اجرا کنید با خطاي شکل ‪3-64‬‬ ‫‪New Query‬‬ ‫راست کنید و گزينهي‬
‫مواجه خواهید شد که دلیل آن نیز اين است که جدول ‪ Customers‬در زيرمجموعهي ديگري قرار دارد و حتماً بايد بر‬
‫روي ديتابیس مورد نظر اين دستور را اجرا کنید‪.‬‬

‫شکل ‪ 3-45‬ایجاد ‪Query‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪90‬‬

‫شکل ‪ 3-46‬بررسی دستور ‪ MIN‬و ‪MAX‬‬

‫‪SUM‬‬ ‫‪ 3-1-5-12‬بررسی دستور ‪ AVG ،COUNT‬و‬


‫شکل کلی دستور ‪ Count‬بهصورت زير است‪:‬‬
‫)‪SELECT COUNT(column_name‬‬
‫‪FROM table_name‬‬
‫;‪WHERE condition‬‬
‫شکل کلی دستور ‪ AVG‬بهصورت زير است‪:‬‬

‫)‪SELECT AVG(column_name‬‬
‫‪FROM table_name‬‬
‫;‪WHERE condition‬‬

‫شکل کلی دستور ‪ SUM‬بهصورت زير است‪:‬‬

‫)‪SELECT SUM(column_name‬‬
‫‪FROM table_name‬‬
‫;‪WHERE condition‬‬

‫براي هر يک از دستورات باال‪ ،‬يک مثال را با هم بررسی میکنیم‪:‬‬


‫‪Count‬‬ ‫مثال اول – بررسی دستور‬

‫;‪SELECT * From Customers‬‬

‫)‪SELECT COUNT(PRICE‬‬
‫;‪FROM Customers‬‬
‫در خط اول‪ ،‬کل جدول ‪ Customers‬در خروجی چاپ خواهد شد و در خط بعدي با دستور ‪ ،COUNT‬تعداد موجودي‬
‫در ستون ‪ Price‬مشخص خواهد شد که در شکل ‪ 3-47‬اين موضوع را مشاهده میکنید؛ در قسمت دوم عدد ‪ 8‬نوشته‬
‫شده است که تعداد موجودي در ستون ‪ Price‬است‪.‬‬
‫‪www.takbook.com‬‬

‫‪91‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-47‬بررسی دستور ‪COUNT‬‬

‫‪AVG‬‬ ‫مثال دوم – بررسی دستور‬


‫)‪SELECT AVG(PRICE‬‬
‫;‪FROM Customers‬‬
‫در دستور باال‪ ،‬میانگین اعدادي ستون ‪ Price‬حساب شده است و در خروجی چاپ خواهد شد که اين موضوع را در‬
‫شکل ‪ 3-48‬مشاهده میکنید‪ ،‬اگر توجه کنید با ماشین حساب جمع کل ستون ‪ Price‬را محاسبه و تقسیم بر ‪ 8‬کرديم‬
‫که نتیجهي آن عدد ‪ 31‬شده است‪.‬‬

‫شکل ‪ 3-48‬بررسی دستور ‪AVG‬‬

‫‪SUM‬‬ ‫مثال سوم – بررسی دستور‬


‫)‪SELECT SUM(PRICE‬‬
‫;‪FROM Customers‬‬
‫اين دستور‪ ،‬کل ستون ‪ Price‬را جمع خواهد کرد که در شکل ‪ 3-49‬اين موضوع را مشاهده میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪92‬‬

‫شکل ‪ 3-49‬بررسی دستور ‪SUM‬‬

‫‪Wildcards‬‬ ‫‪ 3-1-5-13‬بررسی‬
‫استفاده میشود و براي جستجو و جايگزينی در يک رسته کاربرد دارند‪ ،‬در زير‬ ‫‪LIKE‬‬ ‫اين دستور در کنار دستور‬
‫کاراکترهايی که میتوان بهعنوان ‪ Wildcard‬در دستورات استفاده کرد‪.‬‬

‫جدول ‪ 3-8‬بررسی ‪Wildcard‬‬

‫‪Symbol‬‬ ‫توضیحات‬ ‫مثال‬


‫‪%‬‬ ‫صفر يا اکثر نويسهها را نشان میدهد‪.‬‬ ‫‪ bl%‬کلماتی مانند ‪ bl, black, blue,‬و‪ blob‬را پیدا میکند‪.‬‬
‫نمايندهي يک شخصیت واحد است‬
‫_‬ ‫دستور ‪ h_t‬کلماتی مانند ‪ hot, hat,‬و‪ hit‬را پیدا میکند‪.‬‬

‫را نشان میدهد‪ ،‬اما کلمهي هر کاراکتر را در داخل براکت نشان‬ ‫‪ hot‬و‪hat‬‬ ‫کلمات‬ ‫‪h[oa]t‬‬ ‫دستور‬
‫][‬
‫میدهد‪.‬‬ ‫‪ hit‬را نمايش نمیدهد‪.‬‬
‫هر کاراکتري که در پرانتز نیست را‬
‫هر کلمهاي که در کروشه نباشد را نشان‬ ‫‪h[^oa]t‬‬ ‫دستور‬
‫^‬ ‫نشان میدهد‪.‬‬
‫میدهد‪ ،‬مانند ‪. hit‬‬

‫طیف وسیعی از نويسهها را نشان‬


‫‪-‬‬ ‫میدهد‪.‬‬ ‫دستور ‪ c[a-b]t‬کلمات ‪ cat‬و ‪ cbt‬را پیدا میکند‪.‬‬

‫مثال اول‬
‫‪SELECT * FROM Customers‬‬
‫;'‪WHERE City LIKE 'fr%‬‬
‫در دستور باال‪ ،‬شهرهايی که با نام ‪ fr‬شروع میشوند در خروجی چاپ خواهند شد که در شکل ‪ 3-50‬مشاهده میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪93‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-50‬بررسی ‪Wildcards‬‬

‫مثال دوم‬
‫‪SELECT * FROM Customers‬‬
‫;'‪WHERE City LIKE '%hr%‬‬
‫دارند در خروجی چاپ خواهد شد که در شکل ‪ 3-51‬اين موضوع را‬ ‫‪hr‬‬ ‫دستور باال‪ ،‬شهرهايی که بین کلماتشان‬
‫مشاهده میکنید‪:‬‬

‫شکل ‪ 3-51‬بررسی دستور ‪Wildcards‬‬

‫مثال سوم‬
‫‪SELECT * FROM Customers‬‬
‫;'‪WHERE City LIKE '[bspt]%‬‬
‫در دستور باال‪ ،‬شهرهايی که با يکی از حروف ‪ bspt‬شروع شوند در خروجی چاپ خواهد شد که شکل ‪ 3-52‬نمايانگر‬
‫اين موضوع است‪.‬‬

‫شکل ‪ 3-52‬بررسی دستور ‪Wildcards‬‬

‫مثال چهارم‬
‫‪SELECT * FROM Customers‬‬
‫;'‪WHERE City LIKE '[a-f]%‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪94‬‬


‫در دستور باال‪ ،‬شهرهايی که با حروف ‪ a‬تا ‪ f‬شروع میشوند در خروجی چاپ خواهد شد که در شکل ‪ 3-53‬مشخص‬
‫شده است‪.‬‬

‫شکل ‪ 3-53‬بررسی دستور ‪Wildcards‬‬

‫‪Aliass‬‬ ‫‪ 3-1-5-14‬بررسی دستور‬


‫اين دستور براي ايجاد يک نام مستعار براي ستونهاي يک جدول کاربرد دارد تا خوانايی آن راحتتر شود؛ اين نام‬
‫تنها در زمان جستجو ايجاد می شود و بعد از آن حذف خواهد شد‪ ،‬اين دستور را بايد با ‪ AS‬اجرا کرد که شکل کلی‬
‫آن بهصورت زير است‪:‬‬
‫‪SELECT column_name AS alias_name‬‬
‫;‪FROM table_name‬‬
‫در دستور باال‪ alias_name ،‬يک نام مستعار براي جدول مورد نظر است خواهد بود‪.‬‬

‫مثال اول‬
‫‪SELECT CustomerID AS ID, "Customer Name" AS Customer‬‬
‫;‪FROM Customers‬‬
‫در دستور باال‪ ،‬دو ستون ‪ CustomerID‬و ‪ Customer Name‬با دو نام جديد در خروجی چاپ خواهند شد که در شکل‬
‫‪ 54-3‬اين موضوع را مشاهده میکنید‪.‬‬

‫شکل ‪ 3-54‬بررسی دستور ‪Aliass‬‬

‫مثال دوم‬
‫"‪SELECT "Customer Name" AS Customer, "Contact Name" AS "Contact Person‬‬
‫;‪FROM Customers‬‬
‫‪www.takbook.com‬‬

‫‪95‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫اين دستور نیز بهمانند دستور قبلی است و نکتهاي که در اين دستور وجود دارد‪ ،‬اين است که براي‬
‫ايجاد يک ستون دو حرفی بايد کلمهي مورد نظر را در يک کروشه قرار دهید؛ اين موضوع را در شکل ‪ 3-55‬مشاهده‬
‫میکنید‪.‬‬

‫شکل ‪ 3-55‬بررسی دستور ‪Aliass‬‬

‫مثال سوم‬
‫‪SELECT "Customer Name", Address + ', ' + PostalCode + ' ' + City + ', ' + Country AS‬‬
‫‪Address‬‬
‫;‪FROM Customers‬‬
‫در دستور باال‪ ،‬دو ستون در خروجی چاپ خواهد شد که در ستون ‪ ،Address‬چند گزينه چاپ خواهد شد که شامل‬
‫‪ Address, PostalCode, City‬و کشور خواهد بود که در شکل ‪ 3-56‬اين موضوع را مشاهده میکنید‪.‬‬

‫شکل ‪ 3-56‬بررسی دستور ‪Aliass‬‬

‫‪GROUP BY‬‬ ‫‪ 3-1-5-15‬بررسی دستور‬


‫تابعهاي ‪COUNT(), MAX(), MIN(),‬‬ ‫دستور ‪ GROUP BY‬براي جمعبندي مقادير يکسان کاربرد دارد و آنها را توسط‬
‫)(‪ SUM(), AVG‬در خروجی چاپ خواهد کرد‪ ،‬شکل کلی اين دستور بهصورت زير خواهد بود‪:‬‬
‫)‪SELECT column_name(s‬‬
‫‪FROM table_name‬‬
‫‪WHERE condition‬‬
‫)‪GROUP BY column_name(s‬‬
‫;)‪ORDER BY column_name(s‬‬
‫مثال اول‬
‫‪SELECT * FROM Customers‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪96‬‬

‫‪SELECT COUNT(CustomerID), Country‬‬


‫‪FROM Customers‬‬
‫;‪GROUP BY Country‬‬

‫در دستور باال‪ ،‬در خط اول يک خروجی کلی از اطالعات جدول ‪ Customers‬را خواهیم داشت و در ادامه با استفاده‬
‫از دستور ‪ ،COUNT‬تعداد مشتريان هر کشور شمارش میشود و در آخر با دستور‪ ،GROUP BY‬تعداد مشتريان به‬
‫همراه کشورهاي آنها چاپ شده است؛ در شکل ‪ 3-57‬اين موضوع را مشاهده میکنید‪.‬‬

‫شکل ‪ 3-57‬بررسی دستور ‪GROUP BY‬‬

‫مثال دوم‬
‫‪SELECT * FROM Customers‬‬

‫‪SELECT COUNT(CustomerID), Country‬‬


‫‪FROM Customers‬‬
‫;‪GROUP BY Country‬‬
‫در دستور باال بهمانند دستورات قبلی مشتريان مورد نظر چاپ خواهد شد‪ ،‬اما در آخر خط با دستور ‪ ORDER BY‬به‬
‫همراه دستور ‪ DESC‬از بیشتر به کمتر مشتريان مرتب خواهند شد که در شکل ‪ 3-58‬اين موضوع را مشاهده میکنید‪.‬‬

‫شکل ‪ 3-58‬بررسی دستور ‪GROUP BY‬‬


‫‪www.takbook.com‬‬

‫‪97‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪HAVING‬‬ ‫‪ 3-1-5-16‬بررسی دستور‬
‫اين دستور‪ ،‬يک دستور کمکی است که میتواند در دستورات اضافه شود؛ شکل کل اين دستور بهصورت زير است‪:‬‬
‫)‪SELECT column_name(s‬‬
‫‪FROM table_name‬‬
‫‪WHERE condition‬‬
‫)‪GROUP BY column_name(s‬‬
‫‪HAVING condition‬‬
‫;)‪ORDER BY column_name(s‬‬
‫مثال اول‬
‫‪SELECT COUNT(CustomerID), Country‬‬
‫‪FROM Customers‬‬
‫‪GROUP BY Country‬‬
‫‪HAVING COUNT(CustomerID) > 0‬‬
‫;‪ORDER BY COUNT(CustomerID) DESC‬‬

‫قرار داده شده به اين معنی است که تعداد مشتريان هر کشور‬ ‫‪HAVING‬‬ ‫در مثال باال‪ ،‬عدد صفري که مقابل دستور‬
‫اگر بیشتر از صفر بود‪ ،‬در خروجی چاپ کند‪ .‬شما می توانید اين عدد را تغییر دهید و يا اينکه عملگر آن را عوض‬
‫کنید‪ ،‬در شکل ‪ 3-59‬اين مثال را مشاهده میکنید‪.‬‬

‫شکل ‪ 3-59‬بررسی دستور ‪HAVING‬‬

‫‪PRIMARY KEY‬‬ ‫‪ 3-1-5-17‬بررسی‬


‫زمانی که يک جدول ايجاد میکنید‪ ،‬میتوانید مشخص کنید که کدام ستون بهعنوان ‪ PRIMARY KEY‬انتخاب شود؛‬
‫انتخاب يک ستون بهعنوان ‪ PRIMARY KEY‬باعث میشود که مقدار آن ديگر‪ Null ،‬يا خالی نباشد و حتماً بايد آن را‬
‫پر کنید؛ براي اين کار بهمانند شکل ‪ 3-60‬بر روي جدول مورد نظر کلیک راست کنید و گزينهي ‪ Design‬را انتخاب‬
‫کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪98‬‬

‫شکل ‪ 3-60‬طراحی‬

‫بهمانند شکل ‪ 3-61‬بر روي ستونی که میخواهید بهعنوان ‪ Primary Key‬انتخاب شود‪ ،‬کلیک راست کنید و گزينهي‬
‫‪ Set Primary Key‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-61‬بررسی ‪PRIMARY KEY‬‬

‫در بعد از انتخاب ‪ Primary Key‬در شکل ‪ 3-62‬يک کلید در کنار ستون مورد نظر قرار خواهد گرفت و در قسمت‬
‫‪ ،Allow Nulls‬تیک آن برداشته خواهد شد؛ به دلیل اينکه اين ستون اصالً نبايد خالی باشد‪ ،‬مانند شمارهي دانشجويی‬
‫در دانشگاهها‪.‬‬

‫شکل ‪ 3-62‬بررسی ‪PRIMARY KEY‬‬


‫‪www.takbook.com‬‬

‫‪99‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫براي اينکه بتوانیم از طريق دستورات ‪ T-SQL‬يک جدول ايجاد کنیم که داراي ‪ Primary Key‬باشد بايد دستورات زير‬
‫را اجرا کنیم‪:‬‬
‫( ‪CREATE TABLE Persons‬‬
‫‪ID int NOT NULL,‬‬
‫‪LastName varchar(255) NOT NULL,‬‬
‫‪FirstName varchar(255),‬‬
‫‪Age int,‬‬
‫)‪PRIMARY KEY (ID‬‬
‫; )‬
‫در دستورات باال‪ ،‬يک جدول جديد با نام ‪ Persons‬ايجاد کرديم که ستونهاي ‪ ID‬و ‪ LastName‬نبايد خالی باشد و در‬
‫قسمت آخر ‪ PRIMARY KEY‬را نیز برابر ‪ ID‬قرار داديم‪ ،‬اگر به شکل ‪ 3-63‬توجه کنید نتیجهي دستور را مشاهده‬
‫خواهید کرد‪.‬‬

‫شکل ‪ 3-63‬بررسی ‪PRIMARY KEY‬‬

‫اگر بخواهیم دستور باال را تغییر دهیم‪ ،‬میتوانیم از دستور زير استفاده کنیم‪:‬‬
‫( ‪CREATE TABLE Persons‬‬
‫‪ID int NOT NULL PRIMARY KEY,‬‬
‫‪LastName varchar(255) NOT NULL,‬‬
‫‪FirstName varchar(255),‬‬
‫‪Age int‬‬
‫; )‬
‫در دستور باال‪ Primary Key ،‬در کنار ‪ ID‬قرار گرفته شده است‪.‬‬
‫‪SQL‬‬ ‫‪ 3-1-5-18‬بررسی ‪ JOIN‬در‬
‫يکی از مهمترين دستوراتی که در ‪ SQL‬میتوان نام برد‪ ،‬دستور ‪ JOIN‬است که اين دستور اساساً براي ترکیب و بازيابی‬
‫دادهها از دو يا چند جدول مورد استفاده قرار میگیرد‪ .‬در يک پايگاهداده‪ ،‬رابطهاي در دنیاي واقعی‪ ،‬دادهها در تعداد‬
‫‪SQL‬‬ ‫زيادي جداول ساختار میيابند و به اين دلیل‪ ،‬دائماً بايد به اين جداول متصل شد‪ .‬چهار نوع اساسی عضويت در‬
‫‪ Server‬وجود دارد‪ Self ،Outer ،Inner :‬و ‪ .Cross join‬براي اينکه يک مرور سريع در مورد همهي اين پیوستنها داشته‬
‫باشید در زير آنها را بررسی میکنیم‪:‬‬
‫در شکل ‪ 3-64‬يک شماي کلی از نحوهي ارتباط دستورات ‪ JOIN‬را مشاهده میکنید که هر کدام توضیح مخصوص‬
‫به خود را دارند‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪100‬‬

‫شکل ‪ 3-64‬بررسی دستور ‪JOIN‬‬

‫توانايی ترکیب نتايجِ حاصل از سطرهاي مرتبط از چندين جدول‪ ،‬قسمت مهمی در طراحی سیستم پايگاه دادهاي‬
‫انجام میشود‪ .‬اين ماهیت سیستمهاي پايگاهدادهاي رابطهاي‬ ‫‪join‬‬ ‫اين امر با دستور‬ ‫‪SQL Server‬‬ ‫رابطهاي است‪ .‬در‬
‫سنتی است که برخی از جدولها حاوي اطالعات مربوط به جداول ديگر با مقدار کلیدي مشترک هستند‪ .‬با استفاده‬
‫از پیوستن ‪ ،SQL‬میتوانید بهراحتی از طريق چندين جدول با اين کلیدهاي مشترک‪ ،‬پرسوجوهايی را در مجموعه‬
‫دادههاي مرتبط انجام دهید‪.‬‬
‫در ادامه نوعهاي مختلف ‪ SQL JOIN‬را که در شکل ‪ 3-43‬مشخص شده است را با هم بررسی میکنیم‪:‬‬
‫‪SQL inner join‬‬ ‫‪-1‬‬
‫اين دستور يکی از سادهترين دستورات ‪ JOIN‬است که نتیجهي خروجی آن‪ ،‬سطري از هر دو جدول است‬
‫که در آن شرايط پیوستگی يکی باشد؛ در شکل ‪ 3-65‬شماي کلی اين دستور را مشاهده میکنید‪.‬‬

‫شکل ‪SQL inner join3-65‬‬

‫دستورات کلی ‪ Inner Join‬بهصورت زير است‪:‬‬

‫‪SELECT ColumnList from LeftTable L‬‬


‫‪INNER join RightTable R‬‬
‫‪ON L.Column=R.Column‬‬

‫‪SQL self join‬‬ ‫‪-2‬‬


‫اين دستور باعث میشود‪ ،‬يک جدول با خودش ‪ Join‬شود که در ادامه‪ ،‬نحوهي کار آن را بررسی خواهیم‬
‫کرد‪.‬‬
‫شکل ‪ 3-66‬نماي کلی دستور بهصورت زير است‪:‬‬
‫‪www.takbook.com‬‬

‫‪101‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫)‪SELECT column_name(s‬‬
‫‪FROM table1 T1, table1 T2‬‬
‫‪WHERE condition‬‬

‫شکل ‪SQL self join 3-66‬‬

‫‪SQL cross join‬‬ ‫‪-3‬‬


‫اين نوع ‪ JOIN‬حاصلضرب دکارتی سطرهاي تعیینشده در دستور ‪ join‬را در خروجی نمايش میدهد‪ .‬اين‬
‫دستور‪ ،‬سطرهايی را تولید میکند که ترکیبی از سطر جدول اول و دوم است که نماي کلی آن را در شکل‬
‫‪ 3-67‬مشاهده میکنید‪.‬‬

‫شکل ‪SQL cross Join 3-67‬‬

‫‪SQL outer join‬‬ ‫‪-4‬‬


‫است که هرکدام براي کار خاص‬ ‫‪LEFT OUTER, RIGHT OUTER, FULL‬‬ ‫اين دستور شامل سه دستور‬
‫طراحی شدهاند‪.‬‬
‫‪LEFT OUTER JOIN‬‬ ‫دستور‬
‫شکل کلی اين دستور بهصورت زير است‪:‬‬

‫)‪SELECT column_name(s‬‬
‫‪FROM table1‬‬
‫‪LEFT JOIN table2‬‬
‫;‪ON table1.column_name = table2.column_name‬‬
‫اين دستور‪ ،‬تمام اطالعات را از جدول سمت چپ‪ ،‬يعنی جدول اول و اطالعات منطبق را از جدول دوم در‬
‫خروجی چاپ میکند و اگر هم عدم تطابق ايجاد شود‪ ،‬نتیجهي صفر را از جدول سمت راست برمیگرداند؛‬
‫در شکل ‪ 3-68‬اين موضوع مشخص شده است‪.‬‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 102

SQL Full outer 3- 68 ‫شکل‬

INNER JOIN ‫مثال دستور‬


‫براي اينکه بیشتر با اين دستورات آشنا شويم يک مثال را با هم بررسی میکنیم؛ براي شروع نیاز به دو جدول داريم‬
.‫ را بر روي آنها انجام دهیم‬JOIN ‫تا بتوانیم عملیات‬
Customers 3-9 ‫جدول‬

CustomerID Customer Contact Address City postalco country Price


Name Name de
1 Maria Alfred Obere Str. 57 Frankf 12209 Germany 10
Schmidt urt
2 Ana Juan Avda. de la México 05021 Mexico 11
Constitución
2222
3 Antonio Juan Mataderos 2312 México 05023 Mexico 25

4 Thomas Thomas 120 Hanover Londo WA1 UK 36


Hardy Sq. n 1DP
5 Christina Christina Berguvsvägen 8 Luleå S-958 Sweden 52
22
6 Cardinal Tom B. Skagen 21 Stavan 4006 Norway 88
Erichsen ger
7 Farshid Babajani Seied Khandan Tehran 8843 Iran 9

8 Azadeh Tishebarsar Monikh Frankf 5565 Germany 20


urt
Order‫جدول‬

Order 3 -10 ‫جدول‬

OrderID CustomerID OrderDate


10308 8 1996-09-18
10309 6 1996-09-19
10310 4 1996-09-20
‫ را بر روي آنها‬Join ‫ آنها را ايجاد کنیم تا بتوانیم عملیات‬SQL ‫ را مشاهده میکنید که بايد در‬3-10 ‫ و‬3-9 ‫دو جدول‬
.‫انجام دهیم‬
.‫ ايجاد شدهاند‬SQL ‫ دو جدول مورد نظر در‬،‫ مشاهده میکنید‬3-69 ‫همان طور که در شکل‬
‫‪www.takbook.com‬‬

‫‪103‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-69‬ایجاد جدول‬

‫با استفاده از دستور زير میتوانیم بین دو جدول ارتباط داخلی برقرار کنیم‪:‬‬

‫‪SELECT Customers.[Customer Name],Orders.OrderID‬‬


‫‪FROM Customers‬‬
‫‪INNER JOIN Orders‬‬
‫‪ON Customers.CustomerID=Orders.CustomerID‬‬
‫;]‪ORDER BY Customers.[Customer Name‬‬

‫در خط اول با دستور ‪ ،SELECT‬ستونهاي خروجی را که قرار است چاپ شوند را مشخص میکنیم که ستون‬
‫‪ Customer Name‬از جدول ‪ Customers‬و ستون ‪ OrderID‬از جدول ‪ Orders‬چاپ خواهد شد‪.‬‬
‫ارتباط‬ ‫‪Orders‬‬ ‫انتخاب میشود و در خط سوم مشخص میکنیم که بايد با جدول‬ ‫‪Customers‬‬ ‫در خط دوم جدول‬
‫اين کار را‬ ‫‪ON‬‬ ‫برقرار کند؛ در خط چهارم بايد شرط برقراري ارتباط را مشخص کنیم که با دستور‬ ‫‪INNER JOIN‬‬

‫انجام میدهیم و بعد از آن‪ CustomerID ،‬از جدول ‪ Customers‬را با ستون ‪ CustomerID‬از جدول ‪ Orders‬را مساوي‬
‫قرار میدهیم؛ اين بدان معنا است که اگر در اين دو ستون‪ ،‬عبارت مساوي هم قرار داشته باشد‪ ،‬آن سطر در خروجی‬
‫چاپ خواهد شد؛ در خط آخر نیز با دستور ‪ ،ORDER BY‬ستون ‪ Customer Name‬را منظم میکنیم تا در خروج‪ ،‬نماي‬
‫بهتري داشته باشد‪.‬‬
‫اگر به شکل ‪ 3-70‬توجه کنید‪ ،‬مشاهده خواهید کرد سه سطر در خروجی اپ شده است و آن هم به دلیل برابر بودن‬
‫اعداد در ستونهاي ‪ Customer ID‬در هر دو جدول است‪.‬‬

‫شکل ‪ 3-70‬بررسی دستور ‪JOIN‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪104‬‬


‫نکته‪ :‬دستور ‪ JOIN‬و ‪ INNER JOIN‬يک کار را انجام میدهند‪ ،‬اما دستور ‪ INNER JOIN‬داراي عملکرد بهتري نسبت‬
‫به دستور ‪ JOIN‬است و کار را در سريعترين زمان ممکن انجام میدهد‪.‬‬

‫‪SELF JOIN‬‬ ‫مثال دستور‬


‫همان طور که گفتیم اين دستور با خودش ارتباط برقرار میکند؛ براي تست اين موضوع از جدول ‪ Customers‬استفاده‬
‫میکنیم و دستور زير را اجرا میکنیم‪:‬‬

‫‪SELECT A.[Customer Name] AS CustomerName1, B.[Customer Name] AS CustomerName2, A.City‬‬


‫‪FROM Customers A, Customers B‬‬
‫‪WHERE A.CustomerID <> B.CustomerID‬‬
‫‪AND A.City = B.City‬‬
‫;‪ORDER BY A.City‬‬

‫در دستور باال و در خط اول‪ ،‬سه ستون در خروجی چاپ خواهد شد که دستور ‪ ،AS‬يک ستون جديد در خروجی‬
‫و ديگري‬ ‫‪Customers A‬‬ ‫نمايش میدهد؛ در قسمت ‪ ،FROM‬يک جدول به دو قسمت تبديل شده است که يکی‬
‫‪ Customers B‬است؛ در قسمت ‪ WHERE‬شرطی قرار داديم و گفتیم که در صورتی که ‪ A.CustomerID‬برابر نباشد با‬
‫يکی باشد شرط درست است و بايد در خروجی چاپ‬ ‫‪B‬‬ ‫و همچنین شهر جدول ‪ A‬با شهر جدول‬ ‫‪B.CustomerID‬‬

‫شود که در خط آخر نیز طبق ستون ‪ A.City‬خروجی منظم خواهد شد‪.‬‬


‫در شکل ‪ 3-71‬خروجی دستورات باال را مشاهده میکنید که سه ستون ايجاد و خروجی طبق شرطی که قرار داديم‪،‬‬
‫نمايشداده شده است‪.‬‬

‫شکل ‪ 3-71‬بررسی دستور ‪SELF JOIN‬‬

‫‪CROSS JOIN‬‬ ‫مثال دستور‬


‫همان طور که گفتیم‪ ،‬اين دستور با استفاده از ضرب دکارتی خروجی را مشخص میکند‪.‬‬
‫* ‪SELECT‬‬
‫‪FROM Customers‬‬
‫;‪CROSS JOIN Orders‬‬
‫‪www.takbook.com‬‬

‫‪105‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫در خروجی نمايش داده شوند‪ ،‬اما در‬ ‫‪Customers‬‬ ‫در دستور باال با دستور * ‪ SELECT‬بايد همهي ستونهاي جدول‬
‫خط آخر با دستور ‪ ،CROSS JOIN‬تمام سطرهاي جدول اول را ضرب در جدول ‪ Orders‬میکنیم که خروجی مانند‬
‫شکل ‪ 3-72‬خواهد شد‪.‬‬
‫همان طور که در شکل ‪ 3-72‬مشاهده میکنید‪ ،‬هر کدام از سطرهاي جدول ‪ Customers‬ضرب در هر کدام از سطرهاي‬
‫جدول ‪ Orders‬خواهد شد که نتیجهي آن يک جدول بزرگ از اطالعات است‪.‬‬

‫شکل‪ 3-72‬خروجی دستور ‪CROSS JOIN‬‬

‫‪OUTER JOIN‬‬ ‫مثال دستور‬


‫اين دستور همان طور که گفتیم از چندين قسمت تشکیل شده‪ OUTER:LEFT OUTER, RIGHT OUTER, FULL:‬که‬
‫آنها را با هم بررسی میکنیم‪.‬‬
‫‪LEFT JOIN‬‬ ‫مثال دستور‬
‫دستور زير را اجرا کنید‪:‬‬
‫‪SELECT Customers.[Customer Name], Orders.OrderID‬‬
‫‪FROM Customers‬‬
‫‪LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID‬‬
‫;]‪ORDER BY Customers.[Customer Name‬‬

‫در دستور باال‪ ،‬در خط اول دستور ‪ SELECT‬ستون ‪ Customer Name‬را از جدول ‪ Customers‬و ستون ‪ OrderID‬را از‬
‫انتخاب و در خط سوم با استفاده از‬ ‫‪Customers‬‬ ‫در خروجی چاپ خواهد کرد؛ در خط دوم جدول‬ ‫‪Orders‬‬ ‫جدول‬
‫دستور ‪ LEFT JOIN‬میگويیم که ستون ‪ Customers.CustomerID‬برابر با ‪ Orders.CustomerID‬باشد؛ اين دستور تمام‬
‫‪Orders‬‬ ‫را در صورت تطبیق در خروجی چاپ خواهد کرد و اگر در جدول دوم‪ ،‬يعنی‬ ‫‪Customers‬‬ ‫اطالعات جدول‬
‫مقداري وجود نداشته باشد‪ ،‬کلمهي ‪ null‬را برمیگرداند‪.‬‬
‫همان طور که در شکل ‪ 3-74‬مشاهده میکنید‪ ،‬خروجی به درستی نمايش داده شده است‪.‬‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 106

OUTER JOIN ‫ بررسی دستور‬3-74 ‫شکل‬

RIGHT JOIN ‫مثال دستور‬


:‫ ايجاد کنید‬SQL ‫ را در‬3-12 ‫ و‬3-11 ‫ دو جدول‬،‫براي انجام اين دستور‬
Orders 3-11 ‫جدول‬

OrderID CustomerID EmployeeID OrderDate ShipperID


10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2

Employees 3-12 ‫جدول‬

EmployeeID LastName FirstName BirthDate Photo


1 Davolio Nancy 12/8/1968 EmpID1.pic
2 Fuller Andrew 2/19/1952 EmpID2.pic
3 Leverling Janet 8/30/1963 EmpID3.pic

:‫بعد از ايجاد جدول بايد دستورات زير را اجرا کنید‬

SELECT Orders.OrderID, Employees.LastName, Employees.FirstName


FROM Orders
RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
ORDER BY Orders.OrderID;
‫متصل‬ Employess ‫و جدول‬ Orders ‫ سه ستون از دو جدول مشخص شده است و در ادامه به جدول‬،‫در خط اول‬
Orders.EmployeeID ‫ با اين شرايط که‬،‫ پیادهسازي شده است‬Employess ‫ در جدول‬RIGHT JOIN ‫میشود که شرط‬
.‫ اين موضوع را مشاهده میکنید‬3-75 ‫ = باشد؛ در شکل‬Employees.EmployeeID
‫‪www.takbook.com‬‬

‫‪107‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-75‬بررسی دستور ‪RIGHT JOIN‬‬

‫‪Full JOIN‬‬ ‫مثال دستور‬


‫اين دستور به طور کامل‪ ،‬خروجی هر دو جدول را طبق شرطی که در دستور زير مشاهده میکنید‪ ،‬نمايش میدهد‪.‬‬
‫‪SELECT Employees.FirstName, Orders.OrderID‬‬
‫‪FROM Employees‬‬
‫‪FULL OUTER JOIN Orders ON Employees.EmployeeID=Orders.CustomerID‬‬
‫;‪ORDER BY Orders.EmployeeID‬‬

‫شکل ‪ 3-76‬بررسی دستور ‪Full JOIN‬‬

‫‪synonym‬‬ ‫‪ 3-1-5-19‬بررسی دستور‬


‫میتوانید براي جداول خود مترادف درست کنید‪ ،‬يعنی میتوانید به جاي نام اصلی جداول و‬ ‫‪synonym‬‬ ‫با دستور‬
‫‪ ،View‬يک نام جديد به آنها تخصیص دهید و در کد اجرا کنید؛ در زير شکل کلی اين دستور را مشاهده میکنید‪.‬‬
‫‪CREATE SYNONYM synonym_name‬‬
‫;‪FOR object‬‬
‫براي اينکه بیشتر با اين دستور آشنا شويم‪ ،‬دستور زير را در ‪ SQL‬اجرا میکنیم‪:‬‬
‫‪CREATE SYNONYM OR1‬‬
‫;]‪FOR [dbo].[Orders‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪108‬‬


‫با استفاده از دستور ‪ ،CREATE SYNONYM‬يک نام جديد با عنوان ‪ OR1‬براي جدول ‪ Orders‬که در جلوي دستور‬
‫‪ For‬قرار داديم ايجاد میشود‪ ،‬اگر به شکل ‪ 3-77‬دقت کنید بعد از اجراي دستور در قسمت ‪ ،Synonyms‬نام جديد‬
‫شما ايجاد شده است و حاال میتوانید بهمانند جدول اصلی از آن استفاده کنید‪.‬‬

‫شکل ‪ 3-77‬بررسی دستور ‪Synonym‬‬

‫براي اينکه از اين جدول خروجی تهیه کنید‪ ،‬میتوانید بهمانند شکل ‪ 3-78‬عمل کنید؛ همان طور که مشاهده میکنید‬
‫با وارد کردن نام ‪ OR1‬در جلوي دستور ‪ ،FROM‬لیست جدول ‪ ORDERS‬در خروجی چاپ شده است؛ يکی از مزاياي‬
‫استفاده از دستور ‪ ،SYNONYM‬خالصه کردن و مشخص کردن اسم مشخص براي جداول و کوتاه کردن دستورات‬
‫است‪.‬‬

‫شکل ‪ 3-78‬خروجی جدول‬

‫خوب اگر بخواهید از طريق ‪ ،GUI‬يک ‪ SYNONYM‬ايجاد کنید بايد بهصورت شکل ‪ 3-79‬بر روي ‪ Synonyms‬کلیک‬
‫راست کنید و گزينهي ‪ New Synonyms‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-79‬ایجاد ‪Synonym‬‬


‫‪www.takbook.com‬‬

‫‪109‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫در شکل ‪ 3-80‬و در قسمت ‪ Synonyms Name‬بايد نام دلخواه خود را وارد کنید و در قسمت‪ Synonyms schema‬بايد‬
‫دسترسی کامل به جدول خواهید داشت؛ در‬ ‫‪owner‬‬ ‫نوع دسترسی آن را مشخص کنید که با وارد کردن ‪ ،dbo‬يعنی‬
‫بايد نام ديتابیسی را وارد کنید که قرار است جدول مورد نظر را از آن انتخاب کنید و در‬ ‫‪Database name‬‬ ‫قسمت‬
‫قسمت ‪ Object name‬نیز بايد نام جدول مورد نظر را وارد و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪ 3-80‬ایجاد ‪synonym‬‬

‫‪Product‬‬ ‫همان طور که در شکل ‪ 3-81‬مشاهده میکنید‪ Synonyms ،‬مورد نظر ايجاد شده و خروجی آن نیز جدول‬
‫است‪.‬‬

‫شکل ‪ 3-81‬خروجی جدول‬

‫اگر بخواهید بعد از ايجاد ‪ synonyms‬کد آن را به دست آوريد‪ ،‬میتوانید بهمانند شکل ‪ 3-82‬بر روي ‪ synonyms‬مورد‬
‫نظر کلیک راست کنید و از قسمت ‪ Script‬و بعد‪ Create to ،‬گزينهي ‪ New Query Editor‬را انتخاب کنید تا کد مورد‬
‫‪synonyms‬‬ ‫نظر نمايش داده شود که البته بعد از اجرا به شما خطا خواهد داد که‬
‫از قبل وجود دارد‪.‬‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 110

Synonym ‫ ایجاد کد‬3-82 ‫شکل‬

SQL ‫ در‬View ‫ کار با‬3-1-6

‫را در خروجی‬ SELECT ‫ها يک سري از جداول هستند که میتوانند بهصورت دقیقتر و بهتر نتیجهي دستور‬View
‫شامل جداول مجازي هستند و ربطی به جدول اصلی در‬ VIEW ‫ البته به اين موضوع توجه کنید که‬،‫نمايش دهند‬
‫ يعنی تنها براي نمايش خروجی دستور‬،‫ديتابیس ندارند و به اين دلیل هیچ چیزي را در خودشان ذخیره نمیکنند‬
.‫ تأثیري روي جداول اصلی ندارند‬،‫ است و اگر هم حذف شوند‬SELECT
‫ را بر روي آنها پیادهسازي کنیم؛ براي اين کار دستور زير را اجرا‬View ‫براي شروع کار نیاز به جداولی داريم تا بتوانیم‬
:‫کنید‬

CREATE TABLE Employees


(EmployeeID INT NOT NULL,
FirstName NVARCHAR(50) NOT NULL,
MiddleName NVARCHAR(50) NULL,
LastName NVARCHAR(75) NOT NULL,

Title NVARCHAR(100) NULL,


HireDate DATETIME NOT NULL,
VacationHours SMALLINT NOT NULL,
Salary DECIMAL(19, 4) NOT NULL
);
GO
CREATE TABLE Products
(ProductID INT NOT NULL,
Name NVARCHAR(255) NOT NULL,
Price DECIMAL(19, 4) NOT NULL
);
GO
CREATE TABLE Sales
(SalesID UNIQUEIDENTIFIER NOT NULL,
ProductID INT NOT NULL,
EmployeeID INT NOT NULL,
Quantity SMALLINT NOT NULL,
‫‪www.takbook.com‬‬

‫‪111‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪SaleDate‬‬ ‫‪DATETIME NOT NULL‬‬
‫;)‬
‫‪GO‬‬

‫ايجاد میشود که در شکل ‪ 3-83‬اين‬ ‫‪Employees, Products, Sales‬‬ ‫با اجراي دستورات باال‪ ،‬سه جدول با نامهاي‬
‫موضوع را مشاهده میکنید‪.‬‬

‫شکل ‪ 3-83‬ایجاد ‪View‬‬

‫استفاده کنیم‪ ،‬يا اينکه از‬ ‫‪T-SQL‬‬ ‫از دو روش میتوانیم استفاده کنیم؛ میتوانیم از دستورات‬ ‫‪View‬‬ ‫براي ايجاد‬
‫‪ Managemennt Studio‬استفاده کنیم‪.‬‬
‫براي ايجاد نماي جديد میتوانیم از دستورات ‪ T-SQL‬زير استفاده کنیم‪:‬‬
‫;‪USE B22‬‬
‫‪GO‬‬
‫‪CREATE VIEW ViewEmployeesWithSales‬‬
‫‪AS‬‬
‫‪SELECT DISTINCT‬‬
‫*‪Employees.‬‬
‫‪FROM Employees‬‬
‫;‪JOIN Sales ON Employees.EmployeeID = Sales.EmployeeID‬‬
‫‪GO‬‬

‫جدول ‪Employess‬‬ ‫اين يک نماي (‪ )view‬ساده با يک عبارت ساده ‪ SELECT‬است که لیستی از کارمندان فروش را در‬
‫برمیگرداند؛ در حقیقت‪ ،‬شما همیشه میتوانید قبل از ايجاد نمايش‪ ،‬تنها با اجراي قسمت ‪،SELECT‬‬ ‫‪Sales‬‬ ‫و‬
‫عبارت ‪ ،CREATE VIEW SQL‬عبارت جستجو را آزمايش کنید و بهتر است ببینید آيا پرسشی چیزي را برمیگرداند؛‬
‫براي اينکه يک قسمت از دستور در خروجی اجرا کنید بايد بهمانند شکل ‪ 3-84‬دستور مورد نظر را انتخاب کنید و‬
‫بعد‪ ،‬کلیک راست و گزينهي ‪ Execute‬را انتخاب کنید که نتیجهي آن مشخص خواهد شد؛ از آنجايی که جداول مقدار‬
‫ندارند‪ ،‬يک جدول خالی را در شکل ‪ 3-84‬مشاهده میکنید‪.‬‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 112

‫ خروجی دستور‬3-84 ‫شکل‬

:‫ میتوانیم از دستورات زير استفاده کنیم‬،‫براي اينکه مقداري را در جداول وارد کنیم‬

USE B22;
GO

INSERT INTO Employees VALUES (1,'Ken', NULL, 'Farshid', 'IT Manager', '1/1/2016',
2080, 45000);
INSERT INTO Employees VALUES (2,'Janice', NULL, 'AZADEH', 'Sales Representative',
'12/11/2016', 2080, 45000);

INSERT INTO Products VALUES (1,'Long-Sleeve Logo Jersey, S', 12.99);


INSERT INTO Products VALUES (2, 'Long-Sleeve Logo Jersey, M', 14.99);
INSERT INTO Products VALUES (3, 'Long-Sleeve Logo Jersey, L', 16.99);
INSERT INTO Products VALUES (4, 'Long-Sleeve Logo Jersey, XL', 18.99);

INSERT INTO Sales VALUES (NEWID(), 1, 1, 4, '04/15/2016');


INSERT INTO Sales VALUES (NEWID(), 2, 1, 1, '02/01/2016');
INSERT INTO Sales VALUES (NEWID(), 3, 1, 2, '03/12/2016');
INSERT INTO Sales VALUES (NEWID(), 2, 2, 2, '03/18/2016');
INSERT INTO Sales VALUES (NEWID(), 3, 2, 1, '04/16/2016');
INSERT INTO Sales VALUES (NEWID(), 4, 2, 2, '04/23/2016');

‫ نام ديتابیس خود‬،B22 ‫ يعنی بهجاي‬،‫در خط اول دستور بايد نام ديتابیسی که جداول در آن قرار دارند را وارد کنید‬
.‫را بنويسید‬
‫ را‬Execute ‫ انتخاب کنید و دستور‬3-85 ‫ را بهمانند شکل‬SELECT ‫در ادامه براي تست موضوع بايد دوباره قسمت‬
‫براي جلوگیري از نمايش سوابق تکراري در خروجی‬ DISTINCT ‫اجرا کنید؛ توجه داشته باشید در دستورات از‬
.‫استفاده کرديم‬
‫‪www.takbook.com‬‬

‫‪113‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-103‬خروجی دستور‬

‫بعد از اينکه ‪ View‬را ايجاد کرديد‪ ،‬میتوانید بهمانند شکل ‪ 3-104‬از سمت چپ وارد قسمت ‪ Views‬شويد و نماي‬
‫مورد نظر که ايجاد کرديد را مشاهده کنید؛ با دستور زير میتوانید خروجی اين ‪ View‬را مشاهده کنید‪:‬‬
‫;]‪SELECT * FROM [dbo].[ViewEmployeesWithSales‬‬
‫توجه داشته باشید به جاي اينکه در دستور باال‪ ،‬نام ‪ View‬را بنويسید‪ ،‬میتوانید ‪ View‬مورد نظر را بکشید و در دستور‬
‫رها کنید تا خودش نوشته شود‪.‬‬

‫شکل ‪ 3-104‬خروجی ‪View‬‬

‫در ادامه براي اينکه ارتباط بین جداول را در ‪ View‬مورد نظر بهصورت گرافیکی مشاهده کنید بايد بهمانند شکل ‪-105‬‬
‫‪ 3‬بر روي ‪ View‬مورد نظر کلیک راست کنید و گزينهي ‪ Design‬را انتخاب کنید؛ توجه داشته باشید که شما میتوانستید‬
‫بهجاي وارد کردن دستورات از همین قسمت با انتخاب ‪ ،New View‬نماي مورد نظر خود را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪114‬‬

‫شکل ‪ 3-105‬بررسی دستور ‪Design‬‬

‫همان طور که در شکل ‪ 3-106‬مشاهده میکنید‪ ،‬اين صفحه از چهار قسمت تشکیل شده است؛ در قسمت شمارهي‬
‫نماي کلی‪ ،‬دو جدول را مشاهده میکنید؛ در قسمت شمارهي دو طبق ستونهايی که در دستور قبلی وارد کرديم‪،‬‬
‫ستونهاي مورد نظر تیک خورده شدند؛ در قسمت سوم دستور خروجی ‪ SELECT‬را که قبالً وارد کرديم را مشاهده‬
‫میکنید؛ کالً در قسمت شمارهي يک‪ ،‬اگر هر يک از ستونها را انتخاب کنید در قسمت شمارهي سه دستوارت تغییر‬
‫خواهد کرد؛ در قسمت شمارهي چهار نیز خروجی دستور شمارهي سوم را مشاهده میکنید‪ ،‬البته بايد دستور شمارهي‬
‫سوم را انتخاب و کلیک راست کنید و گزينهي ‪ Execute‬را انتخاب کنید؛ توجه داشته باشید در قسمت شمارهي يک‪،‬‬
‫= ‪dbo.Employees.EmployeeID‬‬ ‫پیوند بین جدول اول و دوم ايجاد شده است که آن نیز به دلیل دستور‬
‫قرار دهید شکل آن در‬ ‫><‬ ‫که در قسمت شمارهي سوم وارد کرديد‪ ،‬است؛ به جاي = اگر‬ ‫‪dbo.Sales.EmployeeID‬‬

‫قسمت شمارهي يک تغییر خواهد کرد‪.‬‬

‫شکل ‪ 3-106‬ایجاد ‪VIEW‬‬


‫‪www.takbook.com‬‬

‫‪115‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫اگر بخواهید از طريق محیط گرافیکی‪ View ،‬ايجاد کنید بايد بهمانند شکل ‪ 3-107‬بر روي ‪ View‬کلیک راست کنید‬
‫و گزينهي ‪ New View‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3- 107‬ایجاد ‪View‬‬

‫بعد از ورود‪ ،‬شکل ‪ 3 -108‬ظاهر خواهد شد که بايد انتخاب کنید که از چه جداولی میخواهید خروجی بگیريد؛ در‬
‫اين قسمت‪ ،‬هر سه جدول را انتخاب میکنیم‪ ،‬البته میتوانیم از تب ‪ View‬نیز استفاده کنیم‪.‬‬

‫شکل ‪ 3 - 108‬ایجاد ‪view‬‬

‫در شکل ‪ 3 - 109‬و در قسمت اول میتوانید ستونهايی که قرار است در خروجی چاپ شود را انتخاب کنید؛ به اين‬
‫نکته توجه کنید که انتخاب بايد به ترتیب باشد‪ ،‬چون هر انتخابی که در جداول انجام میدهید‪ ،‬در قسمت دوم رديف‬
‫آن مشخص میشود و در قسمت سوم نیز دستورات آن بهصورت اتوماتیک نوشته خواهد شد؛ کالً ‪ View‬همان دستور‬
‫‪ SELECT‬است که قبالً با هم روي آن کار کرديم‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪116‬‬

‫شکل ‪ 3 – 109‬ایجاد ‪View‬‬

‫براي اينکه بتوانیم شرط در اين دستورات قرار دهیم‪ ،‬میتوانیم بهمانند شکل ‪ 3 – 110‬در قسمت دوم و در ستون‬
‫‪EmployeeID‬‬ ‫فیلتر‪ ،‬شرط خود را وارد کنیم که در اينجا ‪ >2‬وارد شده است‪ ،‬يعنی اينکه در خروجی کار سطرهايی که‬
‫آنها بزرگتر از ‪ 2‬باشد در خروجی چاپ خواهد شد؛ توجه کنید زمانی که در قسمت فیلتر‪ ،‬شرط مورد نظر خود را‬
‫وارد میکنید‪ ،‬بعد از خروج از آن‪ ،‬قسمت دستور آن در قسمت شمارهي سوم نوشته میشود که در شکل ‪3- 110‬‬
‫مشخص شده است‪.‬‬
‫براي اينکه دستوري که ايجاد شده را اجرا کنیم بايد آن را اجرا کنیم و کلیک راست کنیم و گزينهي ‪ Execute SQL‬را‬
‫انتخاب کنیم تا در قسمت چهارم‪ ،‬خروجی مشخص شود که همان طور که گفتیم خروجی براي ‪EmployeeID‬هايی‬
‫که بزرگتر از دو باشد‪ ،‬مشخص شده است‪.‬‬
‫در ستونهاي ‪ Sort‬نیز میتوانید مشخص کنید که خروجی به چه صورت تنظیم شود‪.‬‬

‫شکل ‪ 3 - 110‬اجرای دستور‬


‫‪www.takbook.com‬‬

‫‪117‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪ 3-1-7‬بررسی ‪ FileStream‬در ‪SQL Server‬‬
‫در نرمافزار ‪ SQL‬قابلیتی طراحی شده که بتوانید فايلهايی با حجم باال را درآن ذخیره کنید‪ .‬همیشه اين طور نیست‬
‫‪SQL‬‬ ‫که فقط دادههاي متنی در ديتابیس ذخیره شوند‪ ،‬بلکه دادههايی مانند‪ :‬عکس‪ ،‬موسیقی‪ ،‬فیلم نیز میتوانند در‬
‫ذخیره شوند‪ ،‬اما براي اين کار بايد از قابلیت ‪ FileStream‬در ‪ SQL‬استفاده کنید؛ در نسخههاي قديمی ‪ SQL‬افراد براي‬
‫ذخیرهي عکس‪ ،‬موسیقی و فیلم از دادههايی از نوع ‪ BLOB‬استفاده میکردند که اين دادهها تا حداکثر ‪ 2‬گیگابايت را‬
‫پشتیبانی میکرد و بیشتر از اين عدد‪ ،‬ديگر نمیتوانستند ذخیره کنند و يکی از مهمترين مشکالت اين نوع دادهها اين‬
‫بود که عملکرد سیستم را به شدت کاهش میداد و باعث کندي آن میشد‪ ،‬اما با استفاده از ‪ FileStream‬ديگر نگران‬
‫مقدار فضا و کندي سرعت نرمافزار نخواهیم بود‪.‬‬
‫براي اينکه از ‪ FILESTREAM‬استفاده کنیم بايد يک گروه براي آن ايجاد کنیم تا اطالعات در گروه جديد قرار بگیرد‬
‫و ديگر با گروه اصلی يا همان ‪ Primary‬کاري نداريم؛ براي استفاده از اين قابلیت در جداول نیاز به يک رکورد با نوع‬
‫‪ varbinary‬داريم‪.‬‬
‫در شکل ‪ 3-111‬نوع دادههاي قديمی براي ذخیره عکس را مشاهده میکنید که از يک ديتابیس استفاده میکردند‪ ،‬اما‬
‫در عکس ‪ 3-112‬اين موضوع از ديتابیس اصلی جدا شده است‪.‬‬

‫شکل ‪ 3-111‬بررسی ‪FILESTREAM‬‬

‫شکل ‪ 3-112‬بررسی ‪FILESTREAM‬‬

‫سرويس ‪SQL Server 2019 Configuration‬‬ ‫بايد بهمانند شکل ‪3 - 113‬‬ ‫‪FILESTREAM‬‬ ‫براي فعالسازي قابلیت‬
‫‪ Manager‬را اجرا کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪118‬‬

‫شکل ‪ 3-113‬اجرای سرویس ‪Configuration‬‬

‫‪SQL Server‬‬ ‫در شکل ‪ 3-114‬از سمت چپ بر روي ‪ SQL Server Services‬کلیک کنید و در صفحهي بازشده بر روي‬
‫کلیک راست کنید و گزينهي ‪ Properties‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-114‬بررسی سرویس‬

‫در شکل ‪ 3-115‬وارد تب ‪ FILESTREAM‬شويد و تیک هر سه گزينه را انتخاب کنید؛ گزينهي اول براي دسترسی از‬
‫طريق دستورات ‪ T-SQL‬است؛ گزينهي دوم براي خواندن و نوشتن از ورودي و خروجی پروندهها است و براي اين‬
‫‪FILESTREAM‬‬ ‫کار بايد يک نام براي به اشتراکگذاري آن وارد کنید و گزينهي آخر‪ ،‬اجازهي دسترسی از راه دور به‬
‫را میدهد‪.‬‬

‫شکل ‪ 3-115‬بررسی ‪FileStream‬‬

‫براي اينکه ‪ FileStream‬را در ‪ SQL‬فعال کنیم بايد تغییري در تنظیمات آن انجام دهیم؛ براي اين کار وارد منوي فايل‬
‫بهمانند شکل ‪ 3-116‬شويد و از قسمت ‪ New‬بر روي ‪ Query‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪119‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-116‬بررسی ‪FileStream‬‬

‫دستور زير را اجرا کنید‪:‬‬


‫‪USE master‬‬
‫‪Go‬‬
‫‪EXEC sp_configure‬‬
‫‪Go‬‬
‫اين دستور تنظیمات کلی سرور ‪ SQL‬را به شما نشان میدهد که مربوط به قسمت ‪ Advanced‬است؛ در اين قسمت‬
‫که در شکل ‪ 3-117‬مشخص شده است بايد به قسمت ‪ File Stream Access Level‬مراجعه کنید و در قسمت ستون‬
‫‪ config_value‬عدد ‪ 2‬قرار دهید؛ با اين کار دسترسی کامل به سرويس ‪ FILESTREAM‬فعال خواهد شد‪.‬‬

‫شکل ‪ 3-117‬بررسی ‪FileStream‬‬

‫براي قراردادن عدد ‪ 2‬بايد دستور زير را وارد کنید‪.‬‬


‫‪EXEC sp_configure filestream_access_level, 2‬‬
‫‪GO‬‬
‫‪RECONFIGURE WITH OVERRIDE‬‬
‫‪GO‬‬
‫در دستور باال‪ ،‬قسمت ‪ config_value‬مربوط به ‪ filestream_access_level‬به عدد ‪ 2‬تغییر میکند که در شکل ‪3-118‬‬
‫اين موضوع را مشاهده میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪120‬‬

‫شکل ‪ 3-118‬بررسی ‪FileStream‬‬

‫براي اينکه متوجه شويم که کار به درستی انجام شده است يا نه بايد بهمانند شکل ‪ 3-119‬بر روي سرور ‪ SQL‬کلیک‬
‫راست کنید و وارد قسمت ‪ Properties‬شويد‪.‬‬

‫شکل ‪ 3- 119‬بررسی ‪FileStream‬‬

‫را مشاهده‬ ‫‪FILESTREAM Access Level‬‬ ‫در شکل ‪ 3-120‬از سمت چپ وارد قسمت ‪ Advanced‬شويد و قسمت‬
‫کنید که بر روي ‪ FULL access enabled‬قرار گرفته است‪ ،‬البته شما میتوانستید دستورات قبلی را وارد نکنید و مستقیم‬
‫در اين قسمت‪ ،‬اين گزينه را انتخاب کنید‪.‬‬

‫شکل ‪ 3-120‬بررسی ‪FileStream‬‬


‫‪www.takbook.com‬‬

‫‪121‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫بعد از اتمام کار‪ ،‬حتماً بايد سرور را ‪ Restart‬کنید؛ براي اين کار بايد بهمانند شکل ‪ 3-121‬بر روي سرور ‪ SQL‬کلیک‬
‫راست کنید و گزينهي ‪ Restart‬را انتخاب کنید تا تنظیمات به درستی اعمال شود‪.‬‬

‫شکل ‪ 3-121‬بررسی ‪FileStream‬‬

‫نکاتی که قبل از استفاده از ‪ FILEDTREAM‬بايد بدانیم شامل‪:‬‬


‫‪ -1‬میتوانیم از عبارات ‪ UPDATE ،INSERT ،SELECT‬و ‪ DELETE‬مشابهي پرسوجو استاندارد پايگاهداده در‬
‫‪ FILESTREAM‬استفاده کنیم‪.‬‬
‫‪ -2‬اگر اندازهي شی يا ‪ Object‬بیشتر از ‪ 1‬مگابايت باشد بايد از ‪ FILESTREAM‬استفاده کنیم‪.‬‬
‫‪ -3‬هر سطر بايد يک ‪ ID‬رديف منحصربهفرد داشته باشد تا از اين قابلیت استفاده کند و نبايد حاوي مقادير‬
‫‪NULL‬باشد‪.‬‬
‫‪ -4‬نمیتوانیم دادههاي ‪ FILESTREAM‬را رمزگذاري کنیم‪.‬‬

‫‪FILESTREAM‬‬ ‫‪ 3-1-7-1‬ايجاد ديتابیس براي استفاده از‬


‫براي اينکه بتوانیم از قابلیت ‪ FILESTREAM‬استفاده کنیم بايد يک ديتابیس جديد ايجاد و بر روي آن کار کنیم‪ ،‬البته‬
‫کلیک راست کنید و‬ ‫‪Databases‬‬ ‫میتوانیم از ديتابیسهاي قديمی خود استفاده کنیم؛ بهمانند شکل ‪ 3-122‬بر روي‬
‫گزنیهي ‪ New Databases‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪122‬‬

‫شکل ‪ 3-122‬ایجاد ‪FileStream‬‬

‫بهمانند شکل ‪ ،3-123‬يک نام براي ديتابیس خود وارد کنید که در اينجا‪ FILESTREAM-DB ،‬وارد شده است‪ ،‬بعد‬
‫از اين کار بر روي ‪ ADD‬کیک کنید تا ديتابیس مورد نظر ايجاد شود‪.‬‬

‫شکل ‪ 3-123‬ایجاد ‪FileStream‬‬

‫بعد از ايجاد ديتابیس‪ ،‬بهمانند شکل ‪ 3-124‬بر روي آن کلیک راست کنید و گزينهي ‪ Properties‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪123‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-124‬ایجاد ‪FileStream‬‬

‫در شکل ‪ 3-125‬بايد وارد ‪ FileGroup‬شويد و در قسمت ‪ FILESTREAM‬بر روي ‪ Add‬کلیک کنید و نام گروه مورد‬
‫نظر خود را براي تخصیص به ‪ FILESTREAM‬وارد کنید‪.‬‬

‫شکل ‪ 3-126‬ایجاد ‪FileStream‬‬

‫در ادامهي کار بهمانند شکل ‪ 3-127‬وارد قسمت ‪ Files‬شويد و بر روي ‪ Add‬کلیک کنید؛ در ستون‪ Logical Name‬يک‬
‫نام بهدلخواه وارد کنید؛ در ستون ‪ File Type‬نوع فايل را ‪ FILESTREM Data‬در نظر بگیريد و ‪ Filegroup‬را نیز انتخاب‬
‫نیز بايد مسیري را انتخاب کنید که از‬ ‫‪Path‬‬ ‫کنید‪ ،‬البته بهصورت اتوماتیک خودش انتخاب خواهد شد؛ در قسمت‬
‫ظرفیت خوبی برخوردار باشد؛ در آخر بر روي ‪ OK‬کلیک کنید تا تنظیمات ذخیره شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪124‬‬

‫شکل ‪ 3-127‬ایجاد ‪FileStream‬‬

‫بعد از انجام تنظیمات‪ ،‬اگر بهمانند شکل ‪ 3-128‬وارد آدرسی مربوط به ‪ Stream‬شويد‪ ،‬مشاهده خواهید کرد که فايل‬
‫‪ STREM‬در اين مسیر ايجاد شده است‪.‬‬

‫شکل ‪ 3-128‬ایجاد ‪FileStream‬‬

‫‪FILESTREAM‬‬ ‫‪ 3-1-7-2‬ايجاد جدول در ديتابیس‬


‫براي اينکه يک جدول با دادههاي ‪ FILESTREAM‬داشته باشیم بايد بهصورت زير عمل کنیم؛ همانطور که گفتیم براي‬
‫استفاده از ‪ FILESTREAM‬بايد داده از نوع ‪ VARBINARY‬باشد که در دستور زير مشخص شده است و يکی ديگر‬
‫‪NOT NULL‬‬ ‫از شرطهاي ‪ FILESTREAM‬اين است که حتماً بايد يک کلید منحصربهفرد داشته باشد و حتماً نیز بايد‬
‫باشد؛ در دستور زير سه فیلد ايجاد شده است که در ‪ Fileid‬نوع داده‪ UNIQUIDENTIFIER ،‬و ‪ NOT NULL‬است؛‬
‫‪VARBINARY‬‬ ‫نیز از نوع‬ ‫‪FILE‬‬ ‫با حداکثر کاراکتر ‪ 25‬است و‬ ‫‪VARCHAR‬‬ ‫نیز از نوع معمولی‬ ‫‪FileName‬‬ ‫دادهي‬
‫است‪.‬‬

‫]‪Use [FILESTREAM-DB‬‬
‫‪Go‬‬
‫( ]‪CREATE TABLE [FileStreamTable_1‬‬
‫‪[FileId] UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,‬‬
‫‪[FileName] VARCHAR (25),‬‬
‫;)‪[File] VARBINARY (MAX) FILESTREAM‬‬
‫‪GO‬‬
‫بعد از اجراي دستور در مسیر مشخصشده که در شکل ‪ 3-129‬مشخص شده است‪ ،‬يک پوشه با مقدار ‪ GUID‬ايجاد‬
‫شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪125‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-129‬بررسی فایل ‪FileStream‬‬

‫جديد مشاهده میکنید که مربوط به ستون‬ ‫‪GUID‬‬ ‫اگر وارد اين پوشه در شکل ‪ 3-130‬شويد‪ ،‬يک پوشهي ديگر با‬
‫‪ FILESTREAM‬در جدول جديد است؛ اين موضوع را در شکل ‪ 62‬مشاهده میکنید‪.‬‬

‫شکل ‪ 3-130‬بررسی فایل ‪FileStream‬‬

‫براي اينکه بیشتر با ‪ FILESTREAM‬کار کنیم‪ ،‬میخواهیم يک فايل موسیقی را درون ديتابیس مورد نظر ذخیره کنیم؛‬
‫اولین کاري که بايد انجام دهید اين است که فايل موسیقی را در مسیر ‪ C:\Music‬ذخیره کنیم‪،‬‬
‫بعد از آن بايد از دستور زير استفاده کنید؛‪ ،‬در اين دستور‪ ،‬يک جدول جديد با نام ‪ FileStreamTable_2‬ايجاد میشود‬
‫و در ادامه با دستور ‪ ،DECLARE‬متغیر ‪ FILE‬با نوع ‪ varbinary‬صدا زنده میشود‪ ،‬فايل ‪ MP3‬در آن قرار میگیرد‪.‬‬

‫]‪Use [FILESTREAM-DB‬‬
‫‪Go‬‬
‫( ]‪CREATE TABLE [FileStreamTable_2‬‬
‫‪[FileId] UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,‬‬
‫‪[FileName] VARCHAR (25),‬‬
‫;)‪[File] VARBINARY (MAX) FILESTREAM‬‬
‫‪GO‬‬
‫;)‪DECLARE @File varbinary(MAX‬‬
‫‪SELECT‬‬
‫(‪@File = CAST‬‬
‫)‪bulkcolumn as varbinary(max‬‬
‫)‬
‫‪FROM‬‬
‫;‪OPENROWSET(BULK 'c:\music\a.mp3', SINGLE_BLOB) as MyData‬‬

‫‪INSERT INTO FileStreamTable_2‬‬


‫‪VALUES‬‬
‫(‬
‫‪NEWID(),‬‬
‫‪'Sample Music',‬‬
‫‪@File‬‬
‫)‬
‫اگر به شکل ‪ 3-131‬توجه کنید‪ ،‬يک فايل جديد به حجم تقريبی ‪ 7‬مگابايت که همان فايل ‪MP3‬است در مسیر مورد‬
‫نظر ايجاد شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪126‬‬

‫شکل ‪ 3-131‬بررسی فایل ‪FileStream‬‬

‫توجه داشته باشید‪ ،‬اگر فايل موسیقی در شکل ‪ 3-131‬را در نرمافزار مورد نظر قرار دهید به راحتی اجرا خواهد شد؛‬
‫اين موضوع را در شکل ‪ 3-132‬مشاهده میکنید‪.‬‬

‫شکل ‪ 3-132‬بررسی فایل ‪FileStream‬‬

‫اگر وارد ‪ SQL‬شويد و بر روي جدول مورد نظر کلیک راست کنید و گزينهي ‪ Select Top 1000 Rows‬را انتخاب کنید‪،‬‬
‫خروجی جدول مورد نظر را نشان میدهد که در شکل ‪ 3-133‬مشخص شده است‪.‬‬

‫شکل ‪ 3-133‬بررسی فایل ‪FileStream‬‬

‫‪ 3-1-8‬ارتباط با ‪ SQL‬از طريق ‪Visual Studio‬‬


‫است که ما را در ارائهي‬ ‫‪Visual Studio‬‬ ‫يکی از ابزارهاي مهم در صنعت برنامهنويسی و پايگاهداده‪ ،‬نرمافزار عالی‬
‫راحتتر و بهتر کار ياري میکند؛ براي اينکه از آخرين نسخهي اين نرمافزار استفاده کنید‪ ،‬میتوانید از لینک زير آن‬
‫را دانلود کنید‪:‬‬
‫‪https://dl2.soft98.ir/programing/Microsoft.Visual.Studio.2019.16.9.1.html‬‬
‫‪www.takbook.com‬‬

‫‪127‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫بعد از دانلود‪ ،‬آن را بر روي سیستم خود نصب کنید؛ توجه داشته باشید براي نصب کامل اين نرمافزار حداقل نیاز به‬
‫‪ 50‬گیگابیت فضاي هارد داريد که واقعاً فضاي زيادي را اشغال میکند‪.‬‬
‫متصل‬ ‫‪SQL Server‬‬ ‫به‬ ‫‪Visual Studio‬‬ ‫بعد از اجراي نرمافزار‪ ،‬اولین کاري که انجام میدهیم اين است که از طريق‬
‫‪SQL‬‬ ‫شويد و از قسمت‬ ‫‪Tools‬‬ ‫خود را اجرا کنیم؛ براي اين کار بهمانند شکل ‪ 3-134‬وارد منوي‬ ‫‪Query‬‬ ‫شويم و‬
‫‪ ،Server‬گزينهي ‪ New Query‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-134‬بررسی ‪Visual Studio‬‬

‫در شکل ‪ 3-135‬بايد در قسمت ‪ Server name‬نام سرور ‪ SQL‬را وارد کنید و بعد از آن‪ ،‬مشخص کنید که نوع احراز‬
‫هويت به چه صورت باشد‪ ،‬اگر با همان کاربري که در حال کار با ‪ visual studio‬هستید‪ ،‬میخواهید با ‪ SQL‬ارتباط‬
‫برقرار کنید‪ ،‬میتوانید ‪ Windows Authentication‬را انتخاب کنید و يا اگر میخواهید با کاربران موجود در ‪ SQL‬وارد‬
‫آن شويد بايد ‪ SQL Authentication‬را انتخاب کنید؛ در قسمت آخر نیز بايد نام ديتابیس خود را انتخاب کنید و بر‬
‫روي ‪ Connect‬کلیک کنید‪.‬‬

‫شکل ‪ 3-135‬بررسی ‪Visual Studio‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪128‬‬


‫را در‬ ‫‪Customers‬‬ ‫توانستیم جدول‬ ‫‪SELECT‬‬ ‫همان طور که در شکل ‪ 3-136‬مشاهده میکنید با استفاده از دستور‬
‫خروجی چاپ کنیم؛ اين بدان معنا است که از طريق ‪ Visual Studio‬توانستیم با ‪ SQL Server‬ارتباط برقرار کنیم‪.‬‬

‫شکل ‪ 3-137‬بررسی ‪Visual Studio‬‬

‫‪Visual Studio‬‬ ‫‪ 3-1-8-1‬ايجاد ديتابیس از طريق دستورات در‬


‫براي اينکه کار خود را گسترش دهیم‪ ،‬میخواهیم از طريق خط فرمان‪ ،‬يک ديتابیس ايجاد و در آن جدول دلخواه‬
‫خود را ايجاد کنیم؛ براي اين کار بايد در ‪ query‬مورد نظر در ‪ Visual Studio‬دستورات زير را وارد کنیم‪:‬‬

‫‪CREATE DATABASE B22‬‬


‫‪GO‬‬
‫‪USE B22‬‬
‫( ‪CREATE TABLE B22T‬‬
‫‪IDNumber int identity primary key,‬‬
‫‪FirstName varchar(50),‬‬
‫‪LastName varchar(50),‬‬
‫‪City varchar(10),‬‬
‫‪Country varchar(10),‬‬
‫)‪Address varchar(50‬‬
‫;)‬
‫‪INSERT INTO B22T(FirstName, LastName, City, Country, Address) VALUES‬‬
‫‪('ahmad', 'Mohamad', 'babol', 'IR', 'Kordmahaleh'),‬‬
‫‪('Azadeh', 'Mohebi', 'Shiraz', 'IR', 'Shiraz1'),‬‬
‫‪('Negar', 'Sistani', 'Karaj', 'IR', 'MohamadShahr'),‬‬
‫‪('alireza', 'nafeei', 'khozestan', 'IR', 'khozestan'),‬‬
‫)'‪('Elham', 'bozorgi', 'ardebil', 'IR', 'Azarbaijan‬‬

‫در دستورات باال‪ ،‬در خط اول با دستور ‪ ،CREATE DATABASE‬يک ديتابیس يا نام ‪ B22‬ايجاد کرديم و در ادامه‪،‬‬
‫حتماً دستور ‪ GO‬را قرار دهید تا بعد از ايجاد ديتابیس ‪ ،B22‬يک ‪ refresh‬صورت بگیرد؛ در ادامه و در خط سوم بايد‬
‫مشخص کنیم که از چه ديتابیسی می خواهیم استفاده کنیم تا جدول را داخل آن ايجاد کنیم که اين کار را با دستور‬
‫‪ USE B22‬انجام میدهیم‪.‬‬
‫ايجاد میکنیم و‬ ‫‪B22‬‬ ‫در ديتابیس‬ ‫‪B22T‬‬ ‫در خط چهارم با استفاده از دستور ‪ ،CREATE TABLE‬يک جدول با نام‬
‫است و نبايد‬ ‫نوع‪Primery Key‬‬ ‫از‬ ‫‪IDNumber‬‬ ‫اطالعات آن را نیز در ادامه مشخص میکنیم؛ توجه داشته باشید که‬
‫خالی باشد‪.‬‬
‫‪www.takbook.com‬‬

‫‪129‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫بعد از ايجاد جدول ‪ B22T‬بايد با دستور ‪ ،INSERT INTO‬اطالعات مورد نظر را وارد ستونهاي جدول کنیم؛ به اين‬
‫نکتهي مهم توجه کنید که ‪ IDNumber‬در دستور ‪ INSERT INTO‬وجود ندارد؛ اين موضوع به اين دلیل است که در‬
‫استفاده کرديم و باعث میشود که بهصورت اتوماتیک در هر سطر‪ ،‬يک شماره به آن‬ ‫‪identity‬‬ ‫خط پنجم از دستور‬
‫سطر اختصاص دهد و اگر بخواهید از ‪ IDNumber‬در داخل جدول استفاده کنید و شمارهي دلخواه خود را وارد کنید‬
‫بايد کد باال را بهصورت زير تغییر دهید‪:‬‬
‫‪CREATE DATABASE B22‬‬
‫‪GO‬‬
‫‪USE B22‬‬
‫( ‪CREATE TABLE B22T‬‬
‫‪IDNumber int primary key,‬‬
‫‪FirstName varchar(50),‬‬
‫‪LastName varchar(50),‬‬
‫‪City varchar(10),‬‬
‫‪Country varchar(10),‬‬
‫)‪Address varchar(50‬‬
‫;)‬
‫‪INSERT INTO B22T(IDNumber,FirstName, LastName, City, Country, Address) VALUES‬‬
‫‪('884320101','ahmad', 'Mohamad', 'babol', 'IR', 'Kordmahaleh'),‬‬
‫‪('84891007','Azadeh', 'Mohebi', 'Shiraz', 'IR', 'Shiraz1'),‬‬
‫‪('821620324','Negar', 'Sistani', 'Karaj', 'IR', 'MohamadShahr'),‬‬
‫‪('892612101','alireza', 'nafeei', 'khozestan', 'IR', 'khozestan'),‬‬
‫)'‪('856520103','Elham', 'bozorgi', 'ardebil', 'IR', 'Azarbaijan‬‬

‫در کد باال و در خط پنجم‪ ،‬دستور ‪ identity‬حذف شده است و حتماً بايد در ورودي به ‪ IDNumber‬يک مقدار بدهید‬
‫تا با خطا مواجه نشويد‪،‬؛دلیل آن نیز اين است که اين گزينه از نوع ‪ Primary Key‬است و نبايد خالی باشد؛ به اين دلیل‬
‫در خط دوازده و در داخل پرانتز‪ IDNumber ،‬تعريف و مقدار آن نیز داده شده است‪.‬‬
‫را چاپ‬ ‫‪B22T‬‬ ‫همان طور که در شکل ‪ 3-138‬مشاهده میکنید‪ ،‬دستورات به درستی اجرا شده و خروجی جدول‪،‬‬
‫استفاده شده‬ ‫‪IDNumber‬‬ ‫کرده است؛ توجه داشته باشید که اين خروجی مربوط به کد دومی است که داخل آن از‬
‫است‪.‬‬

‫شکل ‪ 3-138‬خروجی جدول ‪B22T‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪130‬‬


‫‪Visual Studio‬‬ ‫‪ 3-1-8-2‬ايجاد ديتابیس از طريق ابزار‬
‫در قسمت قبلی توانستیم با استفاده از ‪ ،Query‬يک ديتابیس جديد ايجاد و جدول آن را به همراه مقادير آن ايجاد کنیم؛‬
‫در اين قسمت نیز میخواهیم از طريق ابزارهاي موجود در ‪ Visual Studio‬اين کار را انجام دهیم‪.‬‬
‫براي شروع بهمانند شکل ‪ 3-139‬وارد ‪ Server Explorer‬شويد و بر روي ‪ Data Connections‬کلیک راست کنید و بر‬
‫روي ‪ Add Connection‬کلیک کنید‪.‬‬

‫شکل ‪ 3-139‬ایجاد دیتابیس‬

‫بعد از باز شدن پنجره در شکل ‪ ،3-140‬نام سرور ‪ SQL‬را وارد و بر روي ‪ Connect‬کلیک کنید‪.‬‬

‫شکل ‪ 3-140‬ایجاد دیتابیس‬

‫همان طور که در شکل ‪ 3-141‬مشاهده میکنید به ‪ SQL‬مورد نظر متصل شديم و براي اينکه بتوانیم جدول مورد نظر‬
‫خود را ايجاد کنیم‪ ،‬میتوانیم بر روي ‪ Tables‬کلیک راست کنیم و گزينهي ‪ Add New Table‬را انتخاب کنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪131‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-141‬ایجاد جدول‬

‫همان طور که در شکل ‪ 3-142‬مشاهده میکنید به راحتی میتوانید اطالعات مورد نظر جدول خود را وارد کنید و‬
‫همزمان که اين کار را انجام میدهید در زير شکل ‪ Query ،3-142‬آن نیز نوشته میشود؛ براي تايید اطالعات بايد بر‬
‫روي ‪ Update‬کلیک کنید‪.‬‬

‫شکل ‪ 3-142‬ایجاد جدول‬

‫بعد از کلیک بر روي ‪ ،Update‬شکل ‪ 3-143‬ظاهر میشود که بايد بر روي ‪ Update Database‬کلیک کنید تا اطالعات‬
‫به سرور ‪ SQL‬ارسال شود و در آخر پیغام تأيید را براي شما ارسال میکند‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪132‬‬

‫شکل ‪ 3-143‬ایجاد دیتابیس‬

‫همان طور که در شکل ‪ 3-144‬مشاهده میکنید‪ ،‬جدول مورد نظر ايجاد شده است و براي اينکه اطالعات خود را‬
‫وارد کنید بايد بر روي جدول کلیک راست کنید و گزينهي ‪ Show Table Data‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-144‬ایجاد جدول و نمایش‬

‫همانطور که در شکل ‪ 3-145‬مشاهده میکنید‪ ،‬اطالعات را میتوانید وارد ستونهاي جدول کنید‪.‬‬

‫شکل ‪ 3-145‬نمایش جدول‬


‫‪www.takbook.com‬‬

‫‪133‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪SQL‬‬ ‫‪ 3-1-8-3‬ايجاد فرم در ‪ Visual Studio‬و ثبت اطالعات در جدول‬
‫در اين قسمت میخواهیم يک فرم طراحی کنیم تا کاربر بعد از وارد کردن اطالعات‪ ،‬آن را در ‪ SQL‬ثبت کند؛ براي‬
‫اينکه يک فرم ايجاد کنیم و اطالعات ورودي کاربر را در ‪ SQL‬ثبت کنیم بايد بهمانند شکل ‪ 3-146‬يک پروژهي جديد‬
‫از نوع ‪ Windows Forms App‬ايجاد کنیم‪.‬‬

‫شکل ‪ 3-146‬ایجاد فایل جدید‬

‫در شکل ‪ 3-147‬وارد ‪ Data Sources‬شويد و بر روي آيکون مورد نظر کلیک کنید‪.‬‬

‫شکل ‪ 3-147‬ایجاد ‪Data Source‬‬

‫در شکل ‪ 3-148‬گزينهي ‪ Database‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-148‬ارتباط با ‪SQL‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪134‬‬


‫در شکل ‪ 3-149‬گزينهي ‪ Dataset‬را انتخاب و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 3-149‬ارتباط با ‪SQL‬‬

‫در شکل ‪ 3-150‬بر روي ‪ New Connection‬کلیک کنید‪.‬‬

‫شکل ‪ 3-150‬ارتباط با ‪SQL‬‬

‫در شکل ‪ 3-151‬بايد نام سرور را وارد و ديتابیس مورد نظر را انتخاب کنید‪.‬‬

‫شکل ‪ 3-151‬ارتباط با ‪SQL‬‬

‫در شکل ‪ 3-152‬تیک همهي گزينهها را انتخاب و بر روي ‪ Next‬کلیک کنید‪.‬‬


‫‪www.takbook.com‬‬

‫‪135‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-152‬ارتباط با ‪SQL‬‬

‫در شکل ‪ 3-153‬همهي ستونهاي جدول مورد نظر را بکشید و در فرم رها کنید‪.‬‬

‫شکل ‪ 3-153‬ایجاد فرم‬

‫کلیک و اطالعات را وارد و در آخر بر‬ ‫‪+‬‬ ‫در شکل ‪ 3-154‬براي وارد کردن اطالعات در جدول مورد نظر بر روي‬
‫روي آيکون ‪ Save‬کلیک کنید‪.‬‬

‫شکل ‪ 3-154‬ایجاد فرم‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪136‬‬


‫‪ 3-1-9‬واردکردن فايل اکسل در ‪SQL‬‬

‫شما حتماً با فايلهاي اکسل کار کرديد و کارهاي روزمرهي خود را در آن انجام میدهید‪ ،‬مانند‪ :‬اطالعات حسابداري‪،‬‬
‫ورود و خروج به شرکت و ‪ ...‬که اين نرمافزار را میتوان يکی از نرمافزارهاي پرکاربرد در سطح جهان دانست‪.‬‬
‫اگر شما يک فايل اکسلی داشته باشید و بخواهید آن را وارد جداول ‪ SQL‬کنید‪ ،‬بايد چه کاري انجام دهید؛ آيا اين کار‬
‫شدنی است؟‬
‫بله‪ ،‬اين کار توسط ‪ SQL‬شدنی است و به راحتی میتوانید فايلهاي اکسل را وارد جداول و ديتابیس ‪ SQL‬کنید؛ براي‬
‫اين کار يک فايل اکسل را در شکل ‪ 3-155‬مشاهده میکنید که داراي ‪ 8‬ستون و چندين سطر است که میخواهیم آن‬
‫را وارد ‪ SQL Server‬کنیم‪.‬‬

‫شکل ‪Excel 3-155‬‬

‫در ادامهي کار بهمانند شکل ‪ 3-156‬وارد ‪ SQL Server‬شويد و بر روي ديتابیس مورد نظر خود که قرار است فايل‬
‫اکسل را وارد آن کنید‪ ،‬کلیک راست کنید و از قسمت ‪ ،Tasks‬گزينهي ‪ Import Data‬را انتخاب کنید‪.‬‬

‫شکل ‪ 3-156‬واردکردن فایل ‪Excel‬‬


‫‪www.takbook.com‬‬

‫‪137‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫در شکل ‪ 3-157‬و در قسمت ‪ Data source‬بايد ‪ Microsoft Excel‬را انتخاب کنید و بعد بر روي ‪ Browse‬کلیک کنید‬
‫و فايل مورد نظر خود را انتخاب کنید؛ بعد از انتخاب در قسمت سوم‪ ،‬ورژن آن مشخص خواهد شد؛ براي ادامهي‬
‫کاربر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 3-157‬واردکردن فایل ‪Excel‬‬

‫در شکل ‪ 3-157‬با خطاي شکل ‪ 3-159‬روبرو میشويد که براي حل آن بايد از لینک‬ ‫‪Next‬‬ ‫بعد از کلیک بر روي‬
‫را دانلود و نصب کنید تا اين خطا برطرف‬ ‫‪Microsoft Access Database Engine 2010 Redistributable‬‬ ‫زير‪ ،‬نرمافزار‬
‫شود‪.‬‬
‫‪https://www.microsoft.com/en-us/download/details.aspx?id=13255‬‬

‫شکل ‪ 3-159‬خطای فایل ‪Excel‬‬

‫‪ Destination‬گزينهي ‪SQL Server‬‬ ‫بعد از نصب‪ ،‬دوباره مراحل باال را اجرا کنید و بهمانند شکل ‪ 3-160‬در قسمت‬
‫‪ Native Client 11.0‬را انتخاب کنید؛ در قسمت ‪ ،Server name‬نام سرور ‪ SQL‬خود را وارد و در قسمت ‪ Database‬بايد‬
‫ديتابیسی که قرار است اطالعات اکسل در آن وارد شود را انتخاب و بر روي ‪ Next‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪138‬‬

‫شکل ‪ 3-160‬واردکردن فایل ‪Excel‬‬

‫در شکل ‪ 3-161‬بايد گزينهي اول را انتخاب و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 3-161‬وارد کردن فایل ‪Excel‬‬

‫همان طور که در شکل ‪ 3-162‬مشاهده میکنید‪ Sheet ،‬مورد نظر در اکسل پیدا شده است و شما میتوانید با کلیک‬
‫بر روي دکمهي ‪ ،Edit Mappings‬ستونهاي آن را ويرايش کنید و همچنین براي نمايش اطالعات بر روي دکمهي‬
‫‪ Preview‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪139‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫شکل ‪ 3-162‬واردکردن فایل ‪Excel‬‬

‫در شکل ‪ 3-163‬گزينهي اول را انتخاب کنید و اگر میخواهید بر روي اطالعات‪ ،‬رمز عبور قرار دهید بايد گزينهي‬
‫دوم را انتخاب کنید و در صفحهي آخر بر روي ‪ Finish‬کلیک کنید تا کار انتقال انجام شود‪.‬‬

‫شکل ‪ 3-163‬واردکردن فایل ‪Excel‬‬

‫همان طور که در شکل ‪ 3-164‬مشاهده میکنید‪ ،‬عملیات انتقال با موفقیت انجام شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪140‬‬

‫شکل ‪ 3-164‬واردکردن فایل ‪Excel‬‬

‫ايجاد شده است و اگر از آن‬ ‫‪DB1‬‬ ‫همان طور که در شکل ‪ 3-165‬مشاهده میکنید‪ ،‬جدول مورد نظر در ديتابیس‬
‫خروجی بگیريد‪ ،‬تمام اطالعات آن را مشاهده خواهید کرد‪.‬‬

‫شکل ‪ 3-165‬اطالعات فایل ‪ Excel‬در ‪SQL‬‬

‫‪ 3-1-10‬بررسی دستور ‪Stored Procedures‬‬


‫زمانی که شما يک کد ‪ T-SQL‬براي يک قسمت از بانک اطالعاتی خود مینويسید‪ ،‬شايد دوست داشته باشید همیشه‬
‫از آن کد استفاده کنید و به اين دلیل همیشه بايد آن را چندين و چند بار بنويسید يا کپی کنید؛ روشی وجود دارد با‬
‫عنوان ‪ Stored Procedures‬که دستورات پرکاربرد ‪ T-SQL‬شما را در نام ذخیره میکند و ديگر نیاز نیست‪ ،‬کل کد را‬
‫بنويسید و تنها کافی است آن نام مورد نظر را صدا بزنید‪.‬‬
‫شکل کلی دستور بهصورت زير است‪:‬‬
www.takbook.com

141 ‫ آشنايی باپايگاه داده‬/ 3 ‫فصل‬


CREATE PROCEDURE procedure_name
AS
sql_statement
GO;
:‫ که ايجاد کرديد را فراخوانی کنید بايد از دستور زير استفاده کنید‬PROCEDURE ‫براي اينکه‬
EXEC procedure_name;

:‫ يک مثال را با هم بررسی میکنیم؛ براي شروع دستورات زير را اجرا کنید‬،‫براي اينکه اين دستور را تست بگیريم‬
CREATE TABLE Product
(ProductID INT, ProductName VARCHAR(100) )
GO

CREATE TABLE ProductDescription


(ProductID INT, ProductDescription VARCHAR(800) )
GO

INSERT INTO Product VALUES (680,'HL Road Frame - Black, 58')


,(706,'HL Road Frame - Red, 58')
,(707,'Sport-100 Helmet, Red')
GO

INSERT INTO ProductDescription VALUES (680,'Replacement mountain wheel for entry-level


rider.')
,(706,'Sturdy alloy features a quick-release hub.')
,(707,'Aerodynamic rims for smooth riding.')
GO

‫ ايجاد میشود و دادههاي‬master ‫ در ديتابیس‬ProductDescription ‫ و‬Product ‫ دو جدول‬،‫با اجراي دستورات باال‬


.‫ اين موضوع نشان داده شده است‬3-166 ‫داخل جدول نیز مشخص شده است که در شکل‬

‫ ایجاد جدول‬3-166 ‫شکل‬

‫ ايجاد کنیم و اطالعات را در آن قرار دهیم؛ براي اين موضوع از‬Procedure ‫ حال میخواهیم يک‬،‫بعد از ايجاد جدول‬
:‫دستور زير استفاده کنید‬
CREATE PROCEDURE GetProductDesc
AS
BEGIN
SET NOCOUNT ON

SELECT P.ProductID,P.ProductName,PD.ProductDescription FROM


Product P
INNER JOIN ProductDescription PD ON P.ProductID=PD.ProductID
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪142‬‬

‫‪END‬‬
‫در دستور باال‪ ،‬يک ‪ Procedure‬با نام ‪ GetProductDesc‬ايجاد میکنیم و در ادامهي دستورات با استفاده از ‪INNER‬‬
‫‪ ،JOIN‬دو جدول را به هم متصل میکنیم که اطالعات خروجی در ‪ Procedure‬مورد نظر ذخیره میشود‪.‬‬
‫بعد از ايجاد ‪ Procedure‬بايد آن را با دستور زير فراخوانی کنیم‪:‬‬
‫‪EXEC GetProductDesc‬‬

‫شکل ‪ 3-167‬اجرای ‪Procedure‬‬

‫نکته‪:‬‬
‫به اين نکته بايد توجه کنید که حتی با بستن پنجره ‪ Query‬و بستن ‪ SQL Management Studio‬باز‬
‫هم ‪ Procedure‬مورد نظر قابل استفاده است‪.‬‬

‫‪Stored procedure‬‬ ‫‪ 3-1-10-2‬تغییر يک‬


‫براي تغییر يا اصالح يک ‪ stored procedure‬موجود از دستور ‪ ALTER PROCEDURE‬استفاده میکنیم‪.‬‬
‫ابتدا فولدر ‪ stored procedure‬را باز کنید تا محتواي آن را ببینید‪ ،‬سپس بر روي نام ‪ stored procedure‬مورد نظر کلیک‬
‫راست کنید و از آيتمهاي داخل منو‪ ،‬گزينهي ‪ Modify‬را انتخاب کنید‪:‬‬

‫شکل ‪ 3-170‬ویرایش ‪Procedure‬‬


‫‪www.takbook.com‬‬

‫‪143‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫همان طور که در شکل ‪ 3-171‬مشاهده میکنید‪ ،‬میتوانید کد مورد نظر را تغییر و اطالعات را ذخیره و اجرا کنید‪.‬‬

‫شکل‪ 3-171‬ویرایش ‪Procedure‬‬

‫‪Stored procedure‬‬ ‫‪ 3-1-10-3‬حذف يک‬


‫براي حذف يک ‪ stored procedure‬میتوانید از دستور ‪ DROP PROCEDURE‬يا ‪ DROP PROC‬استفاده کنید‪:‬‬

‫;‪DROP PROCEDURE sp_name‬‬


‫یا‬
‫;‪DROP PROC sp_name‬‬
‫که ‪ ،sp_name‬نام ‪ stored procedure‬مورد نظر شماست که میخواهید حذف شود‪.‬‬
‫براي مثال‪ ،‬براي حذف ‪ stored procedure‬به نام ‪ uspProductList‬بايد دستور زير را اجرا کنیم‪:‬‬

‫;‪DROP PROCEDURE uspProductList‬‬


‫اگر بخواهید بهصورت گرافیکی اين کار را انجام دهید بايد بر روي ‪ Procedure‬مورد نظر کلیک راست کنید و گزينهي‬
‫‪ DELETE‬را انتخاب کنید که در شکل ‪ 40‬مشخص شده است‪.‬‬

‫شکل ‪ 3-172‬حذف ‪Procedure‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪144‬‬


‫در نتیجه‪ ،‬چگونگی مديريت ‪stored procedure‬ها در ‪ SQL Server‬بهخصوص اجرا‪ ،‬تغییر و حذف‪stored procedure‬ها‬
‫را آموختید‪.‬‬
‫‪Procedure‬‬ ‫‪ 3-1-10-1‬استفاده از پارامتر در دستور‬
‫را پوشش میداد را آموختید؛‬ ‫‪SELECT‬‬ ‫در قسمت قبل‪ ،‬چگونگی ايجاد يک ‪ stored procedure‬ساده که يک دستور‬
‫داخل آن اجرا میشود و يک مجموعه نتیجه را‬ ‫‪query‬‬ ‫را فراخوانی میکنید‪ ،‬خیلی ساده‬ ‫‪stored procedure‬‬ ‫وقتی‬
‫بازمیگرداند‪.‬‬
‫در اين قسمت‪ ،‬بحث ‪ stored procedure‬را گسترش میدهیم بهصورتی که خواهیم توانست يک يا چند مقدار را به آن‬
‫انتقال دهیم؛ نتیجهي ‪ stored procedure‬بر اساس مقادير پارامترها تغییر خواهد کرد‪.‬‬

‫ایجاد یک ‪ stored procedure‬با یک پارامتر‬


‫‪ Query‬زير يک لیست محصول از جدول ‪ products‬در پايگاهدادهي ‪ Bikestores‬بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫‪product_name,‬‬
‫‪list_price‬‬
‫‪FROM‬‬
‫‪production.products‬‬
‫‪ORDER BY‬‬
‫;‪list_price‬‬

‫میتوانید يک ‪ stored procedure‬ايجاد کنید که با استفاده از دستور ‪ CREATE PROCEDURE‬اين ‪ query‬را احاطه کند‪:‬‬
‫‪CREATE PROCEDURE uspFindProducts‬‬
‫‪AS‬‬
‫‪BEGIN‬‬
‫‪SELECT‬‬
‫‪product_name,‬‬
‫‪list_price‬‬
‫‪FROM‬‬
‫‪production.products‬‬
‫‪ORDER BY‬‬
‫;‪list_price‬‬
‫;‪END‬‬

‫در هر صورت‪ ،‬اين دفعه میتوانیم يک پارامتر به ‪ stored procedure‬اضافه کنیم تا محصوالتی که لیست قیمتهاي آنها‬
‫بیشتر از يک قیمت ورودي هستند را بیابد‪:‬‬

‫)‪ALTER PROCEDURE uspFindProducts(@min_list_price AS DECIMAL‬‬


‫‪AS‬‬
‫‪BEGIN‬‬
‫‪SELECT‬‬
‫‪product_name,‬‬
‫‪list_price‬‬
‫‪FROM‬‬
‫‪production.products‬‬
‫‪WHERE‬‬
‫‪www.takbook.com‬‬

‫‪145‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪list_price >= @min_list_price‬‬
‫‪ORDER BY‬‬
‫;‪list_price‬‬
‫;‪END‬‬
‫در اين مثال‪:‬‬

‫ابتدا‪ ،‬يک پارامتر به نام ‪ @min_list_price‬به ‪ stored procedure‬به نام ‪ uspFindProducts‬اضافه کرديم؛ هر پارامتر بايد‬
‫با عالمت @ آغاز شود‪ .‬کلیدواژههاي ‪ ،AS DECIMAL‬نوع دادهي پارامتر ‪ @min_list_price‬را مشخص میکنند؛‬
‫پارامترها بايد با آکوالدهاي باز و بسته احاطه شوند‪.‬‬

‫براي فیلتر محصوالتی که لیست‬ ‫‪SELECT‬‬ ‫سپس از پارامتر ‪ @min_list_price‬در دستور ‪ ،WHERE‬درون دستور‬
‫قیمتهاي آنها بیشتر يا برابر با ‪ @min_list_price‬هستند‪ ،‬استفاده کرديم‪.‬‬
‫اجرای یک ‪ stored procedure‬با یک پارامتر‬
‫براي اجراي ‪ stored procedure‬بايد بهمانند شکل زير يک آرگومان به ‪ uspFindProducts‬ارسال کنید‪:‬‬

‫; ‪EXEC uspFindProducts 100‬‬

‫‪ ،stored procedure‬تمام محصوالتی که لیست قیمتهاي آنها بیشتر يا برابر با ‪ 100‬هستند را بازمیگرداند‪.‬‬
‫اگر آرگومان را به ‪ 200‬تغییر دهید‪ ،‬مجموعهنتايج متفاوتی دريافت خواهید کرد‪:‬‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 146

‫ با چندین پارامتر‬stored procedure ‫ایجاد یک‬


.‫ها میتوانند يک يا چند پارامتر بگیرند؛ پارامترها با ويرگول از هم جدا میشوند‬stored procedure
،‫@ به آن‬max_list_price ‫ را با اضافه کردن يک پارامتر ديگر به نام‬uspFindProducts ‫ به نام‬stored procedure ‫کد زير‬
:‫تغییر میدهد‬

ALTER PROCEDURE uspFindProducts(


@min_list_price AS DECIMAL
,@max_list_price AS DECIMAL
)
AS
BEGIN
SELECT
product_name,
list_price
FROM
production.products
WHERE
list_price >= @min_list_price AND
list_price <= @max_list_price
ORDER BY
list_price;
END;

‫@ و‬min_list_price ‫ میتوانید آن را با ارسال دو آرگومان (يکی براي‬،‫ با موفقیت تغییر کرد‬stored procedure ‫وقتی‬
:‫@) اجرا کنید‬max_list_price ‫ديگري براي‬
EXECUTE uspFindProducts 900, 1000;
:‫تصوير زير خروجی را نشان میدهد‬
www.takbook.com

147 ‫ آشنايی باپايگاه داده‬/ 3 ‫فصل‬

‫استفاده از پارامترهای دارای نام‬


‫ها را با‬stored procedure‫ بهتر و بهصرفهتر است که‬،‫ها چندين پارامتر داشته باشند‬stored procedure ‫در صورتی که‬
.‫استفاده از پارامترهاي داراي نام اجرا کنید‬

‫را با استفاده از پارامترهاي داراي نام (يعنی‬ uspFindProducts ‫به نام‬ stored procedure ‫ کد زير‬،‫براي مثال‬
:‫@) اجرا میکند‬max_list_price ‫@ و‬min_list_price
EXECUTE uspFindProducts
@min_list_price = 900,
@max_list_price = 1000;

.‫ با اين تفاوت که حاال کد ما خیلی واضحتر و مرتبتر است‬،‫ همان نتیجهي قبلی است‬،stored procedure ‫نتیجهي‬
‫ایجاد پارامترهای متنی‬

.‫ اضافه میکند‬stored procedure ‫@ را بهعنوان يک پارامتر رشتهحروف به‬name ‫کد زير پارامتر‬

ALTER PROCEDURE uspFindProducts(


@min_list_price AS DECIMAL
,@max_list_price AS DECIMAL
,@name AS VARCHAR(max)
)
AS
BEGIN
SELECT
product_name,
list_price
FROM
production.products
WHERE
list_price >= @min_list_price AND
list_price <= @max_list_price AND
product_name LIKE '%' + @name + '%'
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪148‬‬


‫‪ORDER BY‬‬
‫;‪list_price‬‬
‫;‪END‬‬

‫در دستور ‪ WHERE‬از کد ‪ ،SELECT‬شرط زير را اضافه میکنیم‪:‬‬

‫'‪product_name LIKE '%' + @name + '%‬‬

‫با اين کار‪ stored procedure ،‬محصوالتی که لیست قیمتهاي آنها در بازهي حداقل و حداکثر لیست قیمتها هستند‬
‫را بازمیگرداند و نام محصوالت نیز شامل يک قطعهمتن هستند که ارسال میکنید‪.‬‬
‫وقتی ‪ stored procedure‬با موفقیت تغییر کرد‪ ،‬میتوانید آن را بهمانند شکل زير اجرا کنید‪:‬‬
‫‪EXECUTE uspFindProducts‬‬
‫‪@min_list_price = 900,‬‬
‫‪@max_list_price = 1000,‬‬
‫;'‪@name = 'Trek‬‬

‫در اين کد از ‪ stored procedure‬به نام ‪ uspFindProducts‬براي يافتن محصوالتی که لیست قیمت آنها در بازهي ‪ 900‬و‬
‫‪ 1000‬و نام آنها شامل واژه ‪ Trek‬باشد استفاده کرديم‪.‬‬

‫تصوير زير خروجی را نشان میدهد‪:‬‬

‫ایجاد پارامترهای اختیاری‬

‫وقتی ‪ uspFinProducts‬را اجرا میکنید‪ ،‬بايد تمام سه آرگومان متناظر با سه پارامتر آن را نیز ارسال کنید‪.‬‬
‫به شما اجازه میدهد مقادير پیشفرض براي پارامترها مشخص کنید تا وقتی ‪stored procedure‬ها را‬ ‫‪SQL Server‬‬

‫فراخوانی میکنید‪ ،‬میتوانید پارامترها را با مقادير پیشفرض ارسال کنید‪.‬‬


‫‪ stored procedure‬زير را ببینید‪:‬‬
‫(‪ALTER PROCEDURE uspFindProducts‬‬
‫‪@min_list_price AS DECIMAL = 0‬‬
‫‪,@max_list_price AS DECIMAL = 999999‬‬
‫)‪,@name AS VARCHAR(max‬‬
‫)‬
‫‪AS‬‬
‫‪BEGIN‬‬
‫‪SELECT‬‬
‫‪product_name,‬‬
‫‪www.takbook.com‬‬

‫‪149‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪list_price‬‬
‫‪FROM‬‬
‫‪production.products‬‬
‫‪WHERE‬‬
‫‪list_price >= @min_list_price AND‬‬
‫‪list_price <= @max_list_price AND‬‬
‫'‪product_name LIKE '%' + @name + '%‬‬
‫‪ORDER BY‬‬
‫;‪list_price‬‬
‫;‪END‬‬

‫در اين ‪ ،stored procedure‬ما ‪ 0‬را بهعنوان مقدار پیشفرض براي پارامتر ‪ @min_list_price‬و ‪ 999.999‬را بهعنوان‬
‫مقدار پیشفرض براي پارامتر ‪ @max_list_price‬قرار دادهايم‪.‬‬

‫کامپايل میشود‪ ،‬میتوانید آن را بدون ارسال آرگومان به پارامترهاي ‪ @min_list_price‬و‬ ‫‪stored procedure‬‬ ‫وقتی‬
‫‪ @max_list_price‬اجرا کنید‪:‬‬

‫‪EXECUTE uspFindProducts‬‬
‫;'‪@name = 'Trek‬‬

‫از ‪ 0‬براي پارامتر ‪ @min_list_price‬و از ‪ 999.999‬براي‬ ‫‪query‬‬ ‫در زمان اجراي‬ ‫‪stored procedure‬‬ ‫در اين صورت‪،‬‬
‫پارامتر ‪ @max_list_price‬استفاده میکند‪.‬‬

‫پارامترهاي ‪ @min_list_price‬و ‪ @max_list_price‬پارامترهاي اختیاري فراخوانی کردهاند‪.‬‬

‫مسلماً‪ ،‬همچنین میتوانید آرگومانها را به پارامترهاي اختیاري نیز ارسال کنیم‪ .‬براي مثال‪ ،‬کد زير تمام محصوالتی که‬
‫لیست قیمتهاي آنها بیشتر يا برابر با ‪ 6000‬و نام آنها شامل واژه ‪ Trek‬است را بازمیگرداند‪:‬‬

‫‪EXECUTE uspFindProducts‬‬
‫‪@min_list_price = 6000,‬‬
‫;'‪@name = 'Trek‬‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 150

‫ بهعنوان مقدار پیشفرض‬NULL ‫استفاده از‬

‫ چون‬،‫ اين کار جالبی نیست‬.‫ بهعنوان قیمت حداکثر پیشفرض استفاده کرديم‬999.999 ‫ ما از‬،uspFindProducts ‫در‬
.‫در آينده ممکن است محصوالت با قیمتهاي بیشتر از اين مقدار داشته باشید‬

:‫ بهعنوان مقدار پیشفرض براي پارامترها است‬NULL ‫ استفاده از‬،‫يک تکنیک مرسم براي پرهیز از اين امر‬

ALTER PROCEDURE uspFindProducts(


@min_list_price AS DECIMAL = 0
,@max_list_price AS DECIMAL = NULL
,@name AS VARCHAR(max)
)
AS
BEGIN
SELECT
product_name,
list_price
FROM
production.products
WHERE
list_price >= @min_list_price AND
(@max_list_price IS NULL OR list_price <= @max_list_price) AND
product_name LIKE '%' + @name + '%'
ORDER BY
list_price;
END;

:‫@ استفاده کنیم‬max_list_price ‫ براي پارامتر‬NULL ‫ ما شرط را تغییر داديم تا بتوانیم از مقدار‬،WHERE ‫در دستور‬

(@max_list_price IS NULL OR list_price <= @max_list_price)

Haro ‫ و نام آنها شامل واژه‬500 ‫با‬ ‫ را براي يافتن محصوالتی که قیمت آنها بزرگتر يا برابر‬uspFindProducts ‫کد زير‬
.‫ اجرا میکند‬،‫هستند‬

EXECUTE uspFindProducts
@min_list_price = 500,
@name = 'Haro';
‫‪www.takbook.com‬‬

‫‪151‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫در اين بخش‪ ،‬چگونگی ايجاد و اجراي‪ stored procedure‬ها با يک يا چند پارامتر را آموختید‪ .‬همچنین چگونگی ايجاد‬
‫آموختید‪.‬‬ ‫پارامترهاي اختیاري و استفاده از ‪NULL‬بهعنوان مقادير پیشفرض براي پارامترها را نیز‬
‫‪ 3-1-11‬بررسی ‪ Trigger‬در ‪SQL Server‬‬
‫همان طور که میدانید ‪ SQL‬معدن ‪ Log‬است و هر کاري که در ديتابیس و ديگر جاهاي ‪ SQL‬انجام دهید‪ ،‬يک ‪Log‬‬
‫از آن تولید میشود که شما میتوانید با قابلیت ‪ Trigger‬اين ‪Log‬ها را بهتر مديريت کنید و آن چیزي را که بخواهید‬
‫در خروجی نمايش دهید‪.‬‬
‫در کل ‪ Trigger‬شامل سه نوع مختلف است‪:‬‬
‫‪DML -1‬‬
‫که اين نوع ‪ Tigger‬زمانی اجرا میشود که يکی از سه عملیات (‪ )Insert, delete, Update‬در جدول مورد‬
‫نظر شما انجام شود‪.‬‬
‫‪DDL -2‬‬
‫در اين نوع ‪ Trigger‬زمانی اجرا میشود که سه عملیات (‪ )Create, alter, drop‬اجرا شود‪.‬‬
‫‪Logon -3‬‬
‫اين نوع ‪ Trigger‬زمانی فعال خواهد شد که کاربر وارد ‪ SQL‬و خارج شود‪.‬‬

‫براي اينکه بهتر با موضوع آشنا شويم يک مثال را با هم بررسی میکنیم و نحوه کارکرد ‪ Trigger‬را بررسی میکنیم‪.‬‬
‫شکل کلی دستور ‪ DML Triggers‬بهصورت زير میباشد‪:‬‬
‫‪CREATE TRIGGER [schema_name.]trigger_name‬‬
‫‪ON table_name‬‬
‫}]‪{FOR | AFTER | INSTEAD OF} {[INSERT] [,] [UPDATE] [,] [DELETE‬‬
‫‪AS‬‬
‫}‪{sql_statements‬‬
‫‪Showroom‬‬ ‫براي اينکه دستور باال را بررسی کنیم يک مثال را با هم انجام میدهیم‪ ،‬در دستور زير يک ديتابیس با نام‬
‫ایجاد میکنیم که این دیتابیس دارای دو جدول ‪ CAR‬و ‪ CARLOG‬است و اطالعات داخل آنها هم مشخص شده است‪.‬‬
‫‪CREATE DATABASE Showroom‬‬

‫‪GO‬‬

‫‪Use Showroom‬‬
‫‪CREATE TABLE Car‬‬
‫(‬
‫‪CarId int identity(1,1) primary key,‬‬
‫‪Name varchar(100),‬‬
‫‪Make varchar(100),‬‬
‫‪Model int ,‬‬
‫‪Price int ,‬‬
‫)‪Type varchar(20‬‬
‫)‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 152

insert into Car( Name, Make, Model , Price, Type)


VALUES ('Corrolla','Toyota',2015, 20000,'Sedan'),
('Civic','Honda',2018, 25000,'Sedan'),
('Passo','Toyota',2012, 18000,'Hatchback'),
('Land Cruiser','Toyota',2017, 40000,'SUV'),
('Corrolla','Toyota',2011, 17000,'Sedan')

CREATE TABLE CarLog


(
LogId int identity(1,1) primary key,
CarId int ,
CarName varchar(100),
)
.‫ و ديتابیس به همراه دو جدول ايجاد شده است‬،‫ اجرا شده است‬3-170 ‫دستورات باال در شکل‬

‫ ایجاد دیتابیس‬3-170 ‫شکل‬

‫ در جدول اصلی يعنی‬Insert, Update, Delete ‫ استفاده کنید تا رويدادهايی مانند‬DML Trigger ‫در ادامه میخواهیم از‬
‫ براي اين کار از دستورات زير استفاده‬،‫ هم ثبت شود‬Carlog ‫ صورت میگیرد بهصورت اتوماتیک در جدول‬CAR ‫در‬
.‫کنید‬
CREATE TRIGGER [dbo].[CarLOG_INSERT] ON [dbo].[CarLog]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @car_id INT, @car_name VARCHAR(50)
SELECT @car_id = INSERTED.CarId, @car_name = INSERTED.CarName
FROM INSERTED
INSERT INTO CarLog
VALUES(@car_id, @car_name)
END
‫ در‬،‫ است‬Carlog ‫ ايجاد میشود که زيرمجموعه جدول‬CarLOG_INSERT ‫ جديد با نام‬Trigger ‫در دستورات باال يک‬
‫ مشخص میکنیم که فقط دادههايی که وارد جدول‬INSTEAD OF INSERT ‫قسمت بعدي با استفاده از دستور‬
‫‪www.takbook.com‬‬

‫‪153‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫میشوند بايد در جدول ‪ Carlog‬ثبت شوند بعدازاين کار با دستور ‪ DECLARE‬دو متغیر با نامهاي ‪ @car_id‬و‬
‫‪ @car_name‬تعريف کرديم که و در ادامه با دستور ‪ SELECT‬اين دو متغیر را با ستونهاي جدول اصلی برابر قرار‬
‫داديم و در ادامه گفتیم که اطالعات را در جدول ‪ CArlog‬قرار دهد‪.‬‬
‫براي اينکه عملکرد ‪ Trigger‬را تست بگیريم قبل از هر کاري محتواي جدول ‪ Carlog‬را با دستور زير مشاهده‬
‫کنید‪:‬‬
‫‪SELECT * FROM CarLog‬‬

‫همانطور که در شکل ‪ 3-171‬مشاهده میکنید جدول کامالً خالی است‬

‫شکل ‪3-171‬‬

‫براي اينکه کارايی را مشاهده کنیم بايد با دستور زير اطالعاتی را در جدول ‪ Car‬که جدول اصلی است وارد کنیم و‬
‫بعد از آن بهصورت اتوماتیک اطالعات در جدول ‪ Carlog‬ثبت خواهد شد‪.‬‬

‫)‪insert into Car( Name, Make, Model , Price, Type‬‬


‫)'‪VALUES ('Pride','Kia',2021, 100000,'Sedan‬‬

‫‪Car‬‬ ‫بعد از واردکردن دستورات باال اطالعات جديد در جدول ‪ Car‬ثبت خواهد شد و بعد از آن بهصورت اتوماتیک‬
‫‪ ID‬و ‪ Car Name‬در جدول ‪ Carlog‬ثبت خواهند شد‪.‬‬
‫‪ 3-1-12‬توابع در ‪SQL Server 2019‬‬
‫زمانی که يک پروژه سنگین را به اتمام میرسانید و اين پروژه داراي هزار خط کد است که اگر چنانچه با مشکل‬
‫روبرو شود پیداکردن خطا در آن بسیار پیچیده خواهد شد‪ ،‬با استفاده از توابع در ‪ SQL‬شما میتوانید يک برنامه را‬
‫بهبود ببخشید و برنامه را بهتر کنترل کنید‪ ،‬اگر بخواهیم بهصورت کلی بگويیم با استفاده از توابع‪ ،‬برنامه ما به قطعههاي‬
‫منطقی جداگانه تبديل میشود و يک تابع به اين صورت عمل میکند که يک سري پارامتر را از ورودي میگیرد و‬
‫عملیاتی را بر روي آن انجام میدهد و در خروجی نمايش میدهد‪ ،‬تابع را میتوان يک شی در نظر گرفت که بعد از‬
‫ايجاد در ‪ SQL‬ذخیره شده و هر زمان بخواهید میتوانید آن را صدا بزنید‪.‬‬
‫براي اينکه توابع را بررسی کنیم يک ديتابیس به همراه جداول و مقادير آن را در ‪ SQL‬ايجاد و در ادامه توابع را بر‬
‫روي آنها اجرا خواهیم کرد‪:‬‬
‫ايجاد کنید‪ ،‬توجه کنید که دقیقاً اين اسم را وارد کنید تا در ادامه‬ ‫‪BikeStores‬‬ ‫بهمانند شکل زير يک ‪ Database‬با نام‬
‫تمرينات با مشکل روبرو نشويم‪.‬‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 154

:‫ باال با دستورات زير جداول آن را ايجاد کنید‬Database ‫بعد از ايجاد‬


.‫@) پیام دهید‬farshidbabajani( ‫ من در تلگرام‬ID ‫براي دانلود آن هم میتوانید به‬

CREATE SCHEMA production;


go

CREATE SCHEMA sales;


go

-- create tables
CREATE TABLE production.categories (
category_id INT IDENTITY (1, 1) PRIMARY KEY,
category_name VARCHAR (255) NOT NULL
);

CREATE TABLE production.brands (


brand_id INT IDENTITY (1, 1) PRIMARY KEY,
brand_name VARCHAR (255) NOT NULL
);

CREATE TABLE production.products (


product_id INT IDENTITY (1, 1) PRIMARY KEY,
product_name VARCHAR (255) NOT NULL,
brand_id INT NOT NULL,
category_id INT NOT NULL,
model_year SMALLINT NOT NULL,
list_price DECIMAL (10, 2) NOT NULL,
FOREIGN KEY (category_id) REFERENCES production.categories (category_id) ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (brand_id) REFERENCES production.brands (brand_id) ON DELETE
CASCADE ON UPDATE CASCADE
);

CREATE TABLE sales.customers (


customer_id INT IDENTITY (1, 1) PRIMARY KEY,
first_name VARCHAR (255) NOT NULL,
last_name VARCHAR (255) NOT NULL,
phone VARCHAR (25),
email VARCHAR (255) NOT NULL,
street VARCHAR (255),
city VARCHAR (50),
state VARCHAR (25),
zip_code VARCHAR (5)
);
www.takbook.com

155 ‫ آشنايی باپايگاه داده‬/ 3 ‫فصل‬


CREATE TABLE sales.stores (
store_id INT IDENTITY (1, 1) PRIMARY KEY,
store_name VARCHAR (255) NOT NULL,
phone VARCHAR (25),
email VARCHAR (255),
street VARCHAR (255),
city VARCHAR (255),
state VARCHAR (10),
zip_code VARCHAR (5)
);

CREATE TABLE sales.staffs (


staff_id INT IDENTITY (1, 1) PRIMARY KEY,
first_name VARCHAR (50) NOT NULL,
last_name VARCHAR (50) NOT NULL,
email VARCHAR (255) NOT NULL UNIQUE,
phone VARCHAR (25),
active tinyint NOT NULL,
store_id INT NOT NULL,
manager_id INT,
FOREIGN KEY (store_id) REFERENCES sales.stores (store_id) ON DELETE CASCADE ON
UPDATE CASCADE,

FOREIGN KEY (manager_id) REFERENCES sales.staffs (staff_id) ON DELETE NO ACTION ON


UPDATE NO ACTION
);

CREATE TABLE sales.orders (


order_id INT IDENTITY (1, 1) PRIMARY KEY,
customer_id INT,
order_status tinyint NOT NULL,
-- Order status: 1 = Pending; 2 = Processing; 3 = Rejected; 4 = Completed
order_date DATE NOT NULL,
required_date DATE NOT NULL,
shipped_date DATE,
store_id INT NOT NULL,
staff_id INT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES sales.customers (customer_id) ON DELETE
CASCADE ON UPDATE CASCADE,
FOREIGN KEY (store_id) REFERENCES sales.stores (store_id) ON DELETE CASCADE ON
UPDATE CASCADE,
FOREIGN KEY (staff_id) REFERENCES sales.staffs (staff_id) ON DELETE NO ACTION
ON UPDATE NO ACTION
);

CREATE TABLE sales.order_items (


order_id INT,
item_id INT,
product_id INT NOT NULL,
quantity INT NOT NULL,
list_price DECIMAL (10, 2) NOT NULL,
discount DECIMAL (4, 2) NOT NULL DEFAULT 0,
PRIMARY KEY (order_id, item_id),
FOREIGN KEY (order_id) REFERENCES sales.orders (order_id) ON DELETE CASCADE ON
UPDATE CASCADE,
FOREIGN KEY (product_id) REFERENCES production.products (product_id) ON DELETE
CASCADE ON UPDATE CASCADE
);

CREATE TABLE production.stocks (


store_id INT,
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪156‬‬


‫‪product_id INT,‬‬
‫‪quantity INT,‬‬
‫‪PRIMARY KEY (store_id, product_id),‬‬
‫‪FOREIGN KEY (store_id) REFERENCES sales.stores (store_id) ON DELETE CASCADE ON‬‬
‫‪UPDATE CASCADE,‬‬
‫‪FOREIGN KEY (product_id) REFERENCES production.products (product_id) ON DELETE‬‬
‫‪CASCADE ON UPDATE CASCADE‬‬
‫;)‬
‫همانطور که در شکل زير مشاهده میکنید جداول مورد نظر ايجاد شدهاند‪:‬‬

‫در ادامه کار بايد اطالعات اين جداول را پر کنیم‪ ،‬براي اين کار بايد از دستورت زير استفاده کنیم‪:‬‬
‫بهخاطر اينکه تعداد دستورات زياد است بهتر است از لینک زير آن را دانلود و در ‪ SQL‬اجرا کنید‪:‬‬
‫‪http://3isco.ir/Books/Load-data.sql‬‬

‫توابع ايجاد شده توسط کاربر در ‪ SQL Server‬به شما کمک میکنند تا با کپسولهسازي منطقهاي کسبوکار پیچیده و‬
‫ايجاد قابلیت استفاده مجدد از آنها در هر ‪ ،query‬فرايند توسعه نرمافزار خود را تسهیل کنید‪.‬‬
‫در اين بخش مباحث زير مورد بررسی قرار میگیرند‪:‬‬
‫‪www.takbook.com‬‬

‫‪157‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫توابع اسکالر تعريف شده توسط کاربر‪ :‬توابع اسکالر تعريف شده توسط کاربر را پوشش میدهد‪ .‬اين‬ ‫•‬

‫توابع به شما امکان میدهند تتا فرمولها يا منطقهاي کسبوکار پیچیده را کپسولهسازي کنید و در همه‬
‫‪query‬ها مجدداً از آنها استفاده کنید‪.‬‬
‫متغیرهاي جدول‪ :‬چگونگی استفاده از متغیرهاي جدول بهعنوان يک مقدار بازگشتی از توابع تعريف شده‬ ‫•‬

‫توسط کاربر را خواهید آموخت‪.‬‬


‫توابع داراي مقدار جدول‪ :‬شما را با تابع داراي مقدار جدول تک خطی و تابع داراي مقدار جدول چند‬ ‫•‬

‫کدي آشنا میکند تا بتوانید توابع تعريف شده توسط کاربر ايجاد کنید که دادههاي نوعهاي جدول را‬
‫بازگردانند‪.‬‬
‫حذف توابع تعريف شده توسط کاربر‪ :‬چگونگی حذف يک يا چند تابع تعريف شده توسط کاربر موجود‬ ‫•‬

‫از پايگاهداده را توضیح میدهند‪.‬‬

‫در ‪SQL Server‬‬ ‫‪ 3-1-12-1‬توابع اسکالر‬

‫تابع اسکار در ‪ SQL Server‬يک يا چند پارامتر میگیرد و يک مقدار بازمیگرداند‪.‬‬


‫توابع اسکالر به شما کمک میکنند کدتان را سادهسازي کنید‪ .‬براي مثال‪ ،‬ممکن است يک محاسبه پیچیده داشته باشید‬
‫که در ‪query‬هاي زيادي از آن استفاده شده است‪.‬‬
‫بهجاي درج فرمول در همه ‪query‬ها‪ ،‬میتوانید يک تابع اسکالر ايجاد کنید که فرمول را کپسولهسازي کرده و از آن در‬
‫‪query‬ها استفاده کند‪.‬‬
‫ايجاد يک تابع اسکالر‬

‫براي ايجاد يک تابع اسکالر‪ ،‬میتوانید از کد ‪ CREATE FUNCTION‬به شکل زير استفاده کنید‪:‬‬

‫)‪CREATE FUNCTION [schema_name.]function_name (parameter_list‬‬


‫‪RETURN data_type AS‬‬
‫‪BEGIN‬‬
‫‪statements‬‬
‫‪RETURN value‬‬
‫‪END‬‬
‫در اين ‪:syntax‬‬

‫مشخص شده است‪ .‬نام شما اختیاري است‪.‬‬ ‫‪CREATE FUNCTION‬‬ ‫اول‪ ،‬نام تابع بعد از کلیدواژههاي‬ ‫•‬

‫اگر صريحاً نام شما را مشخص نکنید‪ SQL Server ،‬بهصورت پیشفرض از ‪ dbo‬استفاده میکند‪.‬‬
‫دوم‪ ،‬لیستی از پارامترها در بین پرانتزها بعد از نام تابع مشخص شدهاند‪.‬‬ ‫•‬

‫سوم‪ ،‬نوع داده از مقدار بازگشتی در کد ‪ RETURN‬مشخص شده است‪.‬‬ ‫•‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪158‬‬


‫چهارم‪ ،‬داخل بدنه تابع‪ ،‬از دستور ‪ RETURN‬بايد استفاده شود تا يک مقدار بازگردانده شود‪.‬‬ ‫•‬

‫مثال زير يک تابع ايجاد میکند که فروش خالص را بر اساس کمیت‪ ،‬قیمت و تخفیف محاسبه میکند‪:‬‬

‫(‪CREATE FUNCTION sales.udfNetSale‬‬


‫‪@quantity INT,‬‬
‫‪@list_price DEC(10,2),‬‬
‫)‪@discount DEC(4,2‬‬
‫)‬
‫)‪RETURNS DEC(10,2‬‬
‫‪AS‬‬
‫‪BEGIN‬‬
‫;)‪RETURN @quantity * @list_price * (1 - @discount‬‬
‫;‪END‬‬

‫از پايگاهداده‬ ‫‪order_items‬‬ ‫سپس‪ ،‬میتوانید از اين کد براي محاسبه فروش خالص هر سفارش فروش در جدول‬
‫‪ Bikestores‬استفاده کنید‪.‬‬
‫بعد از ايجاد تابع اسکالر‪ ،‬میتوانید آن را در آدرس ‪ programmability > Functions > Scalar-valued Functions‬که در‬
‫تصوير زير مشاهده میکنید بیابید‪:‬‬

‫فراخوانی تابع اسکالر دقیقاً همانند فراخوانی يک تابع معمولی است‪ .‬براي مثال‪ ،‬کد زير چگونگی فراخوانی تابع‬
‫‪ udfNetSale‬را نشان میدهد‪:‬‬

‫‪SELECT‬‬
‫‪sales.udfNetSale(10,100,0.1) net_sale‬‬
‫خروجی به اين شکل است‪:‬‬
‫‪www.takbook.com‬‬

‫‪159‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫مثال زير‪ ،‬چگونگی استفاده از تابع ‪ Sales.udfNetSale‬براي بهدستآوردن فروش خالص سفارشهاي فروش در جدول‬
‫‪ order_items‬را نشان میدهد‪:‬‬
‫‪SELECT‬‬
‫‪order_id,‬‬
‫‪SUM(sales.udfNetSale(quantity, list_price, discount)) net_amount‬‬
‫‪FROM‬‬
‫‪sales.order_items‬‬
‫‪GROUP BY‬‬
‫‪order_id‬‬
‫‪ORDER BY‬‬
‫;‪net_amount DESC‬‬
‫تصوير زير بخشی از خروجی را نمايش میدهد‪:‬‬

‫تغییر دادن یک تابع اسکالر‬


‫استفاده کنید‪ .‬بقیه کدها‬ ‫‪ALTER‬‬ ‫از دستور‬ ‫‪CREATE‬‬ ‫براي تغییر دادن يک تابع اسکالر‪ ،‬میتوانید بهجاي کلیدواژه‬
‫دستنخورده باقی میمانند‪:‬‬

‫)‪ALTER FUNCTION [schema_name.]function_name (parameter_list‬‬


‫‪RETURN data_type AS‬‬
‫‪BEGIN‬‬
‫‪statements‬‬
‫‪RETURN value‬‬
‫‪END‬‬

‫توجه کنید که اگر تابع تعريف شده توسط کاربر وجود ندارد‪ ،‬میتوانید از دستور ‪ CREATE OR ALTER‬براي ايجاد‬
‫يک تابع تعريف شده توسط کاربر يا براي تغییر دادن يک تابع اسکالر از پیش موجود استفاده کنید‪:‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪160‬‬


‫)‪CREATE OR ALTER FUNCTION [schema_name.]function_name (parameter_list‬‬
‫‪RETURN data_type AS‬‬
‫‪BEGIN‬‬
‫‪statements‬‬
‫‪RETURN value‬‬
‫‪END‬‬
‫حذف یک تابع اسکالر‬

‫براي حذف يک تابع اسکالر از پیش موجود‪ ،‬میتوانید از دستور ‪ DROP FUNCTION‬استفاده کنید‪:‬‬

‫;‪DROP FUNCTION [schema_name.]function_name‬‬

‫براي مثال‪ ،‬براي حذف تابع ‪ Sales.udfNetSale‬میتوانید از کد زير استفاده کنید‪:‬‬

‫;‪DROP FUNCTION sales.udfNetSale‬‬


‫‪SQL Server‬‬ ‫نکات تابع اسکالر در‬
‫در لیست زير نکات کلیدي توابع اسکالر را مشاهده میکنید‪:‬‬
‫توابع اسکالر را تقريباً میتوان در همهجا درون کدهاي ‪ T-SQL‬به کار برد‪.‬‬ ‫•‬

‫توابع اسکالر يک يا چند پارامتر میپذيرند‪ ،‬اما فقط يک مقدار بازمیگردانند‪ ،‬در نتیجه بايد شامل يک دستور‬ ‫•‬

‫‪ RETURN‬باشند‪.‬‬

‫توابع اسکالر میتوانند از منطقهايی مانند قطعات کد ‪ IF‬يا حلقههاي ‪ WHILE‬استفاده کنند‪.‬‬ ‫•‬

‫توابع اسکالر نمیتوانند دادهها را ‪ update‬کنند‪ .‬میتوانند به دادهها دسترسی داشته باشند‪ ،‬اما اين کار اصالً‬ ‫•‬

‫توصیه نمیشود‪.‬‬
‫توابع اسکالر میتوانند توابع ديگر را فراخوانی کنند‪.‬‬ ‫•‬

‫به اين صورت‪ ،‬چگونگی استفاده از توابع اسکالر براي کپسولهسازي فرمولها يا منطقهاي کسبوکار پیچیده و استفاده‬
‫مجدد از آنها در ‪Query‬ها را آموختید‪.‬‬

‫‪Date‬‬ ‫‪ 3-1-12-2‬توابع تاريخ يا‬


‫در اين قسمت به کار با توابع تاريخ يا ‪ Date‬خواهیم پرداخت‪ .‬در ادامه لیستی از توابع تاريخ در ‪ SQL Server‬را مشاهده‬
‫میکنید که به شما اجازه میدهند دادههاي تاريخ و زمان را بهصورت مؤثر و کاربردي مديريت کنید‪.‬‬

‫توابع بازگرداننده تاريخ و زمان فعلی‬


‫توضیح‬ ‫تابع‬
‫بازمیگرداند‪.‬‬ ‫تاريخ و زمان فعلی سیستم را بدون بخش محدوده زمانی‬ ‫‪CURRENT_TIMESTAMP‬‬
‫‪www.takbook.com‬‬

‫‪161‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫عدد ‪ integer‬بازمیگرداند‪.‬‬ ‫بخش تاريخ را بهصورت يک‬ ‫‪GETUTCDATE‬‬

‫تاريخ و زمان فعلی سیستم عاملی که ‪ SQL Server‬در حال اجرا شدن روي آن‬
‫‪GETDATE‬‬
‫بازمیگرداند‪.‬‬ ‫است را‬
‫تاريخ و زمان فعلی سیستم را همراه با دقت ثانیههاي اعشار بیشتر نسبت به تابع‬
‫‪SYSDATETIME‬‬
‫‪()GETDATE‬بازمیگرداند‪.‬‬

‫بازمیگرداند‪.‬‬ ‫تاريخ و زمان سیستم فعلی در زمان ‪ UTC‬را‬ ‫‪SYSUTCDATETIME‬‬

‫بازمیگرداند‪.‬‬ ‫تاريخ و زمان سیستم فعلی همراه با محدوده زمانی را‬ ‫‪SYSDATETIMEOFFSET‬‬

‫توابع بازگرداننده بخشهاي تاريخ و زمان‬


‫توضیح‬ ‫تابع‬
‫بازمیگرداند‪.‬‬ ‫بخش تاريخ را بهعنوان يک کاراکتر رشته‬ ‫‪DATENAME‬‬

‫عدد ‪ integer‬بازمیگرداند‪.‬‬ ‫بخش تاريخ را بهعنوان يک‬ ‫‪DATEPART‬‬

‫عدد ‪ integer‬بازمیگرداند‪.‬‬ ‫روز يک تاريخ خاص را بهعنوان يک‬ ‫‪DAY‬‬

‫عدد ‪ integer‬بازمیگرداند‪.‬‬ ‫ماه يک تاريخ خاص را بهعنوان يک‬ ‫‪MONTH‬‬

‫عدد ‪ integer‬بازمیگرداند‪.‬‬ ‫سال يک تاريخ را بهعنوان يک‬ ‫‪YEAR‬‬

‫تابع بازگرداننده اختالف بین دو تاريخ‬

‫توضیح‬ ‫تابع‬
‫يک مقدار به بخش تاريخ اضافه میکند و مقدار تاريخ جديد را‬
‫‪DATEADD‬‬
‫بازمیگرداند‪.‬‬

‫يک ‪offset‬‬ ‫آخرين روز ماه موجود در تاريخ مشخص شده را همراه با‬
‫‪EOMONTH‬‬
‫بازمیگرداند‪.‬‬ ‫اختیاري‬
‫‪Offset‬منطقه زمانی يک مقدار ‪ DATETIMEOFFSET‬را تغییر میدهد‬
‫‪SWITCHOFFSET‬‬
‫میکند‪.‬‬ ‫و مقدار ‪ UTC‬را حفظ‬
‫يک مقدار ‪DATETIME2‬را به يک مقدار ‪ DATETIMEOFFSET‬تبديل‬
‫‪TODATETIMEOFFSET‬‬
‫میکند‪.‬‬

‫توابع ايجاد تاريخ و زمان از بخشهاي مخصوص به خودشان‬


‫توضیح‬ ‫تابع‬
‫بازمیگرداند‪.‬‬ ‫يک مقدار ‪ DATE‬از سال‪ ،‬ماه و روز‬ ‫‪DATEFROMPARTS‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪162‬‬


‫بازمیگرداند‪.‬‬ ‫يک مقدار ‪ DATETIME2‬از آرگومانهاي تاريخ و زمان‬ ‫‪DATETIME2FROMPARTS‬‬

‫از آرگومانهاي تاريخ و زمان‬ ‫‪DATETIMEOFFSET‬‬ ‫يک مقدار‬


‫‪DATETIMEOFFSETFROMPARTS‬‬
‫بازمیگرداند‪.‬‬

‫بازمیگرداند‪.‬‬ ‫يک مقدار ‪ TIME‬از بخشهاي زمان همراه با دقت بیشتر‬ ‫‪TIMEFROMPARTS‬‬

‫تابع ارزيابی مقادير تاريخ و زمان‬


‫توضیح‬ ‫تابع‬
‫بررسی میکند که آيا يک مقدار يک تاريخ‪ ،‬زمان يا ‪ Datetime‬معتبر‬
‫‪ISDATE‬‬
‫نه‪.‬‬ ‫هست يا‬
‫‪SQL Server‬‬ ‫تابع ‪ CURRENT_TIMESTAMP‬در‬
‫تابع ‪ CURRENT_TIMESTAMP‬برچسب زمان سیستمعامل سروري که ‪ SQL Server Database‬روي آن اجرا میشود‬
‫را بازمیگرداند‪ .‬برچسب زمان بازگشتی يک مقدار ‪ DATETIME‬بدون ‪ offset‬محدوده زمانی است‪.‬‬
‫تابع ‪ CURRENT_TIMESTAMP‬هیچ آرگومانی نمیگیرد‪:‬‬
‫‪CURRENT_TIMESTAMP‬‬
‫‪ CURRENT_TIMESTAMP‬يک معادل ‪ ANSI SQL‬براي ()‪ GETDATE‬است‪.‬‬
‫میتوانید از تابع ‪ CURRENT_TIMESTAMP‬در هرجايی که يک عبارت ‪ DATETIME‬قابلقبول باشد‪ ،‬استفاده کنید‪.‬‬

‫اجازه دهید چند مثال براي استفاده از تابع ‪ CURRENT_TIMESTAMP‬حل کنیم‪.‬‬

‫‪CURRENT_TIMESTAMP‬‬ ‫الف) مثال ساده‬


‫مثال زير از تابع ‪ CURRENT_TIMESTAMP‬براي بازگرداندن تاريخ و زمان فعلی استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;‪CURRENT_TIMESTAMP AS current_date_time‬‬

‫خروجی بهاينترتیب است‪:‬‬


www.takbook.com

163 ‫ آشنايی باپايگاه داده‬/ 3 ‫فصل‬


‫ بهعنوان يک مقدار پیشفرض براي ستونهاي جدول‬CURRENT_TIMESTAMP ‫ب) مثال استفاده از تابع‬

‫در آن يک مقدار‬ created_at ‫ايجاد میکنیم که ستون‬ current_timestamp_demos ‫ يک جدول جديد به نام‬،‫ابتدا‬
:‫پیشفرض را بهعنوان برچسب زمان میپذيرد که در آن يک تابع اضافه شده است‬

CREATE TABLE current_timestamp_demos


(
id INT IDENTITY,
msg VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL
DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(id)
);
:‫دو رديف به جدول اضافه میکنیم‬،‫سپس‬

INSERT INTO current_timestamp_demos(msg)


VALUES('This is the first message.');

INSERT INTO current_timestamp_demos(msg)


VALUES('current_timestamp demo');

:‫ به دست میآوريم‬current_timestamp_demos ‫ دادهها را از جدول‬،‫در آخر‬

SELECT
id,
msg,
created_at
FROM
current_timestamp_demos;

:‫خروجی به اين شکل است‬

‫ مقدار برچسب زمان بازگشتی‬created_at ‫ مقادير موجود در ستون‬،‫همانطور که بهوضوح در خروجی مشاهده میکنید‬
.‫ را میگیرند‬CURRENT_TIMESTAMP ‫توسط تابع‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 164


‫براي بازگرداندن برچسب زمان سیستم پايگاهداده‬ CURRENT_TIMESTAMP ‫ چگونگی استفاده از تابع‬،‫در نتیجه‬
.‫ را آموختید‬DATETIME ‫بهعنوان يک مقدار‬
SQL Server ‫ در‬GETUTCDATE ‫تابع‬
‫ اين مقدار را از سیستم عاملی که‬GETUTCDATE)( ‫ تابع‬.‫ فعلی را بازمیگرداند‬UTC ‫ زمان‬GETUTCDATE)( ‫تابع‬
.‫ محاسبه میکند‬،‫ در آن اجرا میشود‬SQL Server

:‫ زير است‬Syntax ‫ داراي‬GETUTCDATE)( ‫تابع‬


GETUTCDATE()
SQL Server ‫ در‬GETUTCDATE)( ‫مثال‬

‫و‬ UTC ‫ زمان‬،‫براي بازگرداندن زمان محلی‬ DATEDIFF)( ‫و‬ GETUTCDATE() ،GETDATE)( ‫اين مثال از توابع‬
:‫محدوده زمانی سرور استفاده میکند‬

DECLARE
@local_time DATETIME,
@utc_time DATETIME;

SET @local_time = GETDATE();


SET @utc_time = GETUTCDATE();

SELECT
CONVERT(VARCHAR(40), @local_time)
AS 'Server local time';
SELECT
CONVERT(VARCHAR(40), @utc_time)
AS 'Server UTC time'
SELECT
CONVERT(VARCHAR(40), DATEDIFF(hour, @utc_time, @local_time))
AS 'Server time zone';
GO
GETUTCDATE)( ‫ چگونگی استفاده از تابع‬،‫ در اين مثال‬،‫خروجی دستورات باال را در شکل زير مشاهده میکنید‬
.‫ فعلی را آموختید‬UTC ‫براي بهدستآوردن زمان‬
‫‪www.takbook.com‬‬

‫‪165‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫‪SQL Server‬‬ ‫تابع ‪ GETDATE‬در‬

‫تابع ()‪ GETDATE‬برچسب زمان فعلی سیستم را بهعنوان يک مقدار ‪ DATETIME‬بدون ‪ offset‬منطقه زمانی پايگاهداده‬
‫بازمیگرداند‪ .‬مقدار ‪ DATETIME‬از سیستمعامل سرور به دست میآيد که نمونه ‪ SQL Server‬در آن اجرا میشود‪.‬‬
‫کد زير ‪ syntax‬تابع ()‪ GETDATE‬را نشان میدهد‪:‬‬
‫)(‪GETDATE‬‬
‫توجه کنید که تابع ()‪ GETDATE‬يک تابع غیرمتمرکز است‪ ،‬ازاينرو‪ ،‬نمیتوانید براي ستونهايی که اين تابع را رفرنس‬
‫کردهاند يک ‪ index‬در ‪view‬ها ايجاد کنید‪.‬‬
‫اجازه دهید چند مثال براي استفاده از تابع ()‪ GETDATE‬حل کنیم‪.‬‬
‫الف) مثال استفاده از تابع ()‪ GETDATE‬براي بهدستآوردن تاريخ و زمان فعلی‬
‫روي آن اجرا‬ ‫‪SQL Server‬‬ ‫براي بازگرداندن تاريخ و زمان فعلی سیستم عاملی که‬ ‫()‪GETDATE‬‬ ‫اين مثال از تابع‬
‫میشود‪ ،‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;‪GETDATE() current_date_time‬‬

‫خروجی به اين شکل است‪:‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪166‬‬


‫ب) مثال استفاده از تابع ()‪ GETDATE‬براي بهدستآوردن تاريخ فعلی سیستم‬
‫‪DATE‬‬ ‫براي بهدستآوردن تاريخ فعلی‪ ،‬میتوانید از تابع ()‪ CONVERT‬براي تبديل مقدار ‪ DATETIME‬به يک مقدار‬
‫استفاده کنید که در کد زير مشاهده میکنید‪:‬‬

‫‪SELECT‬‬
‫;]‪CONVERT(DATE, GETDATE()) [Current Date‬‬

‫کد زير نیز خروجی را نشان میدهد‪:‬‬

‫به طور مشابه‪ ،‬میتوانید از توابع ()‪ TRY_CONVERT‬و ()‪ CAST‬براي تبديل نتیجه تابع ()‪ GETDATE‬به يک تاريخ‬
‫استفاده کنید‪:‬‬

‫‪SELECT‬‬
‫‪TRY_CONVERT(DATE, GETDATE()),‬‬
‫;)‪CAST(GETDATE() AS DATE‬‬

‫پ) مثال استفاده از تابع ()‪ GETDATE‬براي بهدستآوردن زمان فعلی سیستم‬
‫براي بهدستآوردن زمان فعلی‪ ،‬میتوانید از تابع ())(‪ TRY_CONVERT ،CONVERT‬يا ()‪ CAST‬براي تبديل نتیجه‬
‫تابع ()‪ GETDATE‬به يکزمان استفاده کنید‪:‬‬
‫‪SELECT‬‬
‫‪CONVERT(TIME,GETDATE()),‬‬
‫‪TRY_CONVERT(TIME, GETDATE()),‬‬
‫;)‪CAST(GETDATE() AS TIME‬‬
‫‪www.takbook.com‬‬

‫‪167‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫به اين شکل‪ ،‬چگونگی استفاده از تابع ()‪ GETDATE‬براي بازگرداندن تاريخ و زمان فعلی سیستم را نیز آموختید‪.‬‬

‫‪SQL Server‬‬ ‫تابع ‪ SYSDATETIME‬در‬


‫تابع ()‪ SYSDATETIME‬يک مقدار ‪ DATETIME2‬را بازمیگرداند که نشاندهنده تاريخ و زمان فعلی سروري است‬
‫که نمونه ‪ SQL Server‬در آن اجرا میشود‪.‬‬

‫تابع ()‪ SYSDATETIME‬هیچ پارامتري نمیگیرد‪:‬‬

‫()‪SYSDATETIME‬‬

‫خروجی به اين شکل است‪:‬‬

‫توجه کنید که تابع ()‪ SYSDATETIME‬داراي دقت ثانیههاي اعشاري بیشتري نسبت به تابع ()‪ GETDATE‬است‪.‬‬

‫()‪ SYSDATETIME‬يک تابع غیرمتمرکز است‪ ،‬ازاينرو‪view ،‬ها و ستونهايی که داراي عبارات رفرنسی به سمت اين‬
‫تابع هستند را نمیتوان ‪ index‬گذاري کرد‪.‬‬

‫بیايید چند مثال براي استفاده از تابع ()‪ SYSDATETIME‬حل کنیم‪.‬‬


‫الف) بازگرداندن تاريخ فعلی سیستم‬

‫اين مثال از تابع ()‪ CONVERT‬براي تبديل نتیجه تابع ()‪ SYSDATETIME‬به تاريخ فعلی استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪168‬‬


‫;))(‪CONVERT(DATE, SYSDATETIME‬‬
‫نتیجه به اين صورت است‪:‬‬

‫ب) بازگرداندن زمان فعلی سیستم‬

‫مثال زير نتیجه تابع ()‪ SYSDATETIME‬را به زمان فعلی تبديل میکند‪:‬‬

‫‪SELECT‬‬
‫;‪CONVERT(TIME, SYSDATETIME()) Result‬‬
‫خروجی به اين شکل است‪:‬‬

‫به اين شکل‪ ،‬چگونگی استفاده از تابع ()‪ SYSDATETIME‬براي بهدستآوردن تاريخ و زمان فعلی را نیز آموختید‪.‬‬

‫‪SQL Server‬‬ ‫تابع ‪ SYSUTCDATETIME‬در‬


‫‪SQL‬‬ ‫تابع ()‪ SYSTCDATETIME‬يک مقدار ‪ DATETIME2‬بازمیگرداند که تاريخ و زمان فعلی سروري که نمونه‬
‫‪ Server‬روي آن اجرا میشود را نشان میدهد‪ Datetime .‬به فرمت زمان هماهنگی جهانی (‪ )UTC‬میباشد‪.‬‬

‫‪ Syntax‬تابع ()‪ SYSTCDATETIME‬بهصورت زير است‪:‬‬


‫()‪SYSUTCDATETIME‬‬

‫براي مثال‪ ،‬براي بهدستآوردن تاريخ و زمان فعلی در ‪ ،UTC‬میتوانید از کد زير استفاده کنید‪:‬‬

‫‪SELECT‬‬
‫;‪SYSUTCDATETIME() utc_time‬‬

‫خروجی به اين صورت است‪:‬‬


‫‪www.takbook.com‬‬

‫‪169‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫()‪GETUTCDATE‬‬ ‫توجه کنید که تابع ()‪ SYSTCDATETIME‬داراي دقت ثانیههاي اعشاري بیشتري نسبت به تابع‬
‫است‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ SYSTCDATETIME‬در‬

‫‪UTC‬‬ ‫الف) مثال بازگرداندن تاريخ فعلی به فرم زمان‬

‫مثال زير از تابع ()‪ CONVERT‬براي تبديل نتیجه تابع ()‪ SYSTCDATETIME‬به تاريخ فعلی به فرم زمان ‪ UTC‬استفاده‬
‫میکند‪:‬‬

‫‪SELECT‬‬
‫;‪CONVERT(DATE, SYSUTCDATETIME()) utc_date‬‬

‫خروجی به اين شکل است‪:‬‬

‫‪UTC‬‬ ‫ب) مثال بازگرداندن زمان فعلی به فرم زمان‬

‫اين مثال نتیجه تابع ()‪ SYSTCDATETIME‬را به تاريخ فعلی به فرم زمان ‪ UTC‬تبديل میکند‪:‬‬
‫‪SELECT‬‬
‫;‪CONVERT(DATE, SYSUTCDATETIME()) utc_time‬‬

‫خروجی به اين شکل است‪:‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪170‬‬


‫به اين صورت چگونگی استفاده از تابع ()‪ SYSTCDATETIME‬براي بهدستآوردن تاريخ و زمان فعلی به فرم زمان‬
‫‪ UTC‬را آموختید‪.‬‬
‫‪SQL Server‬‬ ‫تابع ‪ SYSDATETIMEOFFSET‬در‬
‫يک مقدار ‪ )7(DATETIMEOFFSET‬را بازمیگرداند که تاريخ و زمان فعلی را‬ ‫()‪SYSDATETIMEOFFSET‬‬ ‫تابع‬
‫نشان میدهد و همچنین شامل منطقه زمانی رايانهاي که نمونه ‪ SQL Server‬روي آن اجرا میشود نیز هست‪.‬‬

‫کد زير ‪ syntax‬تابع ()‪ SYSDATETIMEOFFSET‬را نشان میدهد‪:‬‬


‫)(‪SYSDATETIMEOFFSET‬‬

‫براي مثال‪ ،‬براي بهدستآوردن تاريخ و زمان فعلی همراه با منطقه زمانی سروري که به آن متصل هستید‪ ،‬میتوانید از‬
‫کد زير استفاده کنید‪:‬‬

‫‪SELECT‬‬
‫;]‪SYSDATETIMEOFFSET() [datetimeoffset with timezone‬‬
‫خروجی به اين شکل است‪:‬‬

‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ SYSDATETIMEOFFSET‬در‬


‫بیايید چند مثال براي استفاده از تابع ()‪ SYSDATETIMEOFFSET‬حل کنیم‪.‬‬
‫الف) مثال استخراج ‪ offset‬منطقه زمانی‬
‫‪integer‬‬ ‫منطقه زمانی استفاده کرده است‪ .‬اين مثال يک‬ ‫‪offset‬‬ ‫براي بازگرداندن‬ ‫()‪DATEPART‬‬ ‫مثال زير از تابع‬
‫بازمیگرداند که نشاندهنده ‪ offset‬منطقه زمانی به دقیقه است‪.‬‬
‫‪SELECT‬‬
‫‪SYSDATETIMEOFFSET() AS [System DateTime Offset],‬‬
‫;]‪DATEPART(TZoffset, SYSDATETIMEOFFSET()) AS [Timezone Offset‬‬

‫خروجی به اين شکل است‪:‬‬


‫‪www.takbook.com‬‬

‫‪171‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫ب) مثال فرمتبندي ‪ offset‬منطقه زمانی‬

‫به شکل رشته‬ ‫‪zzz‬‬ ‫و‬ ‫‪zz‬‬ ‫و آرگومانهاي‬ ‫()‪FORMAT‬‬ ‫منطقه زمانی بازگشتی را با استفاده از تابع‬ ‫‪offset‬‬ ‫اين مثال‬
‫بازمیگرداند‪:‬‬
‫‪SELECT‬‬
‫‪SYSDATETIMEOFFSET() AS 'System Date Time Offset',‬‬
‫‪FORMAT(SYSDATETIMEOFFSET(), 'zz') AS 'zz',‬‬
‫;'‪FORMAT(SYSDATETIMEOFFSET(), 'zzz') AS 'zzz‬‬

‫تصوير زير‪ ،‬خروجی را نشان میدهد‪:‬‬

‫به اين شکل‪ ،‬چگونگی استفاده از تابع ()‪ SYSDATETIMEOFFSET‬براي بهدستآوردن تاريخ و زمان فعلی‪ ،‬همراه با‬
‫منطقه زمانی را آموختید‪.‬‬

‫‪SQL Server‬‬ ‫تابع ‪ DATENAME‬در‬


‫تابع ()‪ DATENAME‬يکرشته (نوع ‪ )NVARCHAR‬بازمیگرداند که نشاندهنده يک بخش تاريخ خاص است (يعنی‬
‫سال‪ ،‬ماه و روز يک تاريخ خاص)‪.‬‬

‫کد زير ‪ syntax‬تابع ()‪ DATENAME‬را نشان میدهد‪:‬‬

‫)‪DATENAME(date_part,input_date‬‬
‫تابع ()‪ DATENAME‬دو آرگومان میپذيرد‪:‬‬
‫‪ Date_part‬بخشی از تاريخ است که میخواهید بازگشت داده شود‪ .‬جدول زير تمام مقادير بخش تاريخ معتبر‬ ‫‪o‬‬

‫را لیست کرده است‪.‬‬


‫يک تاريخ لفظی يا يک عبارت است که میتوانیم آن را به يک مقدار ‪،DATETIME2‬‬ ‫‪Input_date o‬‬

‫‪ TIME ،DATE ،SMALLDATETIME ،DATETIME‬يا ‪ DATETIMEOFFSET‬تبديل کنیم‪.‬‬

‫اختصارات‬ ‫‪Date_Part‬‬

‫‪yy, yyyy‬‬ ‫سال‬


‫‪qq, q‬‬ ‫ربع سال‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪172‬‬


‫‪mm, m‬‬ ‫ماه‬
‫‪dy, y‬‬ ‫روز از سال‬
‫‪dd, d‬‬ ‫روز‬
‫‪wk, ww‬‬ ‫هفته‬
‫‪dw‬‬ ‫روز از هفته‬
‫‪hh‬‬ ‫ساعت‬
‫‪mi, n‬‬ ‫دقیقه‬
‫‪ss, s‬‬ ‫ثانیه‬
‫‪ms‬‬ ‫میلیثانیه‬
‫‪mcs‬‬ ‫میکروثانیه‬
‫‪ns‬‬ ‫نانوثانیه‬
‫‪tz‬‬ ‫‪Tzoffset‬‬
‫‪isowk, isoww‬‬ ‫‪ISO_WEEK‬‬

‫()‪DATEPART‬‬ ‫()‪ DATENAME‬در برابر‬

‫از لحاظ نوع بازگشتی‪ ،‬شبیه به ()‪ DATEPART‬است‪ .‬تابع ()‪ DATENAME‬بخش‬ ‫()‪DATENAME‬‬ ‫توجه کنید که‬
‫‪integer‬‬ ‫بخش تاريخ را بهعنوان يک‬ ‫()‪DATEPART‬‬ ‫تاريخ را بهعنوان يک کاراکتر رشته بازمیگرداند‪ ،‬درحالیکه‬
‫بازمیگرداند‪.‬‬
‫مثال زير را ببینید‪:‬‬

‫‪SELECT‬‬
‫‪DATEPART(year, '2018-05-10') [datepart],‬‬
‫;]‪DATENAME(year, '2018-05-10') [datename‬‬

‫خروجی بهمانند شکل زير خواهد بود‪.‬‬

‫بههرحال‪ ،‬نوعهاي دادهاي آنها همانطور که در مثال زير مشاهده میکنید‪ ،‬متفاوت هستند‪:‬‬

‫‪SELECT‬‬
‫‪DATEPART(year, '2018-05-10') + '1' [datepart],‬‬
‫; ]‪DATENAME(year, '2018-05-10') + '1' [datename‬‬

‫کد زير نتیجه را نشان میدهد‪:‬‬


www.takbook.com

173 ‫ آشنايی باپايگاه داده‬/ 3 ‫فصل‬

،‫ بههرحال‬.‫) میشود‬2018 + 1( 2019 ‫ پس مقدار عبارت برابر با‬،‫ بازمیگرداند‬integer ‫ يک‬DATEPART)( ‫چون تابع‬
‫ بهعنوان يک عملگر تلفیقی عمل میکند و‬+ ‫ عالمت‬،‫ ازاينرو‬،‫ يکرشته کاراکتر بازمیگرداند‬DATENAME)( ‫تابع‬
.‫) است‬2018 + 1 ‫’ (يعنی‬20181‘ ‫نتیجه آن‬

SQL Server ‫ در‬DATENAME)( ‫مثال تابع‬


-02 10:20:30 .1234567 + 08:10' ‫ براي بازگرداندن بخشهاي تاريخ مختلف از‬DATENAME)( ‫اين مثال از تابع‬
:‫' استفاده میکند‬10-2020
DECLARE @dt DATETIME2= '2020-10-02 10:20:30.1234567 +08:10';

SELECT 'year,yyy,yy' date_part,


DATENAME(year, @dt) result
UNION
SELECT 'quarter, qq, q',
DATENAME(quarter, @dt)
UNION
SELECT 'month, mm, m',
DATENAME(month, @dt)
UNION
SELECT 'dayofyear, dy, y',
DATENAME(dayofyear, @dt)
UNION
SELECT 'day, dd, d',
DATENAME(day, @dt)
UNION
SELECT 'week, wk, ww',
DATENAME(week, @dt)
UNION
SELECT 'weekday, dw, w',
DATENAME(week, @dt)
UNION
SELECT 'hour, hh' date_part,
DATENAME(hour, @dt)
UNION
SELECT 'minute, mi,n',
DATENAME(minute, @dt)
UNION
SELECT 'second, ss, s',
DATENAME(second, @dt)
UNION
SELECT 'millisecond, ms',
DATENAME(millisecond, @dt)
UNION
SELECT 'microsecond, mcs',
DATENAME(microsecond, @dt)
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪174‬‬


‫‪UNION‬‬
‫‪SELECT 'nanosecond, ns',‬‬
‫)‪DATENAME(nanosecond, @dt‬‬
‫‪UNION‬‬
‫‪SELECT 'TZoffset, tz',‬‬
‫)‪DATENAME(tz, @dt‬‬
‫‪UNION‬‬
‫‪SELECT 'ISO_WEEK, ISOWK, ISOWW',‬‬
‫;)‪DATENAME(ISO_WEEK, @dt‬‬
‫خروجی بهاينترتیب است‪:‬‬

‫در نتیجه‪ ،‬چگونگی استفاده از تابع ()‪ DATENAME‬براي استخراج يک بخش تاريخ بهعنوان يکرشته کاراکتر از يک‬
‫تاريخ را آموختید‪.‬‬

‫‪SQL Server‬‬ ‫تابع ‪ DATEPART‬در‬


‫تابع ()‪ DATEPART‬يک ‪ integer‬بازمیگرداند که بخشی از يک تاريخ مانند روز‪ ،‬ماه و سال است‪.‬‬

‫کد زير ‪ syntax‬تابع ()‪ DATEPART‬را نشان میدهد‪:‬‬

‫) ‪DATEPART ( date_part , input_date‬‬

‫()‪ DATEPART‬دو آرگومان میگیرد‪:‬‬

‫بخشی از يک تاريخ است که بايد استخراج شود‪( .‬بخشهاي معتبر تاريخ را در جدول زير‬ ‫‪Date_part‬‬ ‫‪o‬‬

‫مشاهده میکنید)‪.‬‬
‫‪www.takbook.com‬‬

‫‪175‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫‪ Input_date‬تاريخی است که از آن بخش تاريخ استخراج میشود‪.‬‬ ‫‪o‬‬

‫اختصارات‬ ‫‪Date_part‬‬
‫‪yy, yyyy‬‬ ‫سال‬
‫‪qq, q‬‬ ‫ربع سال‬
‫‪mm, m‬‬ ‫ماه‬
‫‪dy, y‬‬ ‫روز از سال‬
‫‪dd, d‬‬ ‫روز‬
‫‪wk, ww‬‬ ‫هفته‬
‫‪dw‬‬ ‫روز از هفته‬
‫‪hh‬‬ ‫ساعت‬
‫‪mi, n‬‬ ‫دقیقه‬
‫‪ss, s‬‬ ‫ثانیه‬
‫‪ms‬‬ ‫میلیثانیه‬
‫‪mcs‬‬ ‫میکروثانیه‬
‫‪ns‬‬ ‫نانوثانیه‬
‫‪tz‬‬ ‫‪Tzoffset‬‬
‫‪isowk, isoww‬‬ ‫‪ISO_WEEK‬‬

‫‪SQL Server‬‬ ‫مثالهای ()‪ DATEPART‬در‬


‫اجازه دهید چند مثال براي استفاده از تابع ()‪ DATEPART‬حل کنیم‪.‬‬
‫الف) استفاده از تابع ()‪ DATEPART‬همراه با متغیرها‬

‫اين مثال از تابع ()‪ DATEPART‬براي استخراج بخشهاي مختلف يک مقدار تاريخ ذخیره شده در يک متغیر استفاده‬
‫میکند‪:‬‬

‫;'‪DECLARE @d DATETIME = '2019-01-01 14:30:14‬‬


‫‪SELECT‬‬
‫‪DATEPART(year, @d) year,‬‬
‫‪DATEPART(quarter, @d) quarter,‬‬
‫‪DATEPART(month, @d) month,‬‬
‫‪DATEPART(day, @d) day,‬‬
‫‪DATEPART(hour, @d) hour,‬‬
‫‪DATEPART(minute, @d) minute,‬‬
‫;‪DATEPART(second, @d) second‬‬
‫خروجی بهاينترتیب است‪:‬‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 176

‫)( همراه با ستونهاي جدول‬DATEPART ‫ب) مثال استفاده از تابع‬


:‫میکنیم‬ ‫ براي اين مثال استفاده‬Bikestores ‫ در پايگاهداده‬sales.order_items ‫ و‬sales.orders ‫از جداول‬
‫ ماه و روز استفاده‬،‫ ربع سال‬،‫براي بهدستآوردن نرخ رشد فروش بر اساس سال‬ DATEPART)( ‫مثال زير از تابع‬
.‫میکند‬
SELECT DATEPART(year, shipped_date) [year],
DATEPART(quarter, shipped_date) [quarter],
DATEPART(month, shipped_date) [month],
DATEPART(day, shipped_date) [day],
SUM(quantity * list_price) gross_sales
FROM sales.orders o
INNER JOIN sales.order_items i ON i.order_id = o.order_id
WHERE shipped_date IS NOT NULL
GROUP BY DATEPART(year, shipped_date),
DATEPART(quarter, shipped_date),
DATEPART(month, shipped_date),
DATEPART(day, shipped_date)
ORDER BY [year] DESC,
[quarter],
[month],
[day];

:‫بخشی از خروجی به شکل زير است‬


‫‪www.takbook.com‬‬

‫‪177‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫براي استخراج سال‪ ،‬ربع سال‪ ،‬ماه و روز از مقادير موجود در ستون‬ ‫()‪DATEPART‬‬ ‫در اين مثال‪ ،‬ما از تابع‬
‫‪ shipped_date‬استفاده کرديم‪ .‬در دستور ‪ ،GROUP BY‬ما نرخهاي رشد فروش (‪ )quuantity * list_price‬را با استفاده‬
‫از اين بخشهاي تاريخ جمعآوري کرديم‪.‬‬

‫و‬ ‫‪SELECT ،WHERE ،HAVING ،GROUP BY‬‬ ‫در دستورهاي‬ ‫()‪DATEPART‬‬ ‫توجه کنید که میتوانید از تابع‬
‫‪ ORDER BY‬استفاده کنید‪.‬‬
‫‪SQL Server‬‬ ‫تابع ‪ DAY‬در‬
‫تابع ()‪ DAY‬يک مقدار ‪ integer‬بازمیگرداند که روز يک ماه (از ‪ 1‬تا ‪ )31‬از يک تاريخ مشخص شده را نشان میدهد‪.‬‬

‫کد زير ‪ syntax‬تابع ()‪ DAY‬را نشان میدهد‪:‬‬

‫)‪DAY(input_date‬‬

‫يک آرگومان میگیرد که اين آرگومان میتواند يک تاريخ يا يک عبارت باشد که بهصورت مقدار‬ ‫()‪DAY‬‬ ‫تابع‬
‫‪ TIME ،DATE ،SMALLDATETIME ،DATETIME ،DATETIME2‬يا ‪ DATETIMEOFFSET‬استفاده شود‪.‬‬

‫تابع ()‪ DAY‬مقدار مشابه با تابع ()‪ DATEPART‬که در زير مشاهده میکنید بازمیگرداند‪:‬‬

‫)‪DATEPART(day,input_date‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪178‬‬


‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ DAY‬در‬

‫الف) مثال استفاده از تابع ()‪ DAY‬با يک مقدار تاريخ‬

‫اين مثال از تابع ()‪ DAY‬براي استخراج روز از تاريخ ‘‪ ’01-12-2030‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;]‪DAY('2030-12-01') [DAY‬‬
‫خروجی به اين شکل است‪:‬‬

‫ب) مثال استفاده از تابع ()‪ DAY‬با يک مقدار تاريخ که فقط داراي بخش زمان است‬

‫تابع ()‪ DAY‬در صورتی که تاريخ ورودي شامل فقط بخش زمان باشد‪ ،‬مقدار ‪ 1‬را بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫;]‪DAY('10:20:30') [DAY‬‬

‫کد زير‪ ،‬خروجی را نشان میدهد‪:‬‬

‫پ) مثال استفاده از تابع ()‪ DAY‬با ستونهاي جدول‬

‫از جداول ‪ sales.orders‬و ‪ sales.order_items‬براي مثال استفاده میکنیم‪:‬‬


‫در اين مثال از تابع ()‪ DAY‬براي استخراج داده روز از مقادير موجود در ستون ‪ shipperd_date‬استفاده شده است‪ .‬اين‬
‫و دستور ‪ ،GROUP BY‬نرخهاي رشد فروش را بر اساس روز در فوريه ‪2017‬‬ ‫()‪SUM‬‬ ‫مثال با استفاده از تابع‬
‫بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫‪DAY(shipped_date) [day],‬‬
‫‪SUM(list_price * quantity) gross_sales‬‬
www.takbook.com

179 ‫ آشنايی باپايگاه داده‬/ 3 ‫فصل‬


FROM
sales.orders o
INNER JOIN sales.order_items i ON i.order_id = o.order_id
WHERE
shipped_date IS NOT NULL
AND YEAR(shipped_date) = 2017
AND MONTH(shipped_date) = 2
GROUP BY
DAY(shipped_date)
ORDER BY
[day];
:‫ خروجی را نشان میدهد‬،‫تصوير زير‬

SQL Server ‫ در‬MONTH ‫تابع‬


.‫ بازمیگرداند که نشاندهنده ماه از يک تاريخ مشخص شده است‬integer ‫ يک مقدار‬MONTH)( ‫تابع‬

:‫ را نشان میدهد‬MONTH)( ‫ تابع‬syntax ‫کد زير‬

MONTH(input_date)

،DATETIME2 ‫ يک آرگومان میگیرد که میتواند يک مقدار تاريخ يا يک عبارت باشد که داراي مقدار‬MONTH)( ‫تابع‬
.‫ است‬DATETIMEOFFSET ‫ يا‬TIME ،DATE ،SMALLDATETIME ،DATETIME

:‫ بازمیگرداند‬DATEPART)( ‫ مقدار مشابهی با تابع‬MONTH)( ‫تابع‬

DATEPART(month,input_date)

SQL Server ‫ در‬MONTH)( ‫مثالهاي تابع‬

‫ با يک مقدار تاريخ‬MONTH)( ‫الف) استفاده از تابع‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪180‬‬


‫اين مثال از تابع ()‪ MONTH‬براي استخراج ماه از تاريخ ‘‪ ’01-12-2020‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;]‪MONTH('2020-12-01') [month‬‬
‫خروجی به اين شکل است‪:‬‬

‫ب) استفاده از تابع ()‪ MONTH‬با يک مقدار تاريخ که فقط داراي داده زمان است‬

‫تابع ()‪ MONTH‬در صورتی که مقدار تاريخ شامل فقط بخش زمان باشد‪ ،‬مقدار ‪ 1‬را بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫;]‪MONTH('15:30:20') [month‬‬
‫خروجی بهاينترتیب است‪:‬‬

‫پ) استفاده از تابع ()‪ MONTH‬با ستونهاي جدول‬


‫طبق معمول از جداول ‪ Sales.orders‬و ‪ Sales.order_items‬براي مثال استفاده میکنیم‪.‬‬
‫اين مثال از تابع ()‪ MONTH‬براي استخراج داده ماه از مقادير موجود در ستون ‪ shipped_date‬استفاده میکند‪ .‬نتیجه‬
‫اين مثال‪ ،‬نرخ رشد فروش بر اساس ماه در سال ‪ 2018‬است که با استفاده از تابع ()‪ SUM‬و دستور ‪ GROUP BY‬به‬
‫دست میآيند‪:‬‬

‫‪SELECT MONTH(shipped_date) [month],‬‬


‫‪SUM(list_price * quantity) gross_sales‬‬
‫‪FROM sales.orders o‬‬
‫‪INNER JOIN sales.order_items i ON i.order_id = o.order_id‬‬
‫‪WHERE shipped_date IS NOT NULL‬‬
‫‪AND YEAR(shipped_date) = 2017‬‬
‫)‪GROUP BY MONTH(shipped_date‬‬
‫;]‪ORDER BY [month‬‬
‫تصوير زير‪ ،‬خروجی را نشان میدهد‪:‬‬
‫‪www.takbook.com‬‬

‫‪181‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫‪SQL Server‬‬ ‫تابع ‪ YEAR‬در‬


‫تابع ()‪ YEAR‬يک مقدار ‪ integer‬بازمیگرداند که نشاندهنده سال از يک تاريخ مشخص شده است‪.‬‬
‫کد زير ‪ syntax‬تابع ()‪ YEAR‬را نشان میدهد‪:‬‬

‫)‪YEAR(input_date‬‬

‫تابع ()‪ YEAR‬يک آرگومان میگیرد که میتواند يک مقدار تاريخ يا يک عبارت باشد که داراي مقدار ‪،DATETIME2‬‬
‫‪ TIME ،DATE ،SMALLDATETIME ،DATETIME‬يا ‪ DATETIMEOFFSET‬است‪.‬‬

‫تابع ()‪ YEAR‬مقدار مشابهی با تابع ()‪ DATEPART‬بازمیگرداند‪:‬‬


‫)‪DATEPART(year,input_date‬‬

‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ YEAR‬در‬


‫الف) استفاده از تابع ()‪ YEAR‬با يک مقدار تاريخ‬

‫اين مثال از تابع ()‪ YEAR‬براي استخراج سال از تاريخ ‘‪ ’01-02-2019‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;]‪YEAR('2019-02-01') [year‬‬

‫خروجی به اين شکل است‪:‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪182‬‬

‫ب) استفاده از تابع ()‪ YEAR‬با يک مقدار تاريخ که فقط داراي بخش زمان است‬

‫اگر مقدار داده ورودي فقط داراي داده زمان باشد‪ ،‬تاب ()‪ YEAR‬مقدار ‪ 1900‬را بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫;]‪YEAR('11:05:01') [year‬‬
‫خروجی بهاينترتیب است‪:‬‬

‫پ) استفاده از تابع ()‪ YEAR‬با ستونهاي جدول‬

‫باز هم از جداول ‪ Sales.orders‬و ‪ Sales.order_items‬براي مثال استفاده میکنیم‪.‬‬

‫اين مثال از تابع ()‪ YEAR‬براي استخراج داده سال از مقادير موجود در ستون ‪ shipped_date‬استفاده میکند‪ .‬نتیجه‬
‫اين مثال‪ ،‬نرخ رشد فروش بر اساس سال است که با استفاده از تابع ()‪ SUM‬و دستور ‪ GROUP BY‬به دست میآيند‪:‬‬

‫‪SELECT YEAR(shipped_date) [year],‬‬


‫‪SUM(list_price * quantity) gross_sales‬‬
‫‪FROM sales.orders o‬‬
‫‪INNER JOIN sales.order_items i ON i.order_id = o.order_id‬‬
‫‪WHERE shipped_date IS NOT NULL‬‬
‫)‪GROUP BY YEAR(shipped_date‬‬
‫;]‪order by [year‬‬
‫کد زير‪ ،‬خروجی را نشان میدهد‪:‬‬
‫‪www.takbook.com‬‬

‫‪183‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫‪SQL Server‬‬ ‫تابع ‪ DATEDIFF‬در‬

‫براي محاسبه تفاوت بین دو تاريخ از لحاظ سال‪ ،‬ماه‪ ،‬هفته و غیره از تابع ()‪ DATEDIFF‬استفاده میکنیم‪:‬‬

‫)‪DATEDIFF( date_part , start_date , end_date‬‬

‫تابع ()‪ DATEDIFF‬سه آرگومان میپذيرد‪ date_part ،start_date :‬و ‪.end_date‬‬

‫‪ Date_part‬بخشی از تاريخ (مثالً يک سال‪ ،‬يک ربع سال‪ ،‬يک ماه‪ ،‬يک هفته و غیره) است که میخواهید اختالف‬ ‫‪o‬‬

‫بر اساس آن بین ‪ start_date‬و ‪ end_date‬محاسبه شود‪ .‬میتوانید بخشهاي تاريخ معتبر و قابلقبول را در جدول‬
‫زير مشاهده کنید‪.‬‬

‫تاريخهايی هستند که بايد با هم مقايسه شوند‪ .‬آنها بايد داراي مقاديري از نوع‬ ‫‪end_date‬‬ ‫و‬ ‫‪Start_date‬‬ ‫‪o‬‬

‫‪ DATE ،DATETIME ،DATETIMEOFFSET ،DATETIME2 ،SMALLATETIME‬يا ‪ TIME‬باشند‪.‬‬

‫میدهد‪:‬‬ ‫جدول زير لیستی از مقادير معتبر و قابلقبول براي ‪ date_part‬را نشان‬
‫اختصارات‬ ‫‪Date_part‬‬

‫‪yy, yyyy‬‬ ‫سال‬


‫‪qq, q‬‬ ‫ربع سال‬
‫‪mm, m‬‬ ‫ماه‬
‫‪dy, y‬‬ ‫روز از سال‬
‫‪dd, d‬‬ ‫روز‬
‫‪wk, ww‬‬ ‫هفته‬
‫‪hh‬‬ ‫ساعت‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 184


mi, n ‫دقیقه‬
ss, s ‫ثانیه‬
ms ‫میلیثانیه‬
mcs ‫میکروثانیه‬
ns ‫نانوثانیه‬
end_date ‫و‬ start_date ‫را بازمیگرداند که اين مقدار نشاندهنده تفاوت بین‬ integer ‫يک مقدار‬ DATEDIFF)( ‫تابع‬
.‫ مشخص میشود‬Date_part ‫است که واحد مشخصکننده نوع اين تفاوت توسط‬

،)+2,147,483,647 ‫ الی‬-2,147,483,648 ‫ باشد (يعنی خارج از بازه‬integer ‫اگر نتیجه بهدستآمده خارج از بازه اعداد‬
.‫ استفاده کنید‬DATEDIFF_BIG)( ‫ بايد در عوض از تابع‬،‫ در چنین وضعیتی‬.‫ ارور میدهد‬DATEDIFF)( ‫آنگاه تابع‬
SQL Server ‫ در‬DATEDIFF)( ‫مثالهاي تابع‬

‫ براي مقايسه تفاوتهاي بین دو مقدار تاريخ‬DATEDIFF)( ‫الف) استفاده از تابع‬

‫ استفاده‬،‫ براي مقايسه تفاوت بین دو تاريخ که داراي بخشهاي مختلفی از تاريخ هستند‬DATEDIFF)( ‫اين مثال از تابع‬
:‫میکند‬

DECLARE
@start_dt DATETIME2= '2019-12-31 23:59:59.9999999',
@end_dt DATETIME2= '2020-01-01 00:00:00.0000000';

SELECT
DATEDIFF(year, @start_dt, @end_dt) diff_in_year,
DATEDIFF(quarter, @start_dt, @end_dt) diff_in_quarter,
DATEDIFF(month, @start_dt, @end_dt) diff_in_month,
DATEDIFF(dayofyear, @start_dt, @end_dt) diff_in_dayofyear,
DATEDIFF(day, @start_dt, @end_dt) diff_in_day,
DATEDIFF(week, @start_dt, @end_dt) diff_in_week,
DATEDIFF(hour, @start_dt, @end_dt) diff_in_hour,
DATEDIFF(minute, @start_dt, @end_dt) diff_in_minute,
DATEDIFF(second, @start_dt, @end_dt) diff_in_second,
DATEDIFF(millisecond, @start_dt, @end_dt) diff_in_millisecond;

:‫خروجی به اين شکل است‬

‫ همراه با ستون جدول‬DATEDIFF)( ‫ب) مثال استفاده از تابع‬


‫‪www.takbook.com‬‬

‫‪185‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫مثال زير از تابع ()‪ DATEDIFF‬براي مقايسه تاريخ دريافت درخواستی با تاريخ ارسال (بهروز) استفاده کرده و نتیجهاي‬
‫که بازمیگرداند بیان میکند که آيا سفارش بهموقع تحويل داده شده يا خیر‪.‬‬

‫‪SELECT‬‬
‫‪order_id,‬‬
‫‪required_date,‬‬
‫‪shipped_date,‬‬
‫‪CASE‬‬
‫‪WHEN DATEDIFF(day, required_date, shipped_date) < 0‬‬
‫'‪THEN 'Late‬‬
‫'‪ELSE 'OnTime‬‬
‫‪END shipment‬‬
‫‪FROM‬‬
‫‪sales.orders‬‬
‫‪WHERE‬‬
‫‪shipped_date IS NOT NULL‬‬
‫‪ORDER BY‬‬
‫;‪required_date‬‬
‫خروجی بهاينترتیب است‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ DATEADD‬در‬


‫يک عدد به يک بخش خاص از تاريخ يک مقدار تاريخ ورودي اضافه میکند و مقدار اصالح‬ ‫()‪DATEADD‬‬ ‫تابع‬
‫شده را بازمیگرداند‪.‬‬

‫کد زير ‪ syntax‬تابع ()‪ DATEADD‬را نشان میدهد‪:‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪186‬‬

‫) ‪DATEADD (date_part , value , input_date‬‬

‫تابع ()‪ DATEADD‬سه آرگومان میپذيرد‪:‬‬

‫‪ Date_part‬بخشی از تاريخ است که تابع ()‪ DATEADD‬به آن ‪ value‬اضافه میکند‪ .‬اگر ‪ value‬يک مقدار اعشاري‬ ‫‪o‬‬

‫يا ‪ float‬باشد‪ ،‬آنگاه تابع ()‪ DATEADD‬بخش اعشاري را ناديده میگیرد‪ .‬در چنین وضعیتی‪ ،‬تابع عدد را گرد‬
‫نمیکند‪.‬‬

‫يک تاريخ ورودي يا يک عبارت است که میتواند يک مقدار با نوع ‪،SMALLATETIME‬‬ ‫‪Input_date‬‬ ‫‪o‬‬

‫‪ DATE ،DATETIME ،DATETIMEOFFSET ،DATETIME2‬يا ‪ TIME‬باشد‪.‬‬

‫جدول زير مقادير معتبر و قابلقبول ‪ date_part‬را نمايش میدهد‪:‬‬


‫اختصارات‬ ‫‪Date_part‬‬

‫‪yy, yyyy‬‬ ‫سال‬


‫‪qq, q‬‬ ‫ربع سال‬
‫‪mm, m‬‬ ‫ماه‬
‫‪dy, y‬‬ ‫روز از سال‬
‫‪dd, d‬‬ ‫روز‬
‫‪wk, ww‬‬ ‫هفته‬
‫‪hh‬‬ ‫ساعت‬
‫‪mi, n‬‬ ‫دقیقه‬
‫‪ss, s‬‬ ‫ثانیه‬
‫‪ms‬‬ ‫میلیثانیه‬
‫‪mcs‬‬ ‫میکروثانیه‬
‫‪ns‬‬ ‫نانوثانیه‬
‫تابع ()‪ DATEADD‬بعد از اضافهکردن ‪ value‬به ‪ ،date_part‬يک مقدار تاريخ جديد را بازمیگرداند‪.‬‬
‫‪SQL Server‬‬ ‫مثالهای تابع ()‪ DATEADD‬در‬

‫اضافهکردن ‪ 1‬ثانیه به ‪2018-12-31 23:59:59‬‬

‫‪SELECT‬‬
www.takbook.com

187 ‫ آشنايی باپايگاه داده‬/ 3 ‫فصل‬


DATEADD(second, 1, '2018-12-31 23:59:59') result;
:‫خروجی به اين شکل است‬

2018-12-31 00:00:00 s‫ روز به‬1 ‫اضافهکردن‬


SELECT
DATEADD(day, 1, '2018-12-31 23:59:59') result;

:‫خروجی‬

:‫ استفاده میکند‬،‫ براي محاسبه تاريخ ارسال تخمینی بر اساس تاريخ سفارش‬DATEADD)( ‫اين مثال از تابع‬

SELECT
order_id,
customer_id,
order_date,
DATEADD(day, 2, order_date) estimated_shipped_date
FROM
sales.orders
WHERE
shipped_date IS NULL
ORDER BY
estimated_shipped_date DESC;

:‫ بخشی از خروجی را نمايش میدهد‬،‫تصوير زير‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪188‬‬

‫مثالهای کار با ماه‬


‫اگر يک رقم ماه به يک تاريخ اضافه کنید و مقدار روز تاريخ بهدستآمده وجود نداشته باشد‪ ،‬آنگاه تابع ()‪DATEADD‬‬

‫آخرين روز ماه بازگشتی را بازمیگرداند‪.‬‬

‫به مثال زير توجه کنید‪:‬‬

‫‪SELECT‬‬
‫;‪DATEADD(month, 4, '2019-05-31') AS result‬‬

‫در اين مثال‪ ،‬مقدار ماه از تاريخ بازگشتی‪ ،‬ماه سپتامبر است‪ .‬بههرحال‪ ،‬روز ‪ 31‬در ماه سپتامبر وجود ندارد‪ ،‬ازاينرو‪،‬‬
‫تابع ()‪ DATEADD‬آخرين روز ماه سپتامبر (يعنی ‪ )30‬را بهعنوان مقدار روز براي تاريخ بازگشتی نمايش میدهد‪:‬‬

‫توجه کنید که ‪ query‬زير نیز همان نتیجه باال را بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫;‪DATEADD(month,4,'2019-05-30') AS result‬‬

‫خروجی‪:‬‬
‫‪www.takbook.com‬‬

‫‪189‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫‪SQL Server‬‬ ‫تابع ‪ EOMONTH‬در‬

‫تابع ()‪ EOMONTH‬آخرين روز ماه يک تاريخ خاص را همراه با يک ‪ offset‬اختیاري‪ ،‬بازمیگرداند‪.‬‬

‫کد زير ‪ syntax‬تابع ()‪ EOMONTH‬را نشان میدهد‪:‬‬

‫;)]‪EOMONTH(start_date [, offset‬‬

‫تابع ()‪ EOMONTH‬دو آرگومان میپذيرد‪:‬‬

‫‪ Start_date‬يک عبارت تاريخ است که مقدار داخل آن نیز يک تاريخ است‪ .‬تابع ()‪ EOMONTH‬آخرين روز‬ ‫‪o‬‬

‫ماه را براي اين تاريخ بازمیگرداند‪.‬‬


‫‪ Offset‬يک ‪ integer‬است که عدد ماههايی که بايد به ‪ Start_date‬اضافه شوند را مشخص میکند‪.‬‬ ‫•‬

‫به ‪ start_date‬يک مقدار غیرمعتبر يا غیرقابلقبول باشد‪ ،‬آنگاه تابع ()‪ EOMONTH‬ارور‬ ‫‪offset‬‬ ‫اگر نتیجه اضافهشدن‬
‫میدهد‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي ()‪ EOMONTH‬در‬

‫الف) استفاده از تابع ()‪ EOMONTH‬براي يک تاريخ‬

‫اين مثال از تابع ()‪ EOMONTH‬براي بازگرداندن آخرين روز ماه براي تاريخ ‪ 2019-02-15‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;‪DATEADD(month,4,'2019-05-30') AS result‬‬

‫خروجی به اين شکل است‪:‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪190‬‬

‫اگر تاريخ يک سال کبیسه را به تابع ()‪ EOMONTH‬بدهید‪ ،‬بازهم مقدار صحیح را بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫;‪EOMONTH('2020-02-09') end_of_month_feb2020‬‬
‫خروجی به اين صورت است‪:‬‬

‫همانطور که بهوضوح در خروجی مشاهده میکنید‪ ،‬آخرين روز ماه فوريه ‪ 2019‬روز ‪29‬ام است‪ ،‬نه ‪28‬ام‪.‬‬
‫ب) استفاده از تابع ()‪ EOMONTH‬براي بهدستآوردن تعداد روزها در يک ماه خاص‬
‫براي بهدستآوردن تعداد روزهاي يک ماه خاص‪ ،‬مراحل زير را انجام دهید‪:‬‬
‫ابتدا‪ ،‬از تابع ()‪ EOMONTH‬براي بهدستآوردن آخرين روز ماه استفاده کنید‪.‬‬
‫سپس‪ ،‬آخرين روز ماه را به تابع ()‪ DAY‬بفرستید‪.‬‬

‫اين مثال تعداد روزهاي ماه فوريه سال ‪ 2018‬را بازمیگرداند‪:‬‬


‫‪SELECT‬‬
‫;‪DAY(EOMONTH('2020-02-09')) days‬‬

‫خروجی به اين شکل است‪:‬‬

‫براي بهدستآوردن تعداد روزها در ماه جاري‪ ،‬میتوانید از کد زير استفاده کنید‪:‬‬

‫‪SELECT‬‬
‫‪www.takbook.com‬‬

‫‪191‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫;)))(‪DAY(EOMONTH(GETDATE‬‬

‫‪offset‬‬ ‫پ) مثال استفاده از تابع ()‪ EOMONTH‬با يک‬

‫مثال زير از تابع ()‪ EOMONTH‬همراه با يک ‪ offset‬دوماهه استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;‪EOMONTH('2019-02-15', 2) eomonth_next_2_months‬‬

‫خروجی به شکل زير است‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ SWITCHOFFSET‬در‬


‫تابع ()‪ SWITCHOFFSET‬يک ‪ DATETIMEOFFSET‬که از ‪ offset‬منطقه زمانی ذخیره شده به يک ‪ offset‬منطقه زمانی‬
‫جديد تغییريافته است را بازمیگرداند‪.‬‬

‫کد زير ‪ syntax‬تابع ()‪ SWITCHOFFSET‬را نشان میدهد‪:‬‬

‫) ‪SWITCHOFFSET(expression, time_zone‬‬

‫تابع ()‪ SWITCHOFFSET‬دو آرگومان میپذيرد‪:‬‬


‫‪ Expression‬يک عبارت است که میتواند يک مقدار ‪ DATETIMEOFFSET‬باشد‪.‬‬ ‫‪o‬‬

‫‪ Time_zone‬میتوانید يکرشته کاراکتر به فرمت ‪ }+|-{TZH:TZM‬يا يک ‪ integer‬عالمتدار از دقیقهها باش‪.‬‬ ‫‪o‬‬

‫براي مثال‪ time_zone ،‬میتواند به شکل ‪ -07:00,+08:00‬يا ‪ 120‬باشد‪.‬‬


www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 192


DATETIMEOFFSET ‫ يک تابع بسیار مفید و کارآمد براي بهروزرسانی مقادير در يک ستون‬SWITCHOFFSET)( ‫تابع‬

.‫است‬
SQL Server ‫ در‬SWITCHOFFSET)( ‫مثال تابع‬
:‫ باشد‬DATETIMEOFFSET ‫ يک جدول جديد ايجاد میکنیم که داراي ستون‬،‫ابتدا‬

CREATE TABLE dbo.switchoffset_demo(


dtz DATETIMEOFFSET
);

:‫ جديد به جدول اضافه میکنیم‬DATETIMEOFFSET ‫ يک مقدار‬،‫دوم‬

INSERT INTO dbo.switchoffset_demo


VALUES('2019-03-06 9:20:00 +07:00');
:‫ مینويسیم‬query ‫ يک‬dbo.switchoffset_demo ‫ براي بهدستآوردن مقدار جدول‬،‫سوم‬
SELECT
dtz
FROM
dbo.switchoffset_demo;
:‫خروجی به اين شکل است‬

:‫ استفاده میکنیم‬-08:00 ‫ براي تغییر منطقه زمانی به‬SWITCHOFFSET)( ‫ از تابع‬،‫چهارم‬

SELECT
SWITCHOFFSET(dtz, '-08:00') result
FROM
dbo.switchoffset_demo;

:‫خروجی بهاينترتیب میشود‬


‫‪www.takbook.com‬‬

‫‪193‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪SQL Server‬‬ ‫تابع ‪ TODATETIMEOFFSET‬در‬
‫تابع ()‪ TODATETIMEOFFSET‬يک مقدار ‪ DATETIME2‬را به يک مقدار ‪ DATETIMEOFFSET‬ترجمه میکند‪.‬‬
‫کد زير ‪ syntax‬تابع ()‪ TODATETIMEOFFSET‬را نشان میدهد‪:‬‬

‫)‪TODATETIMEOFFSET(expression,time_zone‬‬

‫تابع ()‪ TODATETIMEOFFSET‬دو آرگومان میپذيرد‪:‬‬


‫‪ Expression‬يک عبارت است که میتواند به مقدار ‪ DATETIME2‬باشد‪.‬‬ ‫‪o‬‬

‫‪ time_zone‬يک ‪offset‬‬ ‫‪ Time_zone‬میتوانید يک ‪ integer‬يا ‪ string‬باشد‪ .‬اگر از يک ‪ integer‬استفاده کنید‪ ،‬آنگاه‬ ‫‪o‬‬

‫منطقه زمانی به دقیقه میباشد‪ .‬در غیر اين صورت‪ ،‬يک ساعت يا دقیقه به فرم ‘‪ ’+TZH:THM‬يا ‘‪-TZH:THM‬‬
‫’ است که در آن ‪ TZH‬ساعت و ‪ THM‬دقیقه است‪ .‬بازه ساعت از ‪ -14‬تا ‪ +14‬است‪.‬‬

‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ TODATETIMEOFFSET‬در‬


‫الف) مثال استفاده از تابع ()‪ TODATETIMEOFFSET‬براي تغییر ‪ offset‬محدوده زمانی يک تاريخ و زمان‬
‫اين مثال‪ offset ،‬منطقه يک تاريخ و زمان را به منطقه ‪ -08:00‬تغییر میدهد‪.‬‬

‫‪SELECT‬‬
‫( ‪TODATETIMEOFFSET‬‬
‫‪'2019-03-06 07:43:58',‬‬
‫'‪'-08:00‬‬
‫;‪) result‬‬
‫خروجی بهاينترتیب است‪:‬‬

‫ب) مثال استفاده از تابع ()‪ TODATETIMEOFFSET‬براي تغییر ‪ offset‬محدوده زمانی به دقیقه‬
‫اين مثال‪ ،‬محدوده زمانی فعلی را به ‪ -180‬دقیقه تغییر میدهد‪:‬‬

‫‪SELECT‬‬
‫;‪TODATETIMEOFFSET (GETDATE(), -180) result‬‬
‫خروجی به اين شکل است‪:‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪194‬‬

‫پ) مثال استفاده از تابع ()‪ TODATETIMEOFFSET‬براي اضافهکردن يک ‪ offset‬منطقه زمانی ساعت به تاريخ و زمان‬
‫فعلی‬

‫مثال زير يک ‪ offset‬منطقه زمانی ‪ 12‬ساعته را به تاريخ و زمان ’‪ ’2019-03-06 09:55:00‬اضافه میکند‪:‬‬

‫‪SELECT‬‬
‫( ‪TODATETIMEOFFSET‬‬
‫‪'2019-03-06 09:55:00',‬‬
‫)'‪'+13:00‬‬
‫;‪result‬‬
‫خروجی بهاينترتیب است‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ DATEFROMPARTS‬در‬


‫تابع ()‪ DATEFROMPARTS‬يک مقدار ‪ DATE‬بازمیگرداند که متناظر با مقادير سال‪ ،‬ماه و روز است‪.‬‬
‫کد زير‪ syntax ،‬تابع ()‪ DATEFROMPARTS‬را نمايش میدهد‪:‬‬

‫)‪DATEFROMPARTS(year, month, day‬‬

‫تابع ()‪ DATEFROMPARTS‬سه آرگومان میپذيرد‪:‬‬

‫‪ Year‬يک عبارت ‪ integer‬است که از نوع سال است‪.‬‬ ‫•‬

‫‪ Month‬يک عبارت ‪ integer‬است که مقدار آن يک ماه از بازه ‪ 1‬تا ‪ 12‬است‪.‬‬ ‫•‬

‫‪ Day‬يک عبارت ‪ integer‬است که يک روز را از بازه ‪ 1‬تا ‪ 31‬مشخص میکند‪.‬‬ ‫•‬


‫‪www.takbook.com‬‬

‫‪195‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫باشند‪ ،‬تابع مقدار‬ ‫‪NULL‬‬ ‫بازمیگرداند‪ .‬اگر هرکدام از آرگومانها‬ ‫‪DATE‬‬ ‫يک مقدار‬ ‫()‪DATEFROMPARTS‬‬ ‫تابع‬
‫‪ NULL‬بازمیگرداند‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ DATEFROMPARTS‬در‬

‫الف) مثال استفاده از تابع ()‪ DATEFROMPARTS‬براي بازگرداندن يک تاريخ‬

‫اين مثال از تابع ()‪ DATEFROMPARTS‬براي ساخت يک تاريخ متشکل از مقادير سال‪ ،‬ماه و روز استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;‪DATEFROMPARTS(2020,12,31) a_date‬‬

‫خروجی به اين شکل است‪:‬‬

‫‪NULL‬‬ ‫ب) مثال استفاده از تابع ()‪ DATEFROMPARTS‬همراه با مقدار‬


‫مثال زير مقدار ‪ NULL‬بازمیگرداند‪ ،‬چون آرگومان ماه برابر با ‪ NULL‬است‪:‬‬

‫‪SELECT‬‬
‫;‪DATEFROMPARTS(2020,null,31) a_date‬‬
‫خروجی به اين صورت است‪:‬‬

‫پ) مثال استفاده از تابع ()‪ DATEFROMPARTS‬همراه با آرگومانهاي خارج از بازه‬

‫اين مثال آرگومانهاي غیرمعتبر و غیرقابلقبول را به تابع ()‪ DATEFROMPARTS‬ارسال میکند که در نتیجه سیستم‬
‫ارور میدهد‪:‬‬

‫‪SELECT‬‬
‫;‪DATEFROMPARTS(2020,20,-1) a_date‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪196‬‬


‫خط زير‪ ،‬پیغام ارور را نشان میدهد‪:‬‬

‫از بخشهاي سال‪ ،‬ماه و روز با استفاده از تابع‬ ‫‪DATE‬‬ ‫به اين شکل‪ ،‬چگونگی ساخت يک مقدار‬
‫()‪ DATEFROMPARTS‬را آموختید‪.‬‬
‫‪SQL Server‬‬ ‫تابع ‪ DATETIME2FROMPARTS‬در‬

‫تابع ()‪ DATETIME2FROMPARTS‬يک مقدار تاريخ بازمیگرداند که از مقادير سال‪ ،‬ماه‪ ،‬روز‪ ،‬ساعت‪ ،‬دقیقه‪ ،‬ثانیه‪،‬‬
‫اعشار و دقت است‪ .‬در واقع اين تابع يک مقدار ‪ DATETIME2‬ايجاد میکند‪.‬‬
‫کد زير‪ syntax ،‬تابع ()‪ DATETIME2FROMPARTS‬را نشان میدهد‪:‬‬

‫)‪DATETIME2FROMPARTS (year, month, day, hour, minute, seconds, fractions, precision‬‬

‫تابع ()‪ DATETIME2FROMPARTS‬هشت آرگومان میپذيرد‪:‬‬

‫‪ Year‬يک عبارت ‪ integer‬است که از نوع سال است‪.‬‬ ‫•‬

‫‪ Month‬يک عبارت ‪ integer‬است که از نوع ماه و در بازه ‪ 1‬تا ‪ 12‬است‪.‬‬ ‫•‬

‫‪ Day‬يک عبارت ‪ integer‬است که يک روز از بازه ‪ 1‬تا ‪ 31‬را مشخص میکند‪.‬‬ ‫•‬

‫‪ Hour‬يک عبارت ‪ integer‬است که ساعت را مشخص میکند‪.‬‬ ‫•‬

‫‪ Minute‬يک عبارت ‪ integer‬است که دقیقه را مشخص میکند‪.‬‬ ‫•‬

‫‪ Seconds‬يک عبارت ‪ integer‬است که ثانیهها را مشخص میکند‪.‬‬ ‫‪o‬‬

‫‪ Fractions‬يک عبارت ‪ integer‬است که اعداد قسمت اعشار را نمايش میدهد‪.‬‬ ‫‪o‬‬

‫‪ Precision‬يک عبارت ‪ integer‬است که دقت مقدار ‪ DATETIME2‬را مشخص میکند‪.‬‬ ‫‪o‬‬

‫تابع ()‪ DATETIME2FROMPARTS‬يک مقدار از نوع ‪ DATETIME2‬بازمیگرداند‪ .‬اگر هرکدام از آرگومانهاي باال‬
‫‪ NULL‬باشند‪ ،‬تابع مقدار ‪ NULL‬را بازمیگرداند‪.‬‬
‫اگر يک آرگومان داراي يک مقدار غیرمعتبر باشد‪ ،‬تابع ()‪ DATETIME2FROMPARTS‬خطا میدهد‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ DATETIME2FROMPARTS‬در‬

‫‪DATETIME2‬‬ ‫الف) مثال استفاده از تابع ()‪ DATETIME2FROMPARTS‬براي بازگرداندن يک‬


‫‪www.takbook.com‬‬

‫‪197‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫مثال زير از تابع ()‪ DATETIME2FROMPARTS‬براي ساخت يک ‪ DATETIME2‬متشکل از سال‪ ،‬ماه‪ ،‬روز‪ ،‬ساعت‪،‬‬
‫دقیق‪ ،‬ثانیه‪ ،‬اعشار و دقت استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;‪DATETIME2FROMPARTS ( 2020, 12, 31, 11, 59, 59, 0, 0 ) result‬‬

‫خروجی بهاينترتیب است‪:‬‬

‫‪NULL‬‬ ‫ب) مثال استفاده از تابع ()‪ DATETIME2FROMPARTS‬همراه با آرگومانهاي‬

‫اين مثال مقدار ‪ NULL‬را بازمیگرداند‪ ،‬چون آرگومان ‪ month‬برابر با ‪ NULL‬است‪:‬‬

‫‪SELECT‬‬
‫;‪DATETIME2FROMPARTS(2020, NULL, 31, 11, 59, 59, 0, 0) result‬‬

‫خروجی به اين شکل است‪:‬‬

‫پ) مثال استفاده از تابع ()‪ DATETIME2FROMPARTS‬با مقادير غیر معتبر در آرگومانها‬

‫مثال زير آرگومانهاي غیر معتبر را به تابع ()‪ DATETIME2FROMPARTS‬ارسال میکند که در نتیجه سیستم ارور‬
‫میدهد‪:‬‬
‫‪SELECT‬‬
‫;‪DATETIME2FROMPARTS(2020, 13, 31, 11, 59, 59, 0, 0) result‬‬

‫پیغام ارور به اين صورت است‪:‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪198‬‬

‫از‬ ‫‪DATETIME2‬‬ ‫براي ساخت يک مقدار‬ ‫()‪DATETIME2FROMPARTS‬‬ ‫بهاينترتیب‪ ،‬چگونگی استفاده از تابع‬
‫اجزاي تشکیلدهنده آن يعنی سال‪ ،‬ماه‪ ،‬روز‪ ،‬ساعت‪ ،‬دقیقه‪ ،‬ثانیه‪ ،‬اعشار و دقت را آموختید‪.‬‬

‫‪ 3-1-12-3‬توابع رشتهاي‬
‫در جدول زير توابع رشتهاي در ‪ SQL Server‬را مشاهده میکنید که روي يکرشته ورودي عمل میکنند و يک مقدار‬
‫رشته يا عددي بازمیگردانند‪:‬‬
‫توضیح‬ ‫تابع‬
‫بازمیگرداند‪.‬‬ ‫مقدار کد ‪ ASCII‬يک کاراکتر را‬ ‫‪ASCII‬‬

‫میکند‪.‬‬ ‫يک مقدار ‪ ASCII‬را به يک کاراکتر تبديل‬ ‫‪CHAR‬‬

‫درون يکرشته که از يک موقعیت خاص شروع میشود به دنبال يک‬ ‫‪CHATINDEX‬‬

‫بازمیگرداند‪.‬‬ ‫زيررشته میگردد و موقعیت زيررشته را‬


‫میکند‪.‬‬ ‫دو يا تعداد بیشتري رشته را به يکرشته تبديل‬ ‫‪CONCAT‬‬

‫چندين رشته را با يک عالمت مجزا کننده‪ ،‬به يکرشته واحد تبديل‬ ‫‪CONCAT_WS‬‬

‫میکند‪.‬‬

‫میکند‪.‬‬ ‫مقادير ‪ ()SOUNDEX‬از دو رشته را با هم مقايسه‬ ‫‪DEFFERENCE‬‬

‫يک مقدار فرمت شده با يک فرمت خاص و رفتار (اختیاري) را‬ ‫‪FORMAT‬‬

‫بازمیگرداند‪.‬‬

‫تعداد مشخص شدهاي کاراکتر را از يکرشته کاراکتر که از سمت چپ‬ ‫‪LEFT‬‬

‫میکند‪.‬‬ ‫آغاز میشوند‪ ،‬استخراج‬


‫بازمیگرداند‪.‬‬ ‫تعدادي کاراکتر را از يکرشته کاراکتر‬ ‫‪LEN‬‬

‫میکند‪.‬‬ ‫کاراکترهاي يکرشته را به حروف کوچک تبديل‬ ‫‪LOWER‬‬

‫يکرشته جديد از يکرشته مشخص شده را پس از حذف جاهاي خالی‬ ‫‪LTRIM‬‬

‫بازمیگرداند‪.‬‬

‫کاراکتر ‪ Unicode‬با کد ‪ integer‬مشخص شده را بازمیگرداند‪ ،‬همانطور‬ ‫‪NCHAR‬‬

‫است‪.‬‬ ‫که توسط استاندارد ‪ UNICODE‬تعريف شده‬


‫بازمیگرداند‪.‬‬ ‫موقعیت آغازين اولین وقوع الگو در يکرشته را‬ ‫‪PATINDEX‬‬
‫‪www.takbook.com‬‬

‫‪199‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫همراه با فاصله دهنده را بازمیگرداند تا رشته‬ ‫‪UNICODE‬‬ ‫يکرشته‬ ‫‪QUOTENAME‬‬

‫کند‪.‬‬ ‫ورودي را تبديل به يک شناساگر داراي فاصله معتبر تبديل‬


‫تمام وقوعهاي يک زيررشته را درون يکرشته‪ ،‬با يک زيررشته ديگر‬ ‫‪REPLACE‬‬

‫میکند‪.‬‬ ‫جايگزين‬
‫بازمیگرداند‪.‬‬ ‫يکرشته که به تعداد دفعات خاصی تکرار شده است را‬ ‫‪REPLICATE‬‬

‫بازمیگرداند‪.‬‬ ‫ترتیب برعکس يکرشته کاراکتر را‬ ‫‪REVERSE‬‬

‫تعداد خاصی از کاراکترها را از يکرشته کاراکتر که از سمت راست‬ ‫‪RIGHT‬‬

‫بازمیگرداند‪.‬‬ ‫شروع میشود‪،‬‬


‫يکرشته جديد از يکرشته مشخص شده را پس از حذف تمام جاهاي‬ ‫‪RTRIM‬‬

‫بازمیگرداند‪.‬‬ ‫خالی‪،‬‬
‫يک کد( يا )‪ SOUNDEX‬چهار کاراکتري از يکرشته را بر اساس اينکه‬ ‫‪SOUNDEX‬‬

‫بازمیگرداند‪.‬‬ ‫چگونه گفته شده است‪،‬‬


‫بازمیگرداند‪.‬‬ ‫يکرشته‪ ،‬از فضاها يا فاصلههاي تکرارشونده را‬ ‫‪SPACE‬‬

‫دادههاي کاراکتري که از دادههاي عددي تبديل شده است را بازمیگرداند‪.‬‬ ‫‪STR‬‬

‫رديفهاي رشته هاي داراي يک مجزا کننده خاص را به يکرشته جديد‬ ‫‪STRING_AGG‬‬

‫میکند‪.‬‬ ‫متصل‬
‫کاراکترهاي خاصی از يکرشته را رها میکند و يکرشته جديد از‬ ‫‪STRING_ESCAPE‬‬

‫بازمیگرداند‪.‬‬ ‫کاراکترهاي رها شده‬


‫يک تابع با مقدار جدولی که يکرشته را بر اساس يک مجزا کننده‬ ‫‪STRING_SPLIT‬‬

‫میکند‪.‬‬ ‫مشخص شده‪ ،‬بهرديفهاي زيررشته مجزا‬


‫بخشی از يکرشته را حذف میکند و سپس يک زيررشته ديگر را با‬ ‫‪STUFF‬‬

‫میکند‪.‬‬ ‫شروع از يک موقعیت خاص‪ ،‬به رشته اضافه‬


‫يک زيررشته از درون يکرشته که از يک موقعیت خاص آغاز میشود و‬ ‫‪SUBSTRING‬‬

‫میکند‪.‬‬ ‫داراي طول خاصی است‪ ،‬استخراج‬


‫چندين تک کاراکتر را در يک عملیات جايگزين کرده و تکبهتک ترجمه‬ ‫‪TRANSLATE‬‬

‫میکند‪.‬‬

‫يکرشته جديد از يکرشته مشخص شده را پس از حذف تمام جاهاي‬ ‫‪TRIM‬‬

‫بازمیگرداند‪.‬‬ ‫خالی ابتدا و انتها و بین حروف‪،‬‬


‫از يک کاراکتر را بازمیگرداند( همانطور که توسط‬ ‫‪integer‬‬ ‫مقدار‬ ‫‪UNICODE‬‬

‫است‪).‬‬ ‫استاندارد ‪ Unicode‬تعريف شده‬


‫میکند‪.‬‬ ‫يکرشته را به حروف بزرگ تبديل‬ ‫‪UPPER‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪200‬‬


‫همانطور که در جدول باال مشاهده کرديد تعداد توابع زياد هست و سعی میکنیم در اين قسمت بعضی از آنها را‬
‫بررسی کنیم‪.‬‬

‫‪SQL Server‬‬ ‫تابع ‪ ASCII‬در‬

‫تابع ()‪ ASCII‬يک عبارت کاراکتر میپذيرد و مقدار کد ‪ ASCII‬از اولین کاراکتر سمت چپ در يک عبارت کاراکتري‬
‫را بازمیگرداند‪.‬‬

‫کد زير‪ syntax ،‬تابع ()‪ ASCII‬را نشان میدهد‪:‬‬

‫) ‪ASCII ( input_string‬‬

‫‪ Input_string‬میتواند يک کاراکتر حقیقی‪ ،‬يک عبارت رشتهاي کاراکتري يا يک ستون باشد‪ .‬اگر ‪ input_string‬داراي‬
‫بیش از يک کاراکتر باشد‪ ،‬آنگاه تابع مقدار کد ‪ ASCII‬از اولین کاراکتر سمت چپ آن را بازمیگرداند‪.‬‬

‫تبادل اطالعات ( ‪American Standard Code‬‬ ‫همانطور که احتما ًال میدانید‪ ASCII ،‬مخفف کد استاندارد آمريکايی براي‬
‫‪ )for Information Interchange‬است‪ ASCII .‬بهعنوان يک استاندارد رمزگذاري کاراکتر براي رايانههاي مدرن به کار‬
‫میرود‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ ASCII‬در‬

‫مثال زير مقادير کد ‪ ASCII‬از کاراکتر ‪ A‬تا ‪ Z‬را بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫‪ASCII('AB') A,‬‬
‫;‪ASCII('Z') Z‬‬

‫خروجی به اين شکل است‪:‬‬


‫‪www.takbook.com‬‬

‫‪201‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫قطعه کد زير از تابع ()‪ ASCII‬براي تولید ‪ 26‬حرف الفبا استفاده میکند‪:‬‬

‫(‪WITH cte AS‬‬


‫‪SELECT‬‬
‫‪CHAR(ASCII('A')) [char],‬‬
‫]‪1 [count‬‬
‫‪UNION ALL‬‬
‫‪SELECT‬‬
‫‪CHAR(ASCII('A') + cte.count) [char],‬‬
‫]‪cte.count + 1 [count‬‬
‫‪FROM‬‬
‫‪cte‬‬
‫)‬
‫‪SELECT‬‬
‫‪TOP(26) cte.char‬‬
‫‪FROM‬‬
‫;‪cte‬‬
‫خروجی بهاينترتیب است‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ CHAR‬در‬


‫را نشان‬ ‫()‪CHAR‬‬ ‫تابع‬ ‫‪syntax‬‬ ‫را به يک مقدار کاراکتر تبديل میکند‪ .‬کد زير‪،‬‬ ‫‪ASCII‬‬ ‫تابع ()‪ CHAR‬يک مقدار کد‬
‫میدهد‪:‬‬

‫) ‪CHAR ( int_exp‬‬
‫در اين ‪ ،syntax‬کد ‪ inte_expr‬يک عبارت ‪ integer‬است که مقدار آن يک ‪ integer‬است که بازه آن بین ‪ 0‬تا ‪ 255‬است‪.‬‬
‫اگر عبارت ‪ integer‬داراي مقداري باشد که خارج از اين بازه است‪ ،‬آنگاه تابع ()‪ CHAR‬مقدار ‪ NULL‬را بازمیگرداند‪.‬‬

‫تابع ()‪ CHAR‬کاراکتري را بازمیگرداند که نوع داده آن ‪ )1(CHAR‬است‪.‬‬

‫توجه کنید که براي تبديل يک کاراکتر به يک مقدار ‪ ،ASCII‬از تابع ()‪ ASCII‬استفاده میکنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪202‬‬

‫‪SQL Server‬‬ ‫مثال تابع ()‪ CHAR‬در‬


‫مثال زير از تابع ()‪ CHAR‬براي بهدستآوردن کاراکترهاي اعداد ‪ 65‬و ‪ 90‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫‪CHAR(65) char_65,‬‬
‫;‪CHAR(90) char_90‬‬
‫خروجی به اين شکل است‪:‬‬

‫کد زير مقدار ‪ NULL‬را بازمیگرداند‪ ،‬چون مقدار آرگومان خارج از بازه ‪ 0‬تا ‪ 255‬است‪.‬‬

‫‪SELECT‬‬
‫;‪CHAR(1000) out_of_range‬‬
‫کد باال‪ ،‬خروجی زير را نشان میدهد‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ CHARINDEX‬در‬


‫تابع ()‪ CAHRINDEX‬به جستجوي يک زيررشته درون يکرشته که از يک موقعیت خاص شروع میشود‪ ،‬میپردازد‪.‬‬
‫اين تابع موقعیت زيررشته يافته شده در رشته مورد جستجو را بازمیگرداند‪ ،‬يا اگر زيررشته اصالً يافته نشود‪ ،‬مقدار‬
‫صفر را بازمیگرداند‪.‬‬

‫موقعیت آغازين از ‪ 1‬شمرده میشود نه از ‪.0‬‬

‫کد زير‪ syntax ،‬تابع ()‪ CAHRINDEX‬را نشان میدهد‪:‬‬


‫‪www.takbook.com‬‬

‫‪203‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫)]‪CHARINDEX(substring, string [, start_location‬‬

‫در اين ‪:syntax‬‬


‫‪ Substring‬زير رشتهاي است که به دنبال آن هستیم‪ .‬طول آن به ‪ 8000‬کاراکتر محدود است‪.‬‬ ‫‪o‬‬

‫‪ String‬میتواند يکرشته‪ ،‬عبارت يا ستون باشد‪ .‬اين رشتهاي است که جستجو میشود‪.‬‬ ‫•‬

‫‪big‬‬ ‫‪ Start_location‬موقعیتی است که جستجو از آنجا آغاز میشود‪ Start_location .‬میتواند يک ‪ ،integer‬يک‬ ‫▪‬

‫‪ integer‬يا يک عبارت باشد که مقدار آن ممکن است هر نوع دادهاي ديگري باشد‪.‬‬
‫پارامتر ‪ start_location‬اختیاري است‪ .‬اگر آن را مشخص نکنید يا مقدار آن صفر يا يک مقدار منفی باشد‪ ،‬آنگاه‬ ‫•‬

‫جستجو از ابتداي رشته آغاز میشود‪.‬‬

‫توجه کنید که تابع ()‪ CAHRINDEX‬بر اساس نوع قیاس‪ ،‬میتواند هم بهصورت حساس به بزرگی يا کوچکی حروف‬
‫و هم غیرحساس به اين موضوع عمل کند‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ CAHRINDEX‬در‬
‫الف) استفاده از تابع ()‪ CAHRINDEX‬براي انجام يک جستجو‬
‫‘ ‪SQL Server‬‬ ‫مثال زير از تابع ()‪ CAHRINDEX‬براي انجام يک جستجوي ساده براي يافتن رشته ‘‪ ’SQL‬درون رشته‬
‫‪ ’CHARINDEX‬استفاده میکند‪.‬‬

‫‪SELECT‬‬
‫;‪CHARINDEX('SQL', 'SQL Server CHARINDEX') position‬‬

‫خروجی به اين شکل است‪:‬‬

‫ب) استفاده از تابع ()‪ CAHRINDEX‬براي انجام يک جستجوي غیرحساس به بزرگی و کوچکی حروف‬
‫‘ ‪SQL‬‬ ‫کد زير يک جستجوي غیرحساس به بزرگی و کوچکی حروف براي يافتن رشته ‘‪ ’SERVER‬درون رشته‬
‫‪ ’Server CHARINDEX‬را نشان میدهد‪:‬‬

‫‪SELECT‬‬
‫(‪CHARINDEX‬‬
‫‪'SERVER',‬‬
‫'‪'SQL Server CHARINDEX‬‬
‫;‪) position‬‬
‫خروجی بهاينترتیب است‪:‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪204‬‬

‫پ) استفاده از تابع ()‪ CAHRINDEX‬براي انجام يک جستجوي حساس به بزرگی و کوچکی حروف‬

‫‘ ‪SQL Server‬‬ ‫مثال زير‪ ،‬يک جستجوي حساس به بزرگی و کوچکی حروف براي يافتن رشته ‘‪ ’SERVER‬در رشته‬
‫‪ ’CHARINDEX‬را نشان میدهد‪.‬‬

‫‪SELECT‬‬
‫(‪CHARINDEX‬‬
‫‪'SERVER',‬‬
‫'‪'SQL Server CHARINDEX‬‬
‫‪COLLATE Latin1_General_CS_AS‬‬
‫;‪) position‬‬
‫خروجی به اين شکل است‪:‬‬

‫ت) استفاده از تابع ()‪ CAHRINDEX‬براي جستجوي يک زيررشته ناموجود‬


‫مثال زير يک جستجو براي يافتن زيررشته ‘‪ ’needle‬در رشته ‘‪ ’This is a haystack‬را نشان میدهد‪:‬‬

‫;)‪DECLARE @haystack VARCHAR(100‬‬


‫;'‪SELECT @haystack = 'This is a haystack‬‬
‫;)‪SELECT CHARINDEX('needle', @haystack‬‬

‫خروجی به اين شکل است‪:‬‬


‫‪www.takbook.com‬‬

‫‪205‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫ث) استفاده از تابع ()‪ CAHRINDEX‬براي جستجو از يک موقعیت خاص‬

‫‘ ‪This is a my‬‬ ‫اين مثال از پارامتر ‪ start_location‬براي آغاز جستجوي رشته ‘‪ ’is‬از پنجمین و دهمین کاراکتر از رشته‬
‫‪ ’sister‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫‪CHARINDEX('is','This is a my sister',5) start_at_fifth,‬‬
‫;‪CHARINDEX('is','This is a my sister',10) start_at_tenth‬‬

‫خروجی بهاينترتیب است‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ CONCAT‬در‬


‫براي تبديل دو يا تعداد بیشتري رشته به يکرشته‪ ،‬از تابع ()‪ CONCAT‬با ‪ syntax‬زير استفاده میکنیم‪:‬‬

‫; ) ] ‪CONCAT ( input_string1, input_string2 [, input_stringN‬‬

‫تابع ()‪ CONCAT‬دو رشته ورودي با حداکثر ‪ 255‬کاراکتر را میگیرد و آنها را به يکرشته تبديل میکند‪ .‬اين تابع‬
‫حداقل به دو رشته ورودي نیاز دارد‪ .‬اگر يکی از رشتههاي ورودي را وارد نکنید‪ ،‬تابع ()‪ CONCAT‬ارور میدهد‪.‬‬
‫قبل از اينکه آن دو مقدار را با هم ادغام کند‪،‬‬ ‫()‪CONCAT‬‬ ‫اگر مقادير رشتهاي غیر کاراکتري وارد کنید‪ ،‬آنگاه تابع‬
‫بهصورت ضمنی آنها را به رشته تبديل میکند‪.‬‬
‫تابع ()‪ CONCAT‬همچنین مقدار ‪ NULL‬را به يکرشته خالی با نوع (‪ VARCHAR(1‬تبديل میکند‪.‬‬
‫توجه کنید که براي اضافهکردن يک مجزا کننده در طول فرايند ادغام‪ ،‬بايد از تابع ()‪ CONCAT_WS‬استفاده کنید (که‬
‫در قسمت بعدي همین جلسه آن را توضیح خواهیم داد)‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ CONCAT‬در‬

‫الف) استفاده از تابع ()‪ CONCAT‬براي چند رشته‬


‫مثال زير از تابع ()‪ CONCAT‬براي ادغام سه رشته ‪ ،John‬فاصله يا ‪ space‬و ‪ Doe‬استفاده میکند‪:‬‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 206

SELECT
'John' + ' ' + 'Doe' AS full_name;
:‫خروجی به اين شکل است‬

‫ براي ستونهاي جدول‬CONCAT)( ‫ب) استفاده از تابع‬

:‫ استفاده میکند‬Bikestores ‫ از پايگاهداده نمونه‬sales.customers ‫اين مثال از جدول‬

sales.customers ‫جدول‬
Sales.customers ‫از جدول‬ last_name ‫و‬ first_name ‫براي ادغام مقادير در ستونهاي‬ CONCAT)( ‫کد زير از تابع‬
:‫استفاده میکند‬

SELECT
customer_id,
first_name,
last_name,
CONCAT(first_name, ' ', last_name) full_name
FROM
sales.customers
ORDER BY
full_name;

:‫ خروجی را نشان میدهد‬،‫تصوير زير‬


‫‪www.takbook.com‬‬

‫‪207‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫‪NULL‬‬ ‫پ)استفاده از تابع ()‪ CONCAT‬براي مقدار‬


‫مثال زير از تابع ()‪ CONCAT‬براي فرمت کردن آدرسها براي مشتريان استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫(‪CONCAT‬‬
‫‪CHAR(13),‬‬
‫‪CONCAT(first_name,' ',last_name),‬‬
‫‪CHAR(13),‬‬
‫‪phone,‬‬
‫‪CHAR(13),‬‬
‫‪CONCAT(city,' ',state),‬‬
‫‪CHAR(13),‬‬
‫‪zip_code‬‬
‫‪) customer_address‬‬
‫‪FROM‬‬
‫‪sales.customers‬‬
‫‪ORDER BY‬‬
‫‪first_name,‬‬
‫;‪last_name‬‬
‫بخشی از خروجی در فرمت متن به اين شکل است‪:‬‬

‫براي اينکه دقیقتر اين دستور را درک کنید بهمانند شکل زير بر روي صفحه کد کلیک راست کنید و از قسمت‬
‫‪Test‬‬ ‫خروجی را بهصورت‬ ‫‪F5‬‬ ‫را انتخاب کنید و بعد از آن با کلیک بر روي‬ ‫‪Results to Test‬‬ ‫گزينهي‬ ‫‪Results To‬‬

‫مشاهده خواهید کرد‪ ،‬البته میتوانستید از کلیدهاي ترکیبی ‪ Ctrl + T‬و ‪ Ctrl+D‬استفاده کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪208‬‬

‫()‪CONCAT‬‬ ‫همانطور که بهوضوح در خروجی نشانداده شده است‪ ،‬اگر مشتري شمارهتلفن نداشته باشد‪ ،‬آنگاه تابع‬
‫از يک فضاي خالی براي ادغام استفاده میکند‪.‬‬

‫توجه کنید که از تابع ()‪ CHAR‬براي بهدستآوردن کاراکتر خط جديد در اين مثال استفاده کرديم‪.‬‬

‫‪SQL Server‬‬ ‫تابع ‪ CONCAT_WS‬در‬


‫دو يا تعداد بیشتري رشته را با استفاده از يک مجزا کننده‪ ،‬به يکرشته تبديل میکند‪.‬‬ ‫()‪CONCAT_WS‬‬ ‫تابع‬
‫()‪ CONCAT_WS‬يعنی ادغام با مجزا کنند (‪.)concatenate with separator‬‬

‫کد زير‪ syntax ،‬تابع ()‪ CONCAT_WS‬را نشان میدهد‪:‬‬

‫; )]‪CONCAT_WS(separator,input_string1,input_string2,[...input_stringN‬‬

‫در اين ‪:syntax‬‬


‫‪ Separator‬يک عبارت کاراکتر محور است که مقدار آن میتواند از يکی از نوعهاي ‪،NCHAR ،VARCHAR‬‬ ‫•‬

‫‪ CHAR‬يا ‪ NVARCHAR‬باشد‪.‬‬
‫‪ Input_string1‬تا ‪ input_stringN‬عباراتی با هر نوع معتبر هستند‪ .‬تابع ()‪ CONCAT_WS‬قبل از انجام عمل‬ ‫•‬

‫ادغام‪ ،‬بهصورت ضمنی مقاديري که داراي نوع غیر کاراکتري هستند را به نوع کاراکتري تبديل میکند‪.‬‬

‫تابع ()‪ CONCAT_WS‬رشتههاي ورودي را به يکرشته تبديل میکند‪ .‬اين تابع‪ ،‬رشتههاي در حال ادغام را با ‪separator‬‬

‫مشخص شده در اولین آرگومان با هم ادغام میکند‪.‬‬


‫توجه کنید که ()‪ CONCAT_WS‬حداقل به دو رشته ورودي نیاز دارد‪ .‬يعنی اينکه اگر صفر يا فقط يکرشته ورودي‬
‫وارد کنید‪ ،‬تابع ارور میدهد‪.‬‬
‫‪www.takbook.com‬‬

‫‪209‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫همانند يکرشته خالی از نوع ‪ )1(VARCHAR‬برخورد میکند‪ .‬اين تابع‬ ‫‪NULL‬‬ ‫با مقدار‬ ‫()‪CONCAT_WS‬‬ ‫تابع‬
‫همچنین در بین مقادير ‪ NULL‬از مجزا کننده استفاده نمیکند‪.‬‬
‫در نتیجه‪ ،‬تابع ()‪ CONCAT_WS‬میتواند بدون اضافهکردن چیزي‪ ،‬رشتههاي داراي مقادير خالی را به هم متصل کند‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ CONCAT_WS‬در‬
‫الف) استفاده از تابع ()‪ CONCAT_WS‬براي اتصال چند رشته با يک مجزا کننده‬
‫مثال زير از تابع ()‪ CONCAT_WS‬براي تبديل دو رشته به يکرشته استفاده میکند‪ .‬در اين مثال‪ ،‬دو رشته ادغام شده‬
‫با استفاده از يک فضاي خالی يا ‪ Space‬از هم جدا شدهاند‪:‬‬

‫‪SELECT‬‬
‫‪CONCAT_WS(' ', 'John', 'Doe') full_name‬‬
‫خروجی به اين شکل است‪:‬‬

‫ب) استفاده از تابع ()‪ CONCAT_WS‬براي ستونهاي جدول‬

‫‪sales.customers‬‬ ‫کد زير از تابع ()‪ CONCAT_WS‬براي اتصال مقادير ستونهاي ‪ last_name‬و ‪ first_name‬از جدول‬
‫استفاده میکند‪ .‬نام خانوادگی و نام با استفاده از ويرگول و ‪ Space‬از هم جدا شدهاند‪:‬‬

‫‪SELECT‬‬
‫‪first_name,‬‬
‫‪last_name,‬‬
‫‪CONCAT_WS(', ', last_name, first_name) full_name‬‬
‫‪FROM‬‬
‫‪sales.customers‬‬
‫‪ORDER BY‬‬
‫‪first_name,‬‬
‫;‪last_name‬‬
‫تصوير زير‪ ،‬بخشی از خروجی را نشان میدهد‪:‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪210‬‬

‫‪NULL‬‬ ‫پ) استفاده از تابع ()‪ CONCAT_WS‬برای مقدار‬


‫هستند را نشان‬ ‫‪NULL‬‬ ‫براي رشتههاي ورودي که داراي مقادير‬ ‫()‪CONCAT_WS‬‬ ‫کد زير‪ ،‬چگونگی عملکرد تابع‬
‫میدهد‪:‬‬
‫‪SELECT‬‬
‫;)‪CONCAT_WS(',', 1, 2, NULL, NULL, 3‬‬
‫خروجی به اين شکل است‪:‬‬

‫را ناديده میگیرد و هیچ‬ ‫‪NULL‬‬ ‫مقدار‬ ‫()‪CONCAT_WS‬‬ ‫همانطور که بهوضوح در خروجی مشاهده میکنید‪ ،‬تابع‬
‫مجزا کنندهاي بین مقادير ‪ NULL‬اضافه نمیکند‪.‬‬
‫مثال زير دادههاي مشتري را ادغام میکند تا آدرسهاي مشتريان را فرمت کند‪ .‬اگر يک مشتري داراي شمارهتلفن‬
‫نباشد‪ ،‬تابع آن را ناديده میگیرد‪:‬‬

‫‪SELECT‬‬
‫‪CONCAT_WS‬‬
‫(‬
‫‪CHAR(13),‬‬
‫‪CONCAT(first_name, ' ', last_name),‬‬
‫‪phone,‬‬
‫‪CONCAT(city, ' ', state),‬‬
‫‪zip_code,‬‬
‫'‪'---‬‬
‫‪) customer_address‬‬
‫‪FROM‬‬
‫‪www.takbook.com‬‬

‫‪211‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪sales.customers‬‬
‫‪ORDER BY‬‬
‫‪first_name,‬‬
‫;‪last_name‬‬
‫اين تصوير‪ ،‬بخشی از خروجی را نشان میدهد‪:‬‬

‫‪CSV‬‬ ‫ت) استفاده از تابع ()‪ CONCAT_WS‬براي ايجاد فايل‬


‫اين کد از يک ويرگول و عنوان مجزا کننده استفاده میکند و مقادير موجود در ستونهاي ‪ first_name ،last_name‬و‬
‫‪ email‬را با هم ادغام میکند تا يک فايل ‪ CSV‬ايجاد کند‪:‬‬

‫‪SELECT‬‬
‫)‪CONCAT_WS(',', first_name, last_name, email‬‬
‫‪FROM‬‬
‫‪sales.customers‬‬
‫‪ORDER BY‬‬
‫‪first_name,‬‬
‫;‪last_name‬‬
‫بخشی از خروجی به اين شکل است‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ DEFFERENCE‬در‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪212‬‬


‫تابع ()‪ SOUNDEX‬بر اساس اينکه وقتی يکرشته به زبان میآيد چگونه تلفظ میشود‪ ،‬رشته را به کد چهار کاراکتري‬
‫تبديل میکند‪.‬‬
‫براي مثال‪ ،‬هر دو واژههاي ‪ Two‬و ‪ Too‬تلفظ يکسانی دارند‪ ،‬بنابراين بايد داراي مقادير ()‪ SOUNDEX‬مشابه باشند‪:‬‬

‫‪SELECT‬‬
‫‪SOUNDEX('Too') Too,‬‬
‫;‪SOUNDEX('Two') Two‬‬
‫خروجی بهاينترتیب است‪:‬‬

‫تابع ()‪ DEFFERENCE‬يک مقدار ‪ integer‬بازمیگرداند که تفاوت بین مقادير ()‪ SOUNDEX‬دو رشته را میسنجد‪.‬‬
‫کد زير‪ syntax ،‬تابع ()‪ DEFFERENCE‬را نشان میدهد‪:‬‬
‫)‪DIFFERENCE(input_string1, input_string2‬‬
‫نتیجه ()‪ ،DEFFERENCE‬تفاوت بین دو مقدار ()‪ SOUNDEX‬را در مقیاس ‪ 0‬تا ‪ 4‬نشان میدهد‪ .‬مقدار ‪ 0‬يعنی ضعیف‬
‫يا بدون وجود تشابه بین مقادير ()‪ SOUNDEX‬و مقدار ‪ 4‬يعنی مقادير ()‪ SOUNDEX‬بسیار مشابه يا همسان‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ DEFFERENCE‬در‬
‫الف) استفاده از تابع ()‪ DEFFERENCE‬با مقادير ()‪ SOUNDEX‬مشابه‬
‫اين مثال از تابع ()‪ DEFFERENCE‬براي مقايسه مقادير ()‪ SOUNDEX‬از دو رشته ‪ Two‬و ‪ Too‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫‪SOUNDEX('Two') soundex_two,‬‬
‫‪SOUNDEX('Too') soundex_too,‬‬
‫;‪DIFFERENCE('Two', 'Too') similarity‬‬
‫خروجی به اين شکل است‪:‬‬

‫کد زير يک مقال ديگر است که تفاوت موجود در مقادير ()‪ SOUNDEX‬از رشتههاي ‪ John‬و ‪ Johny‬را مقايسه میکند‪:‬‬

‫‪SELECT‬‬
‫‪SOUNDEX('Johny') soundex_johny,‬‬
‫‪SOUNDEX('John') soundex_john,‬‬
‫;‪DIFFERENCE('Johny', 'John') similarity‬‬
‫‪www.takbook.com‬‬

‫‪213‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫خروجی بهاينترتیب است‪:‬‬

‫ب) استفاده از تابع ()‪ DEFFERENCE‬براي مقادير ()‪ SOUNDEX‬مختلف‬


‫در هنگام مقايسه دو رشته که داراي تلفظهاي ضعیف يا غیرمشابه‬ ‫()‪DEFFERENCE‬‬ ‫مثال زير‪ ،‬چگونگی عملکرد‬
‫هستند را نشان میدهد‪:‬‬

‫‪SELECT‬‬
‫‪SOUNDEX('Coffee') soundex_coffee,‬‬
‫‪SOUNDEX('Laptop') soundex_laptop,‬‬
‫;‪DIFFERENCE('Coffee', 'Laptop') similarity‬‬
‫خروجی به اين شکل است‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ LEFT‬در‬

‫تعداد مشخصی کاراکتر را از سمت چپ يکرشته ارائه شده استخراج میکند‪ .‬براي مثال‪ ،‬کد‬ ‫()‪LEFT‬‬ ‫تابع‬
‫)‪ LEFT(‘SQL Server’, 3‬خروجی ‪ SQL‬را نمايش میدهد‪.‬‬

‫‪ Syntax‬تابع ()‪ LEFT‬به اين صورت است‪:‬‬

‫) ‪LEFT ( input_string , number_of_characters‬‬


‫در اين ‪:syntax‬‬
‫‪ Input_string‬میتواند يکرشته‪ ،‬متغیر يا ستون باشد‪ .‬نوع داده نتیجه ‪ input_string‬میتواند هر نوع دادهاي به‬ ‫▪‬

‫جز نوعهاي ‪ TEXT‬يا ‪ NTEXT‬باشد‪ ،‬اين دو نوع بهصورت ضمنی به ‪ VARCHAR‬و ‪ NVARCHAR‬تبديل‬
‫میشوند‪.‬‬
‫‪ Number_of_characters‬يک ‪ integer‬مثبت است که تعداد کاراکترهاي ‪ input_string‬که بازگشت داده میشوند‬ ‫•‬

‫را مشخص میکند‪.‬‬

‫و اگر‬ ‫‪VARCHAR‬‬ ‫يک مقدار‬ ‫()‪LEFT‬‬ ‫باشد‪ ،‬آنگاه تابع‬ ‫‪Unicode‬‬ ‫يک نوع دادهاي کاراکتر غیر‬ ‫‪input_string‬‬ ‫وقتی‬
‫‪ input_string‬يک نوع داده کاراکتر ‪ Unicode‬باشد‪ ،‬يک مقدار ‪ NVARCHAR‬بازمیگرداند‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪214‬‬


‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ LEFT‬در‬
‫الف) استفاده از تابع ()‪ LEFT‬براي يکرشته کاراکتر‬

‫کد زير از تابع ()‪ LEFT‬براي بازگرداندن سه کاراکتر اول از سمت چپ رشته کاراکتر ‪ SQL Server‬را نشان میدهد‪:‬‬

‫;‪SELECT LEFT('SQL Server',3) Result_string‬‬


‫خروجی به اين شکل است‪:‬‬

‫ب) استفاده از تابع ()‪ LEFT‬براي يک ستون جدول‬

‫مثال زير ‪ 7‬کاراکتر اول سمت چپ هر نام محصول در جدول ‪ production.products‬را بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫‪product_name,‬‬
‫‪LEFT(product_name, 7) first_7_characters‬‬
‫‪FROM‬‬
‫‪production.products‬‬
‫‪ORDER BY‬‬
‫;‪product_name‬‬
‫تصوير زير بخشی از خروجی را نشان میدهد‪:‬‬

‫‪GROUP BY‬‬ ‫پ) استفاده از تابع ()‪ LEFT‬براي دستور‬


‫‪www.takbook.com‬‬

‫‪215‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫مثال زير از تابع ()‪ LEFT‬براي بازگرداندن مجموعهاي از حروف اول نام محصول و تعداد هر محصول براي هر حرف‬
‫اول‪ ،‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫‪LEFT(product_name, 1) initial,‬‬
‫‪COUNT(product_name) product_count‬‬
‫‪FROM‬‬
‫‪production.products‬‬
‫‪GROUP BY‬‬
‫)‪left(product_name, 1‬‬
‫‪ORDER BY‬‬
‫;‪initial‬‬
‫خروجی به اين شکل است‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ LEN‬در‬


‫تابع ()‪ LEN‬تعداد کاراکترهاي يکرشته ورودي (به جز فضاهاي خالی بین حروف) را بازمیگرداند‪.‬‬
‫کد زير‪ syntax ،‬تابع ()‪ LEN‬را نشان میدهد‪:‬‬
‫)‪LEN(input_string‬‬

‫در اين ‪ ،syntax‬کد ‪ input_string‬میتواند يکرشته کاراکتر‪ ،‬عبارت رشتهاي يا يک ستون از دادههاي رشتهاي يا دودويی‬
‫باشد‪.‬‬
‫يا‬ ‫()‪VARCHAR(max ،NVARCHART(max‬‬ ‫از نوع داده‬ ‫‪input_string‬‬ ‫مقداري را بازمیگرداند که اگر‬ ‫()‪LEN‬‬ ‫تابع‬
‫(‪ VARBINARY(max‬باشد‪ ،‬نوع داده آن ‪ BIGINT‬است و در غیر اين صورت‪ ،‬نوع آن ‪ INT‬است‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ LEN‬در‬
‫الف) استفاده از تابع ()‪ LEN‬براي يکرشته‬
‫مثال زير از تابع ()‪ LEN‬براي بازگرداندن تعداد کاراکترهاي رشته ‪ SQL Server LEN‬و همین رشته با فضاهاي خالی‬
‫بین حروف استفاده میکند‪.‬‬

‫‪SELECT‬‬
‫‪LEN('SQL Server LEN') length,‬‬
‫‪LEN('SQL Server LEN‬‬ ‫;‪') length_with_trailing_blanks‬‬
‫خروجی به اين شکل است‪:‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪216‬‬

‫همانطور که مشاهده میکنید‪ ،‬تابع ()‪ LEN‬از فضاهاي خالی بین حروف صرفنظر میکند‪.‬‬
‫ب) استفاده از تابع ()‪ LEN‬براي يک ستون‬

‫براي اين مثال از جدول ‪ production.products‬از پايگاهداده نمونه استفاده میکنیم‪.‬‬


‫براي بازگرداندن نام محصول و طول آن استفاده کرده و محصوالت را بر اساس طول نام‬ ‫()‪LEN‬‬ ‫کد زير از تابع‬
‫محصول مرتب میکند‪.‬‬
‫‪SELECT‬‬
‫‪product_name,‬‬
‫‪LEN(product_name) product_name_length‬‬
‫‪FROM‬‬
‫‪production.products‬‬
‫‪ORDER BY‬‬
‫;‪LEN(product_name) DESC‬‬
‫تصوير زير‪ ،‬بخشی از خروجی را نشان میدهد‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ LOWER‬در‬

‫تابع ()‪ LOWER‬يکرشته را به حروف کوچک تبديل میکند‪ .‬کد زير‪ syntax ،‬تابع ()‪ LOWER‬را نشان میدهد‪:‬‬
‫)‪LOWER(input_string‬‬

‫در اين ‪ ،syntax‬کد ‪ input_string‬میتواند يکرشته کاراکتر‪ ،‬متغیر‪ ،‬عبارت رشته کاراکتر يا ستون جدول باشد‪.‬‬
‫‪www.takbook.com‬‬

‫‪217‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫نوع ‪ input_string‬بايد بهصورت ضمنی قابل تبديلشدن به ‪ VARCHAR‬باشد‪ .‬در غیر اين صورت‪ ،‬بايد از تابع ()‪CAST‬‬

‫براي تبديل غیر ضمنی ‪ input_string‬استفاده کنید‪.‬‬


‫تابع ()‪ LOWER‬حروف کوچک ‪ input_string‬را بازمیگرداند‪.‬‬

‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ LOWER‬در‬


‫الف) استفاده از تابع ()‪ LOWER‬براي رشتهها‬
‫اين مثال از تابع ()‪ LOWER‬براي تبديل رشته ‘‪ ’TEST‬به ‘‪ ’test‬استفاده میکند‪:‬‬
‫‪SELECT‬‬
‫;‪LOWER('TEST') result‬‬

‫خروجی به اين شکل است‪:‬‬

‫ب) استفاده از تابع ()‪ LOWER‬براي ستون جدول‬


‫از جدول ‪ customers‬از پايگاهداده ‪ Bikestores‬در اين مثال استفاده میکنیم‪:‬‬
‫کد زير قبل از انجام عمل ادغام‪ ،‬از تابع ()‪ LOWER‬براي تبديل نام و نام خانوادگی مشتريان به حروف کوچک استفاده‬
‫میکند‪:‬‬

‫‪SELECT‬‬
‫‪first_name,‬‬
‫‪last_name,‬‬
‫(‪CONCAT_WS‬‬
‫‪' ',‬‬
‫‪LOWER(first_name),‬‬
‫)‪LOWER(last_name‬‬
‫‪) full_name_lowercase‬‬
‫‪FROM‬‬
‫‪sales.customers‬‬
‫‪ORDER BY‬‬
‫‪first_name,‬‬
‫;‪last_name‬‬
‫تصوير زير بخشی از خروجی را نشان میدهد‪:‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪218‬‬

‫به اين صورت‪ ،‬چگونگی استفاده از تابع ()‪ LOWER‬براي تبديل يکرشته به حروف کوچک را نیز آموختید‪.‬‬

‫‪SQL Server‬‬ ‫تابع ‪ LTRIM‬در‬


‫تابع ()‪ LTRIM‬پس از حذف فضاهاي خالی ابتدا و انتهاي رشته‪ ،‬يکرشته بازمیگرداند‪ .‬کد زير‪ syntax ،‬تابع ()‪LTRIM‬‬

‫را نشان میدهد‪:‬‬


‫)‪LTRIM(input_string‬‬
‫در اين ‪ ،syntax‬رشته ورودي يک عبارت کاراکتري يا دادههاي باينري است‪ .‬اين عبارت میتواند رشته‪ ،‬متغیر يا ستون‬
‫باشد‪.‬‬
‫مقدار ‪ Input_string‬بايد يک مقدار با نوع دادهاي (به جز نوعهاي دادهاي ‪ TEXT ،NTEXT‬و ‪ )IMAGE‬باشد که بتوانیم‬
‫آن را بهصورت ضمنی به ‪ VARCHAR‬تبديل کنیم‪.‬‬
‫در غیر اين صورت‪ ،‬بايد از تابع ()‪ CAST‬براي تبديل غیر ضمنی آن به يکرشته کاراکتر استفاده کنیم‪.‬‬

‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ LTRIM‬در‬


‫الف) استفاده از تابع ()‪ LTRIM‬براي رشتهها‬
‫براي حذف فضاهاي خالی ابتدا و انتهاي رشته ‘‪ ’SQl Server LTRIM function‬استفاده‬ ‫()‪LTRIM‬‬ ‫اين مثال از تابع‬
‫میکند‪:‬‬

‫‪SELECT‬‬
‫'(‪LTRIM‬‬ ‫;‪SQL Server LTRIM Function') result‬‬

‫خروجی بهاينترتیب است‪:‬‬


‫‪www.takbook.com‬‬

‫‪219‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫ب) استفاده از تابع ()‪ LTRIM‬براي حذف فضاهاي خالی‬

‫مثال زير پس از تبديل رشتههاي به چند زيررشته‪ ،‬از تابع ()‪ LTRIM‬براي حذف فضاهاي خالی ابتدا و انتهاي رشته‬
‫استفاده میکند‪:‬‬
‫‪SELECT‬‬
‫‪LTRIM(value) part‬‬
‫‪FROM‬‬
‫;)'‪STRING_SPLIT('Doe, John', ',‬‬
‫خروجی به اين شکل است‪:‬‬

‫توجه کنید که اگر از تابع ()‪ LTRIM‬استفاده نکنید‪ ،‬دومین رديف يک فضاي خالی ابتدا يا انتهاي رشته خواهد داشت‪.‬‬

‫‪ 3-1-12-4‬توابع سیستمی‬
‫توابع سیستمی عبارتاند از‪:‬‬

‫‪ – CAST‬يک مقدار با يک نوع را به يک نوع ديگر ‪( cast‬يعنی تبديل صريح)میکند‪.‬‬ ‫•‬

‫‪ – CONVERT‬يک مقدار با يک نوع را به يک نوع ديگر ‪( convert‬يعنی تبديل ضمنی) میکند‪.‬‬ ‫•‬

‫‪ – CHOOSE‬يکی از دو مقدار را بر اساس نتیجه اولین آرگومان بازمیگرداند‪.‬‬ ‫•‬

‫‪ – ISNULL‬مقدار ‪ NULL‬را با يک مقدار مشخص شده جايگزين میکند‪.‬‬ ‫•‬

‫‪ – ISNUMERIC‬بررسی میکند که آيا يک عبارت از نوع عددي معتبر هست يا نه‪.‬‬ ‫•‬

‫‪ – IIF‬منطق ‪ if-else‬را به يک ‪ query‬اضافه میکند‪.‬‬ ‫•‬

‫‪ – TRY-CAST‬يک مقدار با يک نوع را به يک نوع ديگر ‪ cast‬میکند و اگر ‪ cast‬موفقیتآمیز نبود‪ ،‬مقدار‬ ‫•‬

‫‪ NULL‬بازمیگرداند‪.‬‬
‫‪ – TRY-CONVERT‬يک مقدار با يک نوع را به يک نوع ديگر ‪ convert‬میکند و مقداري را بازمیگرداند که‬ ‫•‬

‫به يک نوع خاص ترجمه شده است‪ .‬اگر ‪ cast‬يا تبديل موفقیتآمیز نباشد‪ ،‬مقدار ‪ NULL‬را بازمیگرداند‪.‬‬
‫‪ – TRY-PARSE‬يکرشته را به يک ‪ date/time‬يا يک عدد تبديل میکند و اگر تبديل موفقیتآمیز نباشد‪،‬‬ ‫•‬

‫مقدار ‪ NULL‬بازمیگرداند‪.‬‬
‫تبديل ‪ Datetime‬به ‪ – string‬چگونگی تبديل يک مقدار ‪ datetime‬به يکرشته با يک فرمت خاص را نشان‬ ‫•‬

‫میدهد‪.‬‬
‫تبديل رشته به ‪ – datetime‬چگونگی تبديل يکرشته به يک مقدار ‪ datetime‬را نشان میدهد‪.‬‬ ‫•‬

‫تبديل ‪ datetime‬به ‪ – date‬يک ‪ Datetime‬را به ‪ date‬تبديل میکند‪.‬‬ ‫•‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪220‬‬


‫‪SQL Server‬‬ ‫تابع ‪ CAST‬در‬
‫به ‪ query‬زير دقت کنید‪:‬‬
‫‪SELECT‬مقدار ‪ 2‬را بازمیگرداند‪:‬‬ ‫;‪1 + '1' AS result‬‬

‫در اين کد‪ SQL Server ،‬بهصورت ضمنی کاراکتر رشته ‘‪ ’1‬را به عدد ‪ 1‬تبديل میکند‪.‬‬

‫وقتی از دو مقدار با نوعهاي دادهاي مختلف استفاده میکنیم‪ SQL Server ،‬سعی میکند قبل از اينکه محاسبه را پردازش‬
‫کند‪ ،‬نوع دادهاي کمتر را به نوع دادهاي بیشتر و باالتر تبديل کند‪ .‬به اين نوع تبديل در ‪ ،SQL Server‬تبديل ضمنی‬
‫گفته میشود‪.‬‬

‫در مقابل تبديلهاي ضمنی‪ ،‬تبديلهاي صريح يا غیر ضمنی را داريم که در آنها تابع ()‪ CAST‬را فراخوانی میکنیم تا‬
‫بهصورت صريح يک مقدار با يک نوع را به يک نوع ديگر تبديل کند‪:‬‬
‫;‪SELECT 1 + CAST(1 AS INT) result‬‬

‫‪ Syntax‬تابع ()‪ CAST‬به اين شکل است‪:‬‬


‫) ] ) ‪CAST ( expression AS target_type [ ( length‬‬

‫در اين ‪:syntax‬‬


‫‪ Expression‬میتواند يکرشته يا يک عبارت معتبر با هر نوعی (که قابل تبديلشدن است) باشد‪.‬‬ ‫•‬

‫‪SQL-‬‬ ‫نوع داده مورد نظر است که میخواهید عبارت به آن تبديل شود‪ .‬اين نوع میتواند‬ ‫‪Target_type‬‬ ‫•‬

‫‪ INT ،BIT ،VARIANT‬و غیره باشد‪ .‬توجه کنید که اين کد نمیتواند يک نوع دادهاي ‪ alias‬باشد‪.‬‬
‫‪ Length‬يک ‪ integer‬اختیاري است که طول نوع دادهاي مورد نظر را مشخص میکند‪ .‬مقدار پیشفرض ‪length‬‬ ‫•‬

‫برابر با ‪ 30‬است‪.‬‬

‫تابع ()‪ CAST‬عبارت تبديل شده به نوع دادهاي مورد نظر را بازمیگرداند‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ CAST‬در‬
‫‪www.takbook.com‬‬

‫‪221‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫الف) استفاده از تابع ()‪ CAST‬براي تبديل يک عدد اعشاري به يک عدد صحیح‬

‫اين مثال از تابع ()‪ CAST‬براي تبديل عدد اعشاري ‪ 5.95‬به يک عدد صحیح استفاده میکند‪:‬‬
‫;‪SELECT CAST(5.95 AS INT) result‬‬
‫خروجی بهاينترتیب است‪:‬‬

‫ب) استفاده از تابع ()‪ CAST‬براي تبديل يک عدد اعشاري به يک عدد اعشاري ديگر با طول متفاوت‬

‫مثال زير از تابع ()‪ CAST‬براي تبديل عدد اعشاري ‪ 5.95‬به يک عدد اعشاري ديگر با صفر عدد اعشار تبديل میکند‪:‬‬

‫;‪SELECT CAST(5.95 AS DEC(3,0)) result‬‬


‫خروجی به اين شکل است‪:‬‬

‫بر اساس قوانین زير‪ ،‬يک‬ ‫‪SQL Server‬‬ ‫وقتی يک مقدار با نوعهاي دادهاي را به حالتهاي مختلف تبديل میکنید‪،‬‬
‫نتیجه کوتاه شده يا يک مقدار گرد شده بازمیگرداند‪:‬‬
‫رفتار‬ ‫به نوع داده‬ ‫از نوع داده‬
‫گرد کردن‬ ‫‪numeric‬‬ ‫‪numeric‬‬

‫کوتاه شدن‬ ‫‪int‬‬ ‫‪numeric‬‬

‫گرد شدن‬ ‫‪Money‬‬ ‫‪Numeric‬‬

‫گرد شدن‬ ‫‪Int‬‬ ‫‪Money‬‬

‫گرد شدن‬ ‫‪Numeric‬‬ ‫‪Money‬‬

‫کوتاه شدن‬ ‫‪Int‬‬ ‫‪Float‬‬

‫گرد شدن‬ ‫‪Numeric‬‬ ‫‪Float‬‬

‫گرد شدن‬ ‫‪Datetime‬‬ ‫‪Float‬‬

‫گرد شدن‬ ‫‪Int‬‬ ‫‪Datetime‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪222‬‬


‫‪datetime‬‬ ‫پ) استفاده از تابع ()‪ CAST‬براي تبديل يکرشته به يک مقدار‬

‫اين مثال از تابع ()‪ CAST‬براي تبديل رشته ‘‪ ’14-03-2019‬به ‪ datetime‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;‪CAST('2019-03-14' AS DATETIME) result‬‬
‫خروجی بهاينترتیب است‪:‬‬

‫ت) استفاده از تابع ()‪ CAST‬با عملگرهاي رياضی‬

‫براي اين مثال از جداول ‪ sales.orders‬و ‪ sales.order_items‬از پايگاهداده ‪ Bikestores‬استفاده میکنیم‪:‬‬


‫کد زير از تابع ()‪ CAST‬براي تبديل فروشهاي ماهیانه در سال ‪ 2017‬به مقادير ‪ integer‬استفاده میکند‪.‬‬

‫‪SELECT‬‬
‫‪MONTH(order_date) month,‬‬
‫‪CAST(SUM(quantity * list_price * (1 - discount)) AS INT) amount‬‬
‫‪FROM sales.orders o‬‬
‫‪INNER JOIN sales.order_items i ON o.order_id = i.order_id‬‬
‫‪WHERE‬‬
‫‪YEAR(order_date) = 2017‬‬
‫‪GROUP BY‬‬
‫)‪MONTH(order_date‬‬
‫‪ORDER BY‬‬
‫;‪month‬‬
‫تصوير زير‪ ،‬خروجی را نشان میدهد‪:‬‬

‫به اين صورت چگونگی استفاده از تابع ()‪ CAST‬براي تبديل يک مقدار با يک نوع به يک نوع ديگر را آموختید‪.‬‬
‫‪SQL Server‬‬ ‫تابع ‪ CONVERT‬در‬
‫‪www.takbook.com‬‬

‫‪223‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫تابع ()‪ CONVERT‬به شما امکان میدهد تا يک مقدار با يک نوع را به يک نوع ديگر تبديل کنید‪.‬‬
‫کد زير‪ syntax ،‬تابع ()‪ CONVERT‬را نشان میدهد‪:‬‬

‫) ] ‪CONVERT ( target_type [ ( length ) ] , expression [ , style‬‬

‫در اين ‪:syntax‬‬

‫نوع دادهاي مورد نظر است که میخواهید عبارت به آن تبديل شود‪ .‬اين نوع میتواند‬ ‫‪Target_type‬‬ ‫•‬

‫‪ INT ،BIT ،SQL_VARIANT‬و غیره باشد‪ .‬توجه کنید که اين کد نمیتواند يک نوع دادهاي ‪ Alias‬باشد‪.‬‬
‫اختیاري است و مقدار‬ ‫‪length‬‬ ‫است که طول نوع دادهاي مورد نظر را مشخص میکند‪.‬‬ ‫‪integer‬‬ ‫يک‬ ‫‪Length‬‬ ‫•‬

‫پیشفرض آن ‪ 30‬است‪.‬‬
‫‪ Expression‬يک عبارت معتبر با هر نوع دادهاي قابل تبديلشدن است‪.‬‬ ‫•‬

‫‪ Style‬يک ‪ integer‬اختیاري است که مشخص میکند تابع ()‪ CONVERT‬چگونه عبارت را ترجمه میکند‪ .‬اگر‬ ‫•‬

‫مقدار ‪ style‬برابر با ‪ NULL‬باشد‪ ،‬تابع ()‪ CONVERT‬مقدار ‪ NULL‬را بازمیگرداند‪.‬‬

‫تابع ()‪ CONVERT‬مقدار ترجمه شده ‪ expression‬به ‪ target_type‬را با يک ‪ style‬مشخص شده بازمیگرداند‪.‬‬

‫خاص و متفاوت است‪ .‬برخالف تابع‬ ‫‪SQL Server‬‬ ‫است‪ .‬بههرحال‪ ،‬براي‬ ‫()‪CAST‬‬ ‫مشابه تابع‬ ‫()‪CONVERT‬‬ ‫تابع‬
‫است که به طور وسیع در بسیاري از محصوالت پايگاه‬ ‫‪ANSI-SQL‬‬ ‫بخشی از توابع‬ ‫()‪CAST‬‬ ‫()‪ ،CONVERT‬تابع‬
‫دادهاي ديگر در دسترس است‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ CONVERT‬در‬

‫‪integer‬‬ ‫الف) استفاده از تابع ()‪ CONVERT‬براي تبديل يک عدد اعشاري به يک‬

‫اين مثال از تابع ()‪ CONVERT‬براي تبديل عدد اعشاري ‪ 9.95‬به يک ‪ integer‬استفاده میکند‪:‬‬

‫;‪SELECT CONVERT(INT, 5.95) result‬‬


‫خروجی به اين شکل است‪:‬‬

‫ب) استفاده از تابع ()‪ CONVERT‬براي تبديل يک عدد اعشاري به يک عدد اعشاري ديگر با طول متفاوت‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪224‬‬

‫اين مثال از تابع ()‪ CONVERT‬براي تبديل عدد اعشاري ‪ 9.95‬به يک عدد اعشاري ديگر با صفر عدد اعشار استفاده‬
‫میکند‪:‬‬
‫;‪SELECT CAST(9.95 AS DEC(2,0)) result‬‬
‫خروجی به اين صورت است‪:‬‬

‫توجه کنید که رفتارهاي گرد کردن و کوتاه کردن تابع ()‪ CONVERT‬دقیقاً مشابه رفتارهاي تابع ()‪ CAST‬است‪.‬‬
‫‪datetime‬‬ ‫پ) استفاده از تابع ()‪ CONVERT‬براي تبديل يکرشته به يک مقدار‬

‫اين مثال از تابع ()‪ CONVERT‬براي تبديل رشته ‘‪ ’2019-03-14‬به يک مقدار ‪ Datetime‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;‪CONVERT(DATETIME, '2019-03-14') result‬‬
‫خروجی به اين صورت است‪:‬‬

‫ت) استفاده از تابع ()‪ CONVERT‬براي تبديل يک مقدار ‪ datetime‬به يکرشته‬

‫اين مثال از تابع ()‪ CONVERT‬براي تبديل تاريخ و زمان فعلی به يکرشته با ‪ style‬مشخص استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫;‪CONVERT(VARCHAR, GETDATE(),13) result‬‬

‫خروجی بهاينترتیب است‪:‬‬


‫‪www.takbook.com‬‬

‫‪225‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫در نتیجه‪ ،‬چگونگی استفاده از تابع ()‪ CONVERT‬براي تبديل يک مقدار با يک نوع دادهاي به يک نوع داده ديگر را‬
‫نیز آموختید‪.‬‬
‫‪SQL Server‬‬ ‫تابع ‪ CHOOSE‬در‬
‫تابع ()‪ CHOOSE‬يک آيتم را از لیست آيتمهاي موجود در يک ‪ index‬مشخص شده بازمیگرداند‪.‬‬
‫کد زير‪ syntax ،‬تابع ()‪ CHOOSE‬را نشان میدهد‪:‬‬

‫) ] ‪CHOOSE ( index, elem_1, elem_2 [, elem_n‬‬

‫در اين ‪:syntax‬‬


‫‪ Index‬يک عبارت ‪ integer‬است که ‪ index‬عنصري که بايد بازگردانده شود را مشخص میکند‪ .‬توجه کنید که‬ ‫•‬

‫‪index‬هاي عناصر بر اساس ‪ 1‬هستند‪.‬‬


‫‪ Elem_1, elem_2, … elem_n‬لیستی از مقادير مجزا شده با ويرگول هستند که هر نوعی میتوانند داشته باشند‪.‬‬ ‫•‬

‫اگر ‪ index‬برابر با ‪ 1‬باشد‪ ،‬تابع ()‪ CHOOSE‬مقدار ‪ elem_1‬را بازمیگرداند‪ .‬اگر ‪ index‬برابر با ‪ 2‬باشد‪ ،‬تابع ()‪CHOOSE‬‬

‫مقدار ‪ elem_2‬را بازمیگرداند و الی آخر‪.‬‬

‫خارج از بازه لیست‬ ‫‪index‬‬ ‫تبديل يا ‪ cast‬میشود‪ .‬درصورتیکه‬ ‫‪integer‬‬ ‫اگر ‪ index‬يک مقدار ‪ integer‬نباشد‪ ،‬به يک‬
‫باشد‪ ،‬تابع ()‪ CHOOSE‬مقدار ‪ NULL‬را بازمیگرداند‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ CHOOSE‬در‬
‫الف) استفاده از تابع ()‪ CHOOSE‬براي مقادير رشته‬
‫اين مثال‪ ،‬دومین آيتم از لیست مقادير را بازمیگرداند‪:‬‬
‫‪SELECT‬‬
‫;‪CHOOSE(2, 'First', 'Second', 'Third') Result‬‬
‫خروجی به اين شکل است‪:‬‬

‫ب) استفاده از تابع ()‪ CHOOSE‬براي ستون جدول‬

‫از‬ ‫‪order_status‬‬ ‫براي بازگرداندن وضعیت سفارش بر اساس مقدار موجود در ستون‬ ‫()‪CHOOSE‬‬ ‫مثال زير از تابع‬
‫جدول ‪ sales.orders‬استفاده میکند‪:‬‬

‫‪SELECT‬‬
‫‪order_id,‬‬
www.takbook.com

SQL Server 2019 ‫آموزش جامع‬ 226


order_date,
CHOOSE(order_status,
'Pending',
'Processing',
'Rejected',
'Completed') AS order_status
FROM
sales.orders
ORDER BY
order_date DESC;
:‫تصوير زير بخشی از خروجی را نشان میدهد‬

MONTH ‫ همراه با تابع‬CHOOSE)( ‫پ) استفاده از تابع‬

‫ استفاده‬،‫براي بازگرداندن فصلهايی که در آنها مشتريان محصول خريداري کردهاند‬ MONTH)( ‫مثال زير از تابع‬
:‫ استفاده میشود تا فصل متناظر بازگردانده شود‬CHOOSE)( ‫ در تابع‬MONTH)( ‫ نتیجه تابع‬.‫میکند‬

SELECT
order_id,
order_date,
customer_id,
CHOOSE(
MONTH(order_date),
'Winter',
'Winter',
'Spring',
'Spring',
'Spring',
'Summer',
'Summer',
'Summer',
'Autumn',
'Autumn',
'Autumn',
'Winter') month
FROM
sales.orders
ORDER BY
customer_id;
‫‪www.takbook.com‬‬

‫‪227‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫تصوير زير بخشی از خروجی را نشان میدهد‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ ISNULL‬در‬

‫تابع ()‪ ،ISNULL‬مقدار ‪ NULL‬را با يک مقدار مشخص شده جايگزين میکند‪ .‬کد زير‪ Syntax ،‬تابع ()‪ ISNULL‬را‬
‫نشان میدهد‪:‬‬

‫)‪ISNULL(expression, replacement‬‬

‫تابع ()‪ ISNULL‬دو آرگومان میپذيرد‪:‬‬

‫‪ Expression‬يک عبارت با هر نوعی است که بررسی میشود که ‪ NULL‬هست يا خیر‪.‬‬ ‫▪‬

‫‪ Replacement‬مقداري است که اگر عبارت ‪ NULL‬باشد بازگردانده میشود‪ Replacement .‬بايد قابل تبديلشدن‬ ‫▪‬

‫به يک مقدار از نوع مقدار موجود در ‪ expression‬باشد‪.‬‬

‫تابع ()‪ ISNULL‬درصورتیکه مقدار ‪ expression‬برابر با ‪ NULL‬باشد‪ ،‬مقدار ‪ replacement‬را بازمیگرداند‪ .‬اگر نوعهاي‬
‫را به نوع‬ ‫‪replacement‬‬ ‫دو آرگومان متفاوت باشند‪ ،‬اين تابع قبل از بازگرداندن يک مقدار‪ ،‬بهصورت ضمنی نوع‬
‫‪ expression‬تبديل میکند‪.‬‬

‫درصورتیکه مقدار ‪ expression‬برابر با ‪ NULL‬نباشد‪ ،‬تابع ()‪ ISNULL‬مقدار ‪ expression‬را بازمیگرداند‪.‬‬


‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ ISNULL‬در‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪228‬‬


‫الف) استفاده از تابع ()‪ ISNULL‬براي دادههاي عددي‬
‫‪NULL‬‬ ‫براي بازگرداندن دومین آرگومان استفاده میکند‪ ،‬چون اولین آرگومان برابر با‬ ‫()‪ISNULL‬‬ ‫مثال زير از تابع‬
‫است‪:‬‬

‫‪SELECT‬‬
‫;‪ISNULL(NULL,20) result‬‬
‫خروجی به اين شکل است‪:‬‬

‫ب) استفاده از تابع ()‪ ISNULL‬براي رشته کاراکتر‬

‫مثال زير از تابع ()‪ ISNULL‬براي بازگرداندن رشته ‘‪ ’Hello‬استفاده میکند‪ ،‬چون اولین آرگومان است و ‪ NULL‬نیست‪:‬‬

‫‪SELECT‬‬
‫;‪ISNULL('Hello', 'Hi') Result‬‬

‫خروجی بهاينترتیب است‪:‬‬

‫پ) استفاده از تابع ()‪ ISNULL‬براي جايگزينی مقادير ‪ NULL‬با مقادير معنادار‬

‫ابتدا‪ ،‬يک جدول جديد به نام ‪ divisions‬ايجاد میکنیم که دستهبنديهاي ورزشکار را بر اساس سن ذخیره میکند‪:‬‬

‫‪CREATE TABLE divisions‬‬


‫(‬
‫‪id‬‬ ‫‪INT‬‬
‫‪PRIMARY KEY IDENTITY,‬‬
‫‪min_age INT DEFAULT 0,‬‬
‫‪max_age INT‬‬
‫;)‬

‫دوم‪ ،‬چند رديف به جدول ‪ divisions‬اضافه میکنیم‪:‬‬

‫)‪INSERT INTO divisions(min_age, max_age‬‬


‫‪VALUES(5,null),‬‬
‫‪(20,null),‬‬
‫;)‪(null,30‬‬

‫سوم‪ ،‬دادهها را از جدول ‪ divisions‬به دست میآوريم‪:‬‬


‫‪www.takbook.com‬‬

‫‪229‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫‪SELECT‬‬
‫‪id,‬‬
‫‪min_age,‬‬
‫‪max_age‬‬
‫‪FROM‬‬
‫;‪divisions‬‬
‫تصوير زير‪ ،‬خروجی را نشان میدهد‪:‬‬

‫اگر يک دستهبندي داراي محدوديت حداقل سن نباشد‪ ،‬پس ستون ‪ min_age‬داراي ‪ NULL‬خواهد بود‪ .‬به طور مشابه‪،‬‬
‫اگر يک دستهبندي نیز به حداکثر سن نداشته باشد‪ ،‬ستون ‪ max_age‬نیز داراي ‪ NULL‬خواهد بود‪.‬‬

‫در آخر‪ ،‬از تابع ()‪ ISNULL‬براي تبديل ‪ NULL‬در ستون ‪ min_age‬به ‪ 0‬و تبديل ‪ NULL‬در ستون ‪ max_age‬به ‪99‬‬
‫استفاده میکنیم‪:‬‬
‫‪SELECT‬‬
‫‪id,‬‬
‫‪ISNULL(min_age,0) min_age,‬‬
‫‪ISNULL(max_age,99) max_age‬‬
‫‪FROM‬‬
‫;‪divisions‬‬
‫تصوير زير‪ ،‬خروجی را نشان میدهد‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ ISNUMERIC‬در‬

‫تابع ()‪ ISNUMERIC‬يک عبارت میپذيرد و اگر عبارت از نوع عددي معتبري باشد‪ ،‬مقدار ‪ 1‬را بازمیگرداند‪ ،‬در غیر‬
‫اين صورت‪ ،‬مقدار ‪ 0‬را بازمیگرداند‪.‬‬

‫کد زير‪ syntax ،‬تابع ()‪ ISNUMERIC‬را نشان میدهد‪:‬‬

‫) ‪ISNUMERIC ( expression‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪230‬‬

‫در اين ‪ ،syntax‬کد ‪ expression‬میتواند هر عبارت معتبري باشد‪.‬‬


‫توجه داشته باشید که يک نوع عددي معتبر‪ ،‬يکی از نوعهاي زير است‪:‬‬
‫‪BIT‬‬ ‫اعداد صحیح‪ BIGINT ،INT ،SMALLINT ،TINYINT :‬و‬
‫‪NUMERIC‬‬ ‫داراي دقت ثابت‪ DECIMAL :‬و‬
‫‪REAL‬‬ ‫تقريبی‪ FLOAT :‬و‬
‫‪SMALLMONEY‬‬ ‫مقادير پولی‪ MONEY :‬و‬

‫تابع ()‪ ISNUMERIC‬در واقع بررسی میکند که آيا يک مقدار میتواند به يک نوع دادهاي عددي تبديل شود يا خیر‪،‬‬
‫و سپس پاسخ صحیح را بازمیگرداند‪ .‬بههرحال‪ ،‬اين تابع به شما نمیگويد که کدام نوع دادهاي‪ ،‬بهخوبی میتواند‬
‫جريان يا ‪ overflow‬را کنترل کند‪.‬‬

‫به همین دلیل از زمان انتشار ‪ SQL Server 2012‬توابع ()‪ ()TRY_CAST ،TRY_PARSE‬و ()‪ TRY_CONVERT‬معرفی‬
‫شدند‪.‬‬
‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ ISNUMERIC‬در‬

‫اين مثال‪ ،‬از تابع ()‪ ISNUMERIC‬استفاده میکند تا بررسی کند که آيا رشته ‘‪ ’$10‬میتواند به يک عدد تبديل شود يا‬
‫خیر‪:‬‬

‫‪SELECT‬‬
‫;‪ISNUMERIC('$10') result‬‬
‫خروجی به اين صورت است‪:‬‬

‫مثال زير بررسی میکند که آيا رشته ‘‪ ’-E-3082.23‬يک عدد هست يا خیر‪:‬‬

‫‪SELECT‬‬
‫;‪ISNUMERIC('-2.23E-308') result‬‬

‫خروجی عبارت است از‪:‬‬


‫‪www.takbook.com‬‬

‫‪231‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬

‫مثال زير مقدار ‪ 0‬را بازمیگرداند که نشاندهنده اين است که رشته ‘‪ ’+ABC‬يک عدد نیست‪:‬‬

‫‪SELECT‬‬
‫;‪ISNUMERIC('+ABC') result‬‬

‫خروجی به اين شکل است‪:‬‬

‫‪SQL Server‬‬ ‫تابع ‪ IIF‬در‬


‫باشد‪ ،‬آنگاه دومین‬ ‫‪true‬‬ ‫سه آرگومان میپذيرد‪ .‬سپس اولین آرگومان را ارزيابی میکند و اگر مقدار آن‬ ‫()‪IIF‬‬ ‫تابع‬
‫آرگومان را بازمیگرداند‪ ،‬در غیر اين صورت‪ ،‬سومین آرگومان را بازمیگرداند‪.‬‬

‫کد زير‪ syntax ،‬تابع ()‪ IIF‬را نشان میدهد‪:‬‬

‫)‪IIF(boolean_expression, true_value, false_value‬‬

‫در اين ‪:syntax‬‬

‫‪ Boolean_expression‬يک عبارت است که بايد ارزيابی شود‪ .‬اين عبارت بايد يک عبارت ‪ boolean‬معتبر باشد‪،‬‬ ‫▪‬

‫در غیر اين صورت تابع ارور میدهد‪.‬‬


‫‪ True_value‬مقداري است که اگر مقدار ‪ boolean_expression‬برابر با ‪ true‬باشد‪ ،‬بازگردانده میشود‪.‬‬ ‫‪o‬‬

‫‪ False_value‬مقداري است که اگر مقدار ‪ boolean_expressiom‬برابر با ‪ false‬باشد‪ ،‬بازگردانده میشود‪.‬‬ ‫‪o‬‬

‫در واقع‪ ،‬تابع ()‪ IIF‬خالصه شده يا ‪ short hand‬يک عبارت ‪ CASE‬است‪:‬‬

‫‪CASE‬‬
‫‪WHEN boolean_expression‬‬
‫‪THEN true_value‬‬
‫‪ELSE‬‬
‫‪false_value‬‬
‫‪END‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش جامع‬ ‫‪232‬‬


‫‪SQL Server‬‬ ‫مثالهاي تابع ()‪ IIF‬در‬

‫الف) استفاده از تابع ()‪ IIF‬براي يکرشته‬

‫اين مثال از تابع ()‪ IIF‬استفاده میکند تا بررسی کند که آيا ‪ 10 > 20‬هست يا نه و رشته ‪ True‬را بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫; ‪IIF(10 < 20, 'True', 'False') Result‬‬
‫خروجی به اين شکل است‪:‬‬

‫ب) استفاده از تابع ()‪ IIF‬براي ستون جدول‬

‫مثال زير تابع ()‪ IIF‬را بهصورت تودرتو درون توابع ()‪ IIF‬به کار میبرد و وضعیت سفارش متناظر را بر اساس تعداد‬
‫سفارش بازمیگرداند‪:‬‬

‫‪SELECT‬‬
‫‪IIF(order_status = 1,'Pending',‬‬
‫‪IIF(order_status=2, 'Processing',‬‬
‫‪IIF(order_status=3, 'Rejected',‬‬
‫)'‪IIF(order_status=4,'Completed','N/A‬‬
‫)‬
‫)‬
‫‪) order_status,‬‬
‫‪COUNT(order_id) order_count‬‬
‫‪FROM‬‬
‫‪sales.orders‬‬
‫‪WHERE‬‬
‫‪YEAR(order_date) = 2018‬‬
‫‪GROUP BY‬‬
‫;‪order_status‬‬
‫تصوير زير‪ ،‬خروجی را نشان میدهد‪:‬‬

‫پ) استفاده از تابع ()‪ IIF‬براي توابع تجمعی‬


‫‪www.takbook.com‬‬

‫‪233‬‬ ‫فصل ‪ / 3‬آشنايی باپايگاه داده‬


‫استفاده میکند تا تعداد سفارشها را بر اساس وضعیت سفارش در سال‬ ‫()‪SUM‬‬ ‫براي تابع‬ ‫()‪IIF‬‬ ‫اين مثال از تابع‬
‫‪ 2018‬به دست آورد‪:‬‬

‫‪SELECT‬‬
‫‪SUM(IIF(order_status = 1,‬‬ ‫‪1,‬‬ ‫))‪0‬‬ ‫‪AS‬‬ ‫‪'Pending',‬‬
‫‪SUM(IIF(order_status = 2,‬‬ ‫‪1,‬‬ ‫))‪0‬‬ ‫‪AS‬‬ ‫‪'Processing',‬‬
‫‪SUM(IIF(order_status = 3,‬‬ ‫‪1,‬‬ ‫))‪0‬‬ ‫‪AS‬‬ ‫‪'Rejected',‬‬
‫‪SUM(IIF(order_status = 4,‬‬ ‫‪1,‬‬ ‫))‪0‬‬ ‫‪AS‬‬ ‫‪'Completed',‬‬
‫‪COUNT(*) AS Total‬‬
‫‪FROM‬‬
‫‪sales.orders‬‬
‫‪WHERE‬‬
‫;‪YEAR(order_date) = 2017‬‬

‫در اين مثال‪ ،‬اگر وضعیت متناظري پیدا شد‪ ،‬تابع ()‪ IIF‬مقدار ‪ 1‬يا ‪ 0‬را بازمیگرداند‪ .‬تابع ()‪ SUM‬تعداد سفارشها را‬
‫براي هر وضعیت بازمیگرداند‪.‬‬
‫خروجی به اين شکل است‪:‬‬
www.takbook.com
‫‪www.takbook.com‬‬

‫فصل چهارم‬
‫‪SQL Server‬‬ ‫امنیت در‬

‫يکی از مهمترين بخشهايی که بايد به آن توجه کرد امنیت در ‪ SQL‬است که اگر درست به آن توجه نکنیم میتواند‬
‫باعث ايجاد مشکالت امنیتی و درز اطالعات مهم سازمان شود‪..‬‬
‫زمانی که يک ديتابیس را ايجاد می کنید‪ ،‬امنیت زيادي نخواهد داشت و اگر روش ايجاد امنیت بر روي ديتابیس را‬
‫ندانید‪ ،‬شايد تمام اطالعت خود را از دست بدهید‪.‬‬
‫‪ 4-1‬روشهاي احراز هويت‬
‫براي اينکه روشهاي احراز هويت در ‪ SQL Server 2019‬را بررسی کنیم بهتر است صفحهي اول نرمافزار ‪ SSMS‬را‬
‫مشاهده کنید که در شکل ‪ 4-1‬مشخص شده است‪.‬‬

‫شکل ‪ 4-1‬احراز هویت‬

‫همانطور که در شکل ‪ 4-1‬مشاهده میکنید احراز هويت ‪ SQL‬از چند قسمت تشکیل شده است که در زير همهي‬
‫آنها را بررسی خواهیم کرد‪:‬‬
‫‪Windows Authentication‬‬
‫يک روش احراز هويت است که در سرويسگیرندههاي ويندوزي تعبیه شده است‪ ،‬اين يک روش پیشفرض است‬
‫اين روش بهصورت پیشفرض اجرا خواهد شد و‬ ‫‪SQL‬‬ ‫که خود ويندوز بر روي آن تأکید میکند‪ ،‬در زمان نصب‬
‫کاربر موردنظر براي ورود به ‪ SQL‬تأيید خواهد شد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪236‬‬


‫اصو ًال سازمانها براي مديريت آسانتر کاربران يک سرويس ‪ Active directory‬در شبکه خود ايجاد میکنند و کاربران‬
‫به اين‬ ‫‪Windows Athentication‬‬ ‫را بهصورت متمرکز در آن تعريف میکنند و بعد میتوان از طريق احراز هويت‬
‫کاربران دسترسی داد‪ ،‬اصو ًال هر کاربر در ويندوز يک شمارهي خاص با نام ‪ SID‬دارد که با بقیه متمايز خواهد بود‪.‬‬

‫‪SQL Server Authentication‬‬


‫اين روش از احراز هويت مختص نرمافزار ‪ SQL‬است و رمز عبور و نام کاربري در داخل ديتابیس نرمافزار تعريف‬
‫میشود‪.‬‬

‫‪ 4-2‬ايجاد کاربر و اعطاي دسترسی به آن‬

‫‪Active‬‬ ‫همانطور که در اوايل کتاب گفتیم‪ ،‬زمانی که سرور ‪ SQL‬را عضو شبکه دامین میکنید‪ ،‬میتوانید از کاربران‬
‫براي دسترسی به ‪ SQL‬استفاده کنید و مجوز هاي الزم را براي آن در نظر بگیريد‪ ،‬اما اگر بخواهید کاربر‬ ‫‪Directory‬‬

‫محلی در ‪ SQL‬ايجاد کنید بايد بهمانند شکل ‪ 4-2‬اين کار را انجام دهید‪:‬‬

‫شکل ‪ 4-2‬ایجاد کاربر‬

‫بايد نام کاربر خود را وارد کنید و در زير آن‬ ‫‪Login Name‬‬ ‫در شکل ‪ 4-3‬بايد کاربر خود را ايجاد کنید‪ ،‬در قسمت‬
‫‪ SQL Server Authentication‬را انتخاب کنید‪ ،‬با انتخاب اين گزينه شما يک کاربر در داخل ‪ SQL Server‬ايجاد میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪237‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬

‫شکل ‪ 4-3‬ایجاد کاربر‬

‫يک رمز عبور پیچیده وارد کنید مانند ‪ ،Test@12345‬اگر میخواهید رمز عبور شما با خط مش سازمان شما يکی باشد‬
‫را انتخاب کنید‪ ،‬خط مش سازمان براي رمز عبور میتواند موارد زير‬ ‫‪Enforce password policy‬‬ ‫بايد تیک گزينهي‬
‫باشد‪:‬‬
‫زمانی که اين گزينه را انتخاب میکنید بايد موارد زير رعايت شود‪:‬‬
‫‪ -1‬رمز عبور نبايد شامل نام کاربري باشد‪.‬‬
‫‪ -2‬رمز عبور حداقل هشت کاراکتر باشد‪.‬‬
‫‪ -3‬رمز عبور بايد شامل حروف (‪ )A-Z( ،)a-z‬و اعداد (‪ )0-9‬باشد‪.‬‬
‫‪ -4‬رمزهاي غیرالفبايی مانند‪ :‬تعجب (!) ‪ ،‬عالمت دالر (‪ ، )$‬عالمت عدد (‪ )#‬يا درصد (‪.)٪‬‬

‫را انتخاب کنید به اين معنا است که يک تاريخ براي‬ ‫‪Enforce Password Expiration‬‬ ‫در ادامه کار اگر تیک گزينهي‬
‫انقضاء رمز عبور کاربران در نظر گرفته خواهد شد و قبل از اينکه تاريخ انقضاء برسد به کاربران هشدارهاي الزم داده‬
‫خواهد شد تا رمز عبور خود را تغییر دهند‪.‬‬
‫را انتخاب کنید کاربر بعد از ورود بايد رمز عبور را خودش‬ ‫‪User Must Change Passeowrd at next Login‬‬ ‫گزينهي‬
‫تغییر دهد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪238‬‬


‫در آخر شکل ‪ 4-3‬میتوانید کاربر موردنظر را به ديتابیس موردنظر خود تخصیص دهید‪ ،‬تا دسترسی اولیه به آن را‬
‫داشته باشد‪.‬‬
‫در ادامه کار بهمانند شکل ‪ 4-4‬وارد تب ‪ Server Role‬شويد‪ ،‬در اين قسمت گزينههاي مختلف دسترسی وجود دارد‬
‫که در جدول ‪ 4-1‬به طور کامل آن را بررسی میکنیم‪.‬‬

‫شکل ‪ 4-4‬دسترسی به کاربر‬

‫جدول ‪ 4 -1‬بررسی ‪ Role‬دسترسی‬

‫توضیحات‬ ‫نام ‪Role‬‬


‫‪ sysadmin‬کاربران عضو ‪ sysadmin‬میتوانند هر فعالیتی را در سرور انجام دهند ‪.‬يعنی آزاد و رها هستند‪.‬‬
‫میتوانند پیکربندي سرور موردنظر را تغییر دهند و همچنین‬ ‫‪serveradmin‬‬ ‫کاربران عضو‬
‫‪serveradmin‬‬
‫میتوانند سرور را خاموش کنند‪.‬‬
‫و جزئیات آنها را مديريت کنند‪،‬‬ ‫‪Login‬‬ ‫میتوانند قسمت‬ ‫‪securityadmin‬‬ ‫اعضاي گروه‬
‫کاربرانی که عضو اين نقش هستند توانايی اين را دارند که مجوزهاي سطح سرور را اعطا‬
‫کنند مانند ‪ GRANT‬و ‪ DENY‬و يا ‪ ، REVOKE‬آنها همچنین میتوانند در صورت دسترسی‬
‫‪ securityadmin‬به ديتابیس مجوز هاي آن را هم مديريت کنند‪ ،‬عالوه بر اين هم آنها میتوانند رمزهاي عبور‬
‫کنند‪.‬‬ ‫ريست‬ ‫را‬ ‫کاربران‬
‫به اين نکته توجه کنید که اين نقش بسیار قدرتمند است و بايد مواظب باشید که به هر‬
‫کاربري آن را اعطا نکنید‪ ،‬اين نقش معادل نقش ‪ sysadmin‬در سرور است‪.‬‬
‫باشند میتوانند فرايندهاي در حال اجرا را خاتمه‬ ‫‪processadmin‬‬ ‫کاربرانی که عضو نقش‬
‫‪processadmin‬‬
‫دهند‪.‬‬
‫‪www.takbook.com‬‬

‫‪239‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬


‫‪SQL‬‬ ‫کاربران اين نقش میتوانند با استفاده از زبان پرسوجو يا همان ‪ Transact-SQL‬سرورها‬
‫را اضافه يا حذف کنند‪ ،‬البته در صورت استفاده از ‪ Management Studio‬کاربر موردنظر حتماً‬ ‫‪setupadmin‬‬
‫بايد عضو ‪ sysadmin‬هم باشد‪.‬‬
‫‪BLUNK‬‬ ‫اعضاي نقش ‪ bulkadmin‬میتوانند دستور ‪ BULK INSERT‬را اجرا کنند (دستور‬
‫مقادير زيادي از اطالعات را به جداول‬ ‫‪csv‬‬ ‫‪ INSERT‬میتواند با استفاده از فايلهاي ‪ txt‬يا‬ ‫‪bulkadmin‬‬
‫اضافه کند)‪.‬‬
‫کاربران عضو نقش ‪ diskadmin‬میتوانند فايلهاي موجود بر روي ديسک را مديريت کنند‪.‬‬ ‫‪diskadmin‬‬
‫کاربران داراي نقش ‪ dbcreator‬میتوانند هر پايگاه دادهاي را ايجاد‪ ،‬مديريت و حذف کنند و‬
‫‪dbcreator‬‬
‫حتی میتوانند پايگاهدادهي موردنظر را بازيابی کنند‪.‬‬
‫زمانی که يک کاربر ايجاد میکنید بهصورت پیشفرض نقش ‪ public‬به آن تعلق میگیرد‪ ،‬اين‬
‫نقش به اين صورت است که زمانی که مدير يک ‪ object‬ايجاد میکند میتواند مشخص کند‬ ‫‪public‬‬
‫که کاربرانی که نقش ‪ public‬را دارند بتوانند به آن ‪ object‬دسترسی داشته باشند‪.‬‬

‫براي اينکه به کاربر ‪ ali‬دسترسی کامل دهیم تیک گزينهي ‪ securityadmin‬را بهمانند شکل ‪ 4-5‬انتخاب میکنیم‪.‬‬

‫شکل ‪ 4-5‬دسترسی به کاربر‬

‫شويد در اين صفحه که در شکل ‪ 4-6‬مشخص شده است‪ ،‬شما میتوانید‬ ‫‪User Mapping‬‬ ‫در ادامه کار وارد تب‬
‫مشخص کنید که کاربر موردنظر بر روي کدام ديتابیس دسترسی الزم را داشته باشد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪240‬‬

‫شکل ‪ 4-6‬دسترسی به دیتابیس‬

‫وجود دارد که میتوانید براي دسترسی به‬ ‫‪Role‬‬ ‫در پايین شکل ‪ 4-6‬که در شکل ‪ 4-7‬مشخص شده است چندين‬
‫ديتابیس توسط کاربر موردنظر مشخص کنید‪ ،‬براي اينکه بیشتر با گزينههاي موردنظر آشنا شويم به جدول ‪ 4-2‬توجه‬
‫کنید‪.‬‬

‫شکل ‪ 4-7‬دسترسی به دیتابیس‬

‫جدول ‪ Role 4 -2‬دسترسی‬

‫توضیحات‬ ‫‪Role‬‬ ‫نام‬


‫کاربرانی که نقش ‪ db_owner‬را دريافت میکنند میتوانند بر کلیهي تنظیمات و نگهداري‬ ‫‪db_owner‬‬

‫حذف کنند‪،‬‬ ‫‪sql‬‬ ‫پايگاهداده موردنظر را انجام دهند و همچنین میتوانند پايگاهداده را در‬
‫‪www.takbook.com‬‬

‫‪241‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬


‫البته در بعضی از مواقع اين نوع دسترسی کارايی ندارد و بايد مجوز سطح سرور به آنها‬
‫داده شود‪.‬‬
‫اعضاي اين نقش توانايی تغییر عضويت در نقشها را دارند و همچنین میتوانند وظیفه‬ ‫‪db_securityadmin‬‬

‫دارند‪.‬‬ ‫مديريت اختیارات را برعهده‬


‫نظارت و‬ ‫‪SQL‬‬ ‫کردن در‬ ‫‪Login‬‬ ‫اين نقش به کاربران اين اجازه را میدهد که بر روي‬ ‫‪db_accessadmin‬‬

‫دسترسی داشته باشد‪.‬‬


‫اين قابلیت را به کاربران میدهد تا بتوانند از پايگاهداده پشتیبان تهیه کنند‪.‬‬ ‫‪db_backupoperator‬‬

‫دارند‪.‬‬ ‫اعضاي اين گروه توانايی اجراي دستورات از نوع ‪ DDL‬را‬ ‫‪db_ddladmin‬‬

‫اعضاي اين گروه توانايی تغییر‪ ،‬حذف‪ ،‬و اضافهکردن هیچ اطالعاتی را در جدولهاي‬ ‫‪db_datawriter‬‬

‫ندارند‪.‬‬ ‫تعريف شده توسط کاربر‬


‫اعضاي اين نقش‪ ،‬توانايی خواندن اطالعات از جدولهاي تعريف شده توسط کاربر را‬ ‫‪db_datareader‬‬

‫دارد‪.‬‬

‫اعضاي اين نقش نمیتوانند دادههاي موجود در جداول کاربران موجود در يک پايگاهداده‬ ‫‪db_denydatawriter‬‬

‫کنند‪.‬‬ ‫را اضافه‪ ،‬اصالح يا حذف‬


‫کاربرانی که اين نقش را دارند نمیتوانند هیچ دادهاي را از جدولهاي تعريف شده توسط‬ ‫‪db_denydatareader‬‬

‫بخوانند‪.‬‬ ‫کاربر‬

‫را انتخاب کنید تا کاربر مورد نظر دسترسی کامل به ديتابیس داشته‬ ‫‪db_securityadmin‬‬ ‫در شکل ‪ 4-8‬تیک گزينهي‬
‫باشد‬

‫شکل ‪ 4-8‬دسترسی به دیتابیس‬

‫بعد از انجام کار میتوانید بر روي ‪ OK‬کلیک کنید تا کاربر مورد نظر ايجاد شود‪ ،‬بعد از ايجاد کاربر بهمانند شکل ‪-9‬‬
‫‪ 4‬بر روي کاربرمورد نظر کلیک راست کنید و گزينهي ‪ Properties‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪242‬‬

‫شکل ‪ 4-9‬بررسی کاربر‬

‫در شکل ‪ 4-10‬جزئیات مربوط به کاربر ‪ ali‬را مشاهده میکنید‪ ،‬در تب ‪ Securables‬يک سري دسترسیهاي پیشرفته‬
‫وجود دارد که میتوانید از طريق مدير ‪ SQL‬به کاربران و ديتابیس مورد نظر اعطا کنید‪.‬‬

‫شکل ‪ 4-10‬بررسی تب ‪Securables‬‬

‫در تب ‪ Status‬که در شکل ‪ 4-11‬مشخص شده است میتوانید مشخص کنید که کاربر مورد نظر توانايی متصل شدن‬
‫به ‪ Database Engine‬را داشته باشد يا نه و يا اينکه کاربر مورد نظر را فعال و يا غیرفعال کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪243‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬

‫شکل ‪ 4-11‬بررسی قسمت ‪Status‬‬

‫اگر بخواهیم يک کاربر از طريق ‪ Active Directory‬را به لیست ‪ Logins‬اضافه کنیم بايد بهمانند شکل ‪ 4-12‬بر روي‬
‫‪ Logins‬کلیک راست کنید و گزينهي ‪ New Login‬را انتخاب کنید‪.‬‬

‫شکل ‪ 4-12‬ایجاد کاربر ‪Active Directory‬‬

‫در شکل ‪ 4-13‬بايد گزينهي ‪ Windows authentication‬را انتخاب کنید و بر روي ‪ Search‬کلیک کنید‪.‬‬

‫شکل ‪ 4-13‬ایجاد کاربر ‪Active Directory‬‬

‫در شکل ‪ 4-14‬بايد از قسمت ‪ Location‬دومین خود را انتخاب کنید و کاربر مورد نظر خود را در کادر مشخص شده‬
‫وارد کنید تا با کلیک بر روي ‪ Check Names‬آن را پیدا کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪244‬‬

‫شکل ‪ 4-14‬ایجاد کاربر ‪Active Directory‬‬

‫اگر به شکل ‪ 4-15‬توجه کنید بعد از انتخاب کاربر از نوع دومین ديگر نمیتوانید رمز عبور و ديگر گزينهها را خودتان‬
‫وارد و انتخاب کنید بلکه اين اطالعات از طريق سرويس ‪ Active Directory‬انجام میگیرد‪.‬‬

‫شکل ‪ 4-15‬ایجاد کاربر ‪Active Directory‬‬

‫‪SQL‬‬ ‫همانطور که در شکل ‪ 4-16‬مشاهده میکنید هم کاربر ‪ ali‬و هم کاربر ‪ spsql‬که از نوع دومین بوده به لیست‬
‫اضافه شده است‪ ،‬براي اينکه با اين کاربران وارد ‪ SQL‬شويم بايد بر روي آيکون مورد نظر کلیک کنید‪.‬‬

‫شکل ‪ 4-16‬ایجاد کاربر ‪Active Directory‬‬


‫‪www.takbook.com‬‬

‫‪245‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬


‫قبل از اينکه ادامه دهیم بايد اين نکته را متذکر شويم که براي ورود با کاربر تحت دومین بايد با همان کاربر اول وارد‬
‫ويندوز شويد و بعد از آن میتوانید با انتخاب ‪ windows Authentication‬از آن کاربر استفاده کنید ولی براي ورود با‬
‫کاربر ‪ ali‬که از نوع ‪ SQL Authentication‬است بايد گزينهي ‪ SQL Server Authentication‬را انتخاب کنید و طبق شکل‬
‫‪ 17-4‬کاربر ‪ ALI‬را وارد و بر روي ‪ Connect‬کلیک کنید‪ ،‬بعد از کلیک با خطايی روبرو خواهید شد که اجازه ورود‬
‫به سرور را به کاربر ‪ ali‬نمیدهد‪.‬‬

‫شکل ‪ 4-17‬احراز هویت ‪SQL‬‬

‫را‬ ‫‪Properties‬‬ ‫براي حل خطاي شکل ‪ 4-17‬بايد بهمانند شکل ‪ 4-18‬بر روي سرور کلیک راست کنید و گزينهي‬
‫انتخاب کنید‪.‬‬

‫شکل ‪ 4-18‬احراز هویت ‪SQL‬‬

‫در شکل ‪ 4-19‬وارد تب ‪ Security‬شويد و گزينهي ‪ SQL Server and Windows Authentication mode‬را انتخاب کنید‪،‬‬
‫با اين کار هم با احراز هويت ‪ SQL‬و هم ‪ Windows‬میتوانیم وارد سرور ‪ SQL‬شويم‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪246‬‬

‫شکل ‪ 4-19‬احراز هویت ‪SQL‬‬

‫در شکل ‪ 4-20‬مشخص شده است که کاربر ‪ ali‬که از نوع ‪ SQL Authentication‬است توانسته وارد سرور ‪ SQL‬شود‪.‬‬

‫شکل ‪ 4-20‬احراز هویت ‪SQL‬‬

‫‪ 4-3‬ايجاد کاربر از طريق ‪Query‬‬


‫یکی دیگر از راههای ایجاد کاربر یا موارد خاص دیگر استفاده از دستورات ‪ SQL‬است که در این قسمت میخواهیم این کار را انجام‬
‫دهیم‪ ،‬برای شروع باید بر روی نام سرور ‪ SQl‬کلیک راست کنید و گزینهی ‪ New Query‬را بهمانند شکل ‪ 4-21‬انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪247‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬

‫شکل ‪ 4-21‬ایجاد کاربر از طریق ‪Query‬‬

‫در صفحه بازشدهي شکل ‪ 22-4‬دستورات زير را وارد کنید و بعد از آن کلید ‪ F5‬را فشار دهید‪:‬‬
‫]‪USE [DB1‬‬
‫‪CREATE LOGIN [reza] WITH PASSWORD='1', DEFAULT_DATABASE=[DB1], CHECK_EXPIRATION=ON,‬‬
‫‪CHECK_POLICY=ON‬‬

‫در دستور باال و در خط اول بايد مشخص کنیم که بر روي چه ديتابیسی قرار است کار کنیم که در اينجا ديتابیس‬
‫‪ DB1‬انتخاب شده است‪ ،‬در خط بعد بايد دستورات اصلی را وارد کنیم‪ ،‬با دستور ‪ CREATE LOGIN‬مشخص میکنیم‬
‫است وارد میکنیم و با‬ ‫‪reza‬‬ ‫نام کاربر را که‬ ‫][‬ ‫جديد ايجاد کنیم که بعد از آن هم در‬ ‫‪LOGIN‬‬ ‫که میخواهیم يک‬
‫دستور ‪ WITH PASSWORD‬رمز عبور آن را که حتماً هم بايد در ’‘ باشد را مشخص میکنیم‪ ،‬در ادامه بايد ويژگیهاي‬
‫اين کاربر را مشخص کنیم‪ ،‬مثالً براي اينکه مشخص کنیم که ديتابیس پیشفرضی که کاربر بر روي آن کار میکند را‬
‫مشخص کنیم و بعد از آن میتوانیم ويژگیهاي ديگر آن مانند‬ ‫]‪DEFAULT_DATABASE=[DB1‬‬ ‫بايد با دستور‬
‫‪ Enforce Password Policy‬و ‪ Enforce Password Expiration‬را فعال کنید‪.‬‬
‫بعد از درست واردکردن دستور مورد نظر بر روي کلید ‪ F5‬فشار دهید تا بهمانند شکل ‪ 4-22‬کاربر مورد نظر ايجاد‬
‫شود‪.‬‬

‫شکل ‪ 4-22‬ایجاد کاربر از طریق ‪Query‬‬

‫اگر به شکل ‪ 4-23‬توجه کنید‪ ،‬کاربر مورد نظر در لیست ‪ Logins‬قرار گرفته است و براي اينکه بررسی بیشتري داشته‬
‫باشیم بر روي آن کلیک راست کنید و گزينهي ‪ Properties‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪248‬‬

‫شکل ‪ 4-23‬بررسی کاربر‬

‫دقیقاً همان چیزي است که در دستورات وارد‬ ‫‪reza‬‬ ‫همانطور که در شکل ‪ 4-24‬مشاهده میکنید اطالعات کاربر‬
‫کرديم‪.‬‬

‫شکل ‪ 4-24‬بررسی کاربر‬


‫‪www.takbook.com‬‬

‫‪249‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬


‫اگر بخواهیم با استفاده از دستور مشخص کنیم که کاربر مورد نظر فعال باشد و يا غیرفعال بايد دستور زير را وارد‬
‫کنیم‪:‬‬
‫;‪ALTER LOGIN reza ENABLE‬‬
‫در دستور باال کاربر ‪ reza‬فعال میشود و اگر بخواهید غیرفعال کنید بايد از دستور ‪ DISABLE‬استفاده کنید‪.‬‬

‫‪ 4-4‬رمزگذاري بر روي ديتابیس‬


‫يکی از مهمترين کارها در ‪ SQL‬ايجاد امنیت براي ديتابیسها و ستونهاي جدول آن است که با اين کار دسترسی به‬
‫اطالعات ديتابیس کار هرکسی نخواهد بود و طرف بايد رمز عبور و گواهینامه موردنیاز را داشته باشد‪.‬‬
‫مثالً شما در جدول خود يک ستون داريد که نمیخواهید کس ديگري بتواند اطالعات آن را مشاهده کند و شما با‬
‫داشتن رمز عبور و گواهینامه مورد نظر میتونید اطالعات را مشاهده کنید‪.‬‬
‫رمزنگاري يا همان ‪ Cryptography‬به دانشی گفته میشود که در آن اطالعات بهصورت يک کلید رمزنگاري میشود‬
‫که اين کار توسط الگوريتم مربوط به آن انجام میشود و فقط کسی میتواند از اين اطالعات استفاده کند که اطالعات‬
‫الزم مانند کلید و الگوريتم مربوط به آن را بداند‪.‬‬

‫شکل ‪ 4-25‬رمزنگاری‬

‫بررسی برخی از اصطالحات‬


‫‪Decryption‬‬
‫براي آشکارسازي اطالعات ‪ Encryption‬شده مورداستفاده قرار میگیرد و نام آن را رمزگشايی هم مینامند‪.‬‬
‫‪Plain text‬‬
‫متن اولیه که رمزنگاري نشده و يک رمز آشکار است و مهاجمان بهراحتی میتوانند به آن دست پیدا کنند‪.‬‬
‫‪Cipher‬‬
‫الگوريتمی براي رمزگذاري و رمزشکنی است و از سرعت عمل خوبی برخوردار است‪.‬‬
‫‪Cryptanalysis‬‬
‫به بازکردن قفلهاي ‪ Cipher‬گفته میشود يا خواندن متن قفلشدهي آن‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪250‬‬


‫‪ 4-4-1‬کلیدهاي متقارن (‪ )Symmetric‬و نامتقارن (‪)Asymmetric‬‬
‫رمزنگاری کلید متقارن‬
‫رمزنگاري کلید متقارن يا تک کلیدي‪ ،‬به آن دسته از الگوريتمها‪ ،‬پروتکلها و سیستمهاي رمزنگاري گفته میشود که‬
‫در آن هر دو طرف ردوبدل اطالعات از یک کلید رمز یکسان براي عملیات رمزگذاري و رمزگشايی استفاده میکنند‪.‬‬
‫در اين قبیل سیستمها‪ ،‬يا کلیدهاي رمزگذاري و رمزگشايی يکسان هستند يا با رابطهاي بسیار ساده از يکديگر قابل‬
‫استخراج هستند‪.‬‬
‫واضح است که در اين نوع از رمزنگاري‪ ،‬بايد يک کلید رمز مشترک بین دو طرف تعريف گردد‪ .‬چون کلید رمز بايد‬
‫کامالً محرمانه باقی بماند‪ ،‬براي ايجاد و ردوبدل کلید رمز مشترک بايد از کانال امن استفاده نمود يا از روشهاي‬
‫رمزنگاري نامتقارن استفاده کرد‪ .‬نیاز به وجود يک کلید رمز بهازاي هر دو نفرِ درگیر در رمزنگاري متقارن‪ ،‬موجب‬
‫بروز مشکالتی در مديريت کلیدهاي رمز میگردد‪.‬‬
‫الگوريتمهايی که در ‪ Symmetric‬به کار میرود عبارتاند از‪:‬‬
‫‪DES‬‬ ‫✓‬
‫‪DES3‬‬ ‫✓‬
‫‪AES‬‬ ‫✓‬
‫‪IDEA‬‬ ‫✓‬
‫‪RC2, RC4, RC5, RC6‬‬ ‫✓‬
‫‪Blowfish‬‬ ‫✓‬

‫شکل ‪ 4-26‬رمزنگاری‬

‫رمزنگاری کلید نامتقارن‬


‫رمزنگاري کلید نامتقارن‪ ،‬در ابتدا با هدف حل مشکل انتقال کلید در روش متقارن پیشنهاد شد‪ .‬در اين نوع از رمزنگاري‪،‬‬
‫بهجاي يک کلید مشترک‪ ،‬از يک زوج کلید به نامهاي کلید عمومی و کلید خصوصی استفاده میشود‪ .‬کلید خصوصی‬
‫تنها در اختیار دارندة آن قرار دارد و امنیت رمزنگاري به محرمانه بودن کلید خصوصی بستگی دارد‪ .‬کلید عمومی در‬
‫اختیار کلیة کسانی که با دارندة آن در ارتباط هستند قرار داده میشود‪.‬‬
‫بهمرورزمان‪ ،‬بهغیراز حل مشکل انتقال کلید در روش متقارن‪ ،‬کاربردهاي متعددي براي اين نوع از رمزنگاري مطرح‬
‫گرديده است‪ .‬در سیستمهاي رمزنگاري نامتقارن‪ ،‬بسته به کاربرد و پروتکل مورد نظر‪ ،‬گاهی از کلید عمومی براي‬
‫‪www.takbook.com‬‬

‫‪251‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬


‫رمزگذاري و از کلید خصوصی براي رمزگشايی استفاده میشود و گاهی نیز‪ ،‬برعکس‪ ،‬کلید خصوصی براي رمزگذاري‬
‫و کلید عمومی براي رمزگشايی به کار میرود‪.‬‬
‫دو کلید عمومی و خصوصی با يکديگر متفاوت هستند و با استفاده از روابط خاص رياضی محاسبه میگردند‪ .‬رابطة‬
‫رياضی بین اين دو کلید بهگونهاي است که کشف کلید خصوصی با در اختیار داشتن کلید عمومی‪ ،‬عمالً ناممکن‬
‫است‪.‬‬
‫الگوريتمهايی که در ‪ Asymmetric‬به کار میروند عبارتاند از‪:‬‬
‫‪RSA‬‬ ‫✓‬
‫‪DH‬‬ ‫✓‬
‫‪ElGamal‬‬ ‫✓‬
‫‪DSA‬‬ ‫✓‬
‫‪ECC‬‬ ‫✓‬

‫مقایسه رمزنگاری کلید متقارن و کلید نامتقارن‬


‫اصو ًال رمزنگاري کلید متقارن و کلید نامتقارن داراي دو ماهیت متفاوت هستند و کاربردهاي متفاوتی نیز دارند؛ بنابراين‬
‫مقايسه اين دو نوع رمزنگاري بدون توجه به کاربرد و سیستم مورد نظر کار دقیقی نخواهد بود‪ .‬اما اگر معیار مقايسه‪،‬‬
‫بهطور خاص‪ ،‬حجم و زمان محاسبات موردنیاز باشد‪ ،‬بايد گفت که با درنظرگرفتن مقیاس امنیتی معادل‪ ،‬الگوريتمهاي‬
‫رمزنگاري متقارن خیلی سريعتر از الگوريتمهاي رمزنگاري نامتقارن میباشند‪.‬‬
‫‪ 4-4-2‬هش کردن (‪)Hashing‬‬
‫در اين روش يک ورودي از اطالعات دريافت میشود و بعد از اجراي يک الگوريتم بر روي آن ورودي تبديل به‬
‫اعداد و حروف خواهد شد که در شکل ‪ 4-27‬اين موضوع را مشاهده میکنید که مثالً با ورود عدد ‪ 000‬و اعمال‬
‫الگوريتم هش روي آن کد نهايی آن بهصورت کامل تغییر کرده و هک کردن آن کامالً سخت شده است‪.‬‬

‫شکل ‪ 4-27‬هشینگ‬

‫انواع الگوريتمهاي هش عبارتاند از‪:‬‬

‫نوع الگوریتم‬ ‫اندازه‬


‫‪BLAKE-256‬‬ ‫‪256 bits‬‬
‫‪BLAKE-512‬‬ ‫‪512 bits‬‬
‫‪BLAKE2s‬‬ ‫‪Up to 256 bits‬‬
‫‪BLAKE2b‬‬ ‫‪Up to 512 bits‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪252‬‬


‫‪ECOH‬‬ ‫‪224 to 512 bits‬‬
‫‪FSB‬‬ ‫‪160 to 512 bits‬‬
‫‪GOST‬‬ ‫‪256 bits‬‬
‫‪Grøstl‬‬ ‫‪Up to 512 bits‬‬
‫‪HAS-160‬‬ ‫‪160 bits‬‬
‫‪HAVAL‬‬ ‫‪128 to 256 bits‬‬
‫‪JH‬‬ ‫‪224 to 512 bits‬‬
‫‪MD2‬‬ ‫‪128 bits‬‬
‫‪MD4‬‬ ‫‪128 bits‬‬
‫‪MD5‬‬ ‫‪128 bits‬‬
‫‪MD6‬‬ ‫‪Up to 512 bits‬‬
‫‪RadioGatún‬‬ ‫‪Up to 1216 bits‬‬
‫‪RIPEMD‬‬ ‫‪128 bits‬‬
‫‪RIPEMD-128‬‬ ‫‪128 bits‬‬
‫‪RIPEMD-160‬‬ ‫‪160 bits‬‬
‫‪RIPEMD-320‬‬ ‫‪320 bits‬‬
‫‪SHA-1‬‬ ‫‪160 bits‬‬
‫‪SHA-224‬‬ ‫‪224 bits‬‬
‫‪SHA-256‬‬ ‫‪256 bits‬‬
‫‪SHA-384‬‬ ‫‪384 bits‬‬
‫‪SHA-512‬‬ ‫‪512 bits‬‬
‫)‪SHA-3 (originally known as Keccak‬‬ ‫‪arbitrary‬‬
‫‪Skein‬‬ ‫‪arbitrary‬‬
‫‪Snefru‬‬ ‫‪128 or 256 bits‬‬
‫‪Spectral Hash‬‬ ‫‪512 bits‬‬
‫‪Streebog‬‬ ‫‪256 or 512 bits‬‬
‫‪SWIFFT‬‬ ‫‪512 bits‬‬
‫‪Tiger‬‬ ‫‪192 bits‬‬
‫‪Whirlpool‬‬ ‫‪512 bits‬‬
‫از بین اين الگوريتمها بیشترين استفاده از الگوريتمهاي ‪ SHA2 ،SHA1 ،MD5‬میشود‪.‬‬
‫‪ 4-4-3‬رمزگذاري بر روي ستونهاي جداول در ‪SQL‬‬
‫امنیت داده براي هر سازمانی يک کار اساسی و مهم است‪ ،‬بهخصوص اگر اطالعات شخصی مشتري مانند شماره‬
‫تماس‪ ،‬آدرس ايمیل‪ ،‬شماره تأمین اجتماعی‪ ،‬شماره کارتهاي بانکی و اعتباري را ذخیره کنید‪ .‬هدف اصلی ما محافظت‬
‫از دسترسی غیرمجاز به دادهها در داخل و خارج از سازمان است‪ .‬براي دستیابی به اين هدف ‪ SQL Server‬راهحلهاي‬
‫رمزگذاري ارائه میدهد‪ .‬ما میتوانیم از اين رمزگذاريها استفاده کنیم و از دادهها محافظت کنیم‪.‬‬
‫براي شروع کار میخواهیم يک ديتابیس جديد ايجاد کنیم و يکی از ستونهاي آن را رمزنگاري کنیم‪ ،‬براي اينکه يک‬
‫ديتابیس جديد ايجاد کنیم میتوانید از دستور زير استفاده کنید‪:‬‬
‫;‪CREATE DATABASE CustomerData‬‬
‫‪Go‬‬
‫;‪USE CustomerData‬‬
‫‪GO‬‬

‫‪CREATE TABLE CustomerData.dbo.CustomerInfo‬‬


‫‪(CustID‬‬ ‫‪INT PRIMARY KEY,‬‬
‫‪CustName‬‬ ‫‪VARCHAR(30) NOT NULL,‬‬
‫‪BankACCNumber VARCHAR(10) NOT NULL‬‬
‫;)‬
‫‪GO‬‬
‫‪www.takbook.com‬‬

‫‪253‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬


‫با اجراي دستورات باال يک ديتابیس جديد با نام ‪ CoustomerData‬ايجاد شده است و در ادامه دستورات يک جدول با‬
‫هم داخل ديتابیس ‪ CoustomerData‬ايجاد شده که داراي سه ستون است که در شکل ‪ 4-28‬اين‬ ‫‪CustomerInfo‬‬ ‫نام‬
‫موضوع را مشاهده میکنید‪.‬‬

‫شکل ‪ 4-28‬ایجاد جدول و دیتابیس‬

‫براي اينکه اطالعات جدول را تکمیل کنیم میتوانید از دستورات زير استفاده کنید‪:‬‬

‫)‪Insert into CustomerData.dbo.CustomerInfo (CustID,CustName,BankACCNumber‬‬


‫‪Select 1,'Rajendra',11111111 UNION ALL‬‬
‫‪Select 2, 'Manoj',22222222 UNION ALL‬‬
‫‪Select 3, 'Shyam',33333333 UNION ALL‬‬
‫‪Select 4,'Akshita',44444444 UNION ALL‬‬
‫‪Select 5, 'Kashish',55555555‬‬

‫با دستور باال اطالعات جدول ‪ CustomerInfo‬کامل خواهد شد که در شکل ‪ 2-29‬اين موضوع را مشاهده میکنید‪.‬‬

‫شکل ‪ 4-29‬خروجی جدول ‪CustomerInfo‬‬

‫میکنیم ‪:‬‬ ‫از مراحل زير براي رمزگذاري سطح ستون استفاده‬
‫يک کلید اصلی يا همان ‪ master key‬براي پايگاهداده ايجاد کنید‪.‬‬ ‫•‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪254‬‬


‫براي ‪ SQL Server‬يک گواهینامه خود امضا ايجاد کنید‪.‬‬ ‫•‬

‫يک کلید متقارن را براي رمزگذاري پیکربندي کنید‪.‬‬ ‫•‬

‫رمزگذاري دادههاي ستون‪.‬‬ ‫•‬

‫رمزگذاري را جستجو و تأيید کنید‪.‬‬ ‫•‬

‫براي انجام اين مراحل دقیقاً طبق دستورات زير پیش برويد تا مشکلی در کار پیش نیايد‪.‬‬
‫اگر به شکل ‪ 4-36‬توجه کنید‪ ،‬يک نماي کلی از ايجاد رمزگذاري در ‪ SQL Server‬را مشاهده میکنید‪.‬‬

‫شکل ‪ 4-36‬نمودار رمزگذاری‬

‫‪ 4-4-3-1‬ايجاد ‪ Master Key‬براي رمزگذاري رو ستون‬


‫براي شروع يک ‪ Master Key‬تعريف و يک رمز عبور براي محافظت آن مشخص میکنیم که اين کلید يک کلید متقارن‬
‫است که براي محافظت از کلیدهاي خصوصی و کلید نامتقارن تعريف میشود که در شکل ‪ 4-36‬هم مشخص شده‬
‫است‪.‬‬
‫میکنیم‪:‬‬ ‫براي ايجاد يک کلید اصلی (‪ )Master Key‬پايگاهداده از عبارت ‪ CREATE MASTER KEY‬استفاده‬

‫;‪USE CustomerData‬‬
‫‪GO‬‬
‫;'‪CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Test@12345‬‬

‫براي اينکه متوجه شويم دستور باال بهدرستی اجرا شده است بايد از دستور زير استفاده کنیم‪:‬‬
‫‪www.takbook.com‬‬

‫‪255‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬

‫‪SELECT name KeyName,‬‬


‫‪symmetric_key_id KeyID,‬‬
‫‪key_length KeyLength,‬‬
‫‪algorithm_desc KeyAlgorithm‬‬
‫;‪FROM sys.symmetric_keys‬‬
‫همانطور که در شکل ‪ 4-37‬مشاهده میکنید با اجراي دستورات باال يک ‪ View‬با ستونهاي مشخص شده در خروجی‬
‫به نمايش گذاشته شد که مقدار ‪ sys.symetric_keys‬را نمايش میدهد که اگر به ستون الگوريتم توجه کنید الگوريتم‬
‫ما از نوع ‪ AES‬و با اندازه ‪ 256‬است که يک رمزنگاري قدرتمند را ارائه میدهد‪ ،‬به اين نکته هم توجه کنید که خود‬
‫‪ SQL‬نوع الگوريتم به همراه طول آن را بهصورت اتوماتیک ايجاد میکند‪.‬‬

‫شکل ‪4-37‬‬

‫‪SQL‬‬ ‫‪ 4-4-3-2‬ايجاد ‪ Certificate‬در‬


‫ايجاد کنیم منظور از گواهینامههاي خود امضاء اين‬ ‫‪self-signed‬‬ ‫در ادامه کار بايد يک گواهینامه خود امضا يا همان‬
‫است که اي گواهینامه داخل خود ‪ SQL‬ايجاد میشود و هیچ سازمان ديگري آن را تولید نمیکند يعنی ديگر ‪ SQL‬نیاز‬
‫ندارد گواهینامة مرجع تولید شده از سازمان ديگر استفاده کند بلکه خودش تولید و استفاده میکند‪.‬‬
‫;‪USE CustomerData‬‬
‫‪GO‬‬
‫;'‪CREATE CERTIFICATE Certificate_test WITH SUBJECT = 'Protect my data‬‬
‫‪GO‬‬

‫در دستور باال اول به ديتابیس ‪ CustomerData‬متصل شديم و بعد يک گواهینامهي جديد با نام ‪ Certificate_test‬ايجاد‬
‫کرديم که موضوع آن ‪ Protect my data‬است و اگر به شکل ‪ 4-38‬توجه کنید اين موضوع را مشاهده خواهید کرد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪256‬‬

‫شکل ‪ 4-38‬ایجاد ‪Certificate‬‬

‫براي اينکه مطمئن شويم کار بهدرستی انجامگرفته میتوانیم از دستورات زير استفاده کنیم‪:‬‬
‫‪SELECT name CertName,‬‬
‫‪certificate_id CertID,‬‬
‫‪pvt_key_encryption_type_desc EncryptType,‬‬
‫‪issuer_name Issuer‬‬
‫;‪FROM sys.certificates‬‬
‫اگر به شکل ‪ 4-39‬توجه کنید متوجه خواهید شد که ‪ Certificate‬مورد نظر بهدرستی ايجاد شده است‪.‬‬

‫شکل ‪ 4-39‬نمایش ‪Certificate‬‬

‫‪ENCRYPTED_BY_MASTER_KEY‬‬ ‫پس اگر به ستونهاي شکل ‪ 4-39‬توجه کنید در قسمت ‪ Encrypt Type‬مقدار‬
‫از کلیدي که ايجاد کرديم در حال استفاده است‪ ،‬در ستون ‪ Certname‬هم که‬ ‫‪SQL‬‬ ‫قرار گرفته است که نشان میدهد‬
‫نام ‪ Certificate‬قرار میگیرد‪ ،‬و در ستون ‪ Issuer‬بايد نام سازمان صادرکننده گواهینامه نوشته شود که در اينجا چون‬
‫خود ‪ SQL‬صادرکننده آن است يک نوشته خودمان قرار داديم‪.‬‬
‫‪ 4-4-3-3‬ايجاد کلید متقارن‬
‫در مرحله بعد کار بايد يک کلید متقارن ايجاد کنیم‪ ،‬در مورد کلید متقارن در قسمتهاي قبل توضیح داديم‪ ،‬در کل‬
‫کلید متقارن براي رمزگذاري و رمزگشايی استفاده میکند‪.‬‬
‫براي شروع بايد از دستور زير استفاده کنید‪:‬‬
‫‪www.takbook.com‬‬

‫‪257‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬


‫‪CREATE SYMMETRIC KEY SymKey_test WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE‬‬
‫;‪Certificate_test‬‬
‫در دستور باال ‪ SymKey_test‬نام کلید متقارن است که بايد ايجاد کنیم و ‪ AES_256‬همان طول و نوع رمزنگاري است‬
‫که مشخص شده است و در آخر بايد نام ‪ Cerfitficate‬که در قسمت قبل ايجاد کرديم را وارد کنید‪.‬‬
‫براي اينکه متوجه شويم دستور بهدرستی اجرا شده میتوانیم از دستورات زير استفاده کنیم‪:‬‬
‫‪SELECT name KeyName,‬‬
‫‪symmetric_key_id KeyID,‬‬
‫‪key_length KeyLength,‬‬
‫‪algorithm_desc KeyAlgorithm‬‬
‫;‪FROM sys.symmetric_keys‬‬
‫همانطور که در شکل ‪ 4-40‬مشاهده میکنید کلید متقارن هم به همراه کلید ‪ Master‬ايجاد شده است‪.‬‬

‫شکل ‪ 4-40‬نمایش کلید متقارن‬

‫خوب تا به اينجاي کار توانستیم کلیدهاي رمزگذاري مورد نظر را براي اين نسخه از ديتابیس ايجاد کنیم و روش‬
‫ايجاد آن بهمانند شکل ‪ 4-36‬است يعنی اينکه ‪ SQL Server‬يک )‪ Service Master Key (SMK‬ايجاد میکند و بعد از‬
‫آن سیستمعامل )‪ Windows Data Protection API (DPAPI‬از کلید )‪ Service Master Key (SMK‬محافظت میکند‪ ،‬توجه‬
‫محافظت میکند کلید اصلی پايگاهداده‬ ‫پايگاهداده)‪(DMK‬‬ ‫داشته باشیم که کلید اصلی سرويس )‪ (SMK‬از کلید اصلی‬
‫‪Certificate‬‬ ‫)‪(DMK‬از گواهی خود امضا شده که همان ‪ Certificate‬باشد محافظت میکند و اين گواهینامه يا همان‬
‫از کلید ‪ Symmetric‬محافظت میکند‪ .‬اين شد مراحل کار تا به اينجا‪.‬‬
‫‪ 4-4-3-4‬رمزگذاري داده‬
‫براي اينکه يک ستون در ‪ SQL‬رمزگذاري شود بايد نوع داده را )‪ VARBINARY(max‬در نظر بگیريم‪ ،‬براي اين کار و‬
‫)‪varbinary(MAX‬‬ ‫در ديتابیس ‪ CustomerData‬يک ستون جديد با نام ‪ BankACCNumber_encrypt‬ايجاد و نوع آن را‬
‫در نظر میگیريم‪.‬‬
‫‪ALTER TABLE CustomerData.dbo.CustomerInfo‬‬
‫)‪ADD BankACCNumber_encrypt varbinary(MAX‬‬

‫همانطور که در شکل ‪ 4-41‬مشاهده میکنید ستون مورد نظر با موفقیت ايجاد شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪258‬‬

‫شکل ‪ 4-41‬ایجاد ستون در جدول‬

‫در ادامه میخواهیم کار اصلی را انجام دهیم‪ ،‬يعنی اينکه دادههايی که در ستون ‪ BankACCNumber_encrypt‬که در‬
‫باال ايجاد کرديم قرار میگیرند را رمزنگاري کنیم‪.‬‬

‫پس براي اين کار بايد از همان کلید متقارن و گواهینامه قبلی که ايجاد کرديم استفاده کنیم‪ ،‬با دستور زير کلید و‬
‫گواهینامه را فعال میکنیم که در شکل ‪ 4-42‬اين موضوع مشخص شده است‪.‬‬
‫‪OPEN SYMMETRIC KEY SymKey_test‬‬
‫;‪DECRYPTION BY CERTIFICATE Certificate_test‬‬

‫شکل ‪ 4-42‬بازکردن کلید و گواهینامه‬

‫را درون ستون جديدي که با نام‬ ‫‪BankACCNumber‬‬ ‫در ادامه کار اطالعات موجود در ستون‬
‫‪ BankACCNumber_encrypt‬است قرار میدهیم البته با استفاده از کلید متقارن که ايجاد کرديم اين کار را انجام میدهیم‪.‬‬
‫‪UPDATE CustomerData.dbo.CustomerInfo‬‬
‫‪SET BankACCNumber_encrypt = EncryptByKey (Key_GUID('SymKey_test'),‬‬
‫)‪BankACCNumber‬‬
‫;‪FROM CustomerData.dbo.CustomerInfo‬‬
‫‪GO‬‬
‫‪www.takbook.com‬‬

‫‪259‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬

‫در ادامه بايد کلید متقارن که باز کرديد را ببنديد که بايد از اين دستور استفاده کنید‪:‬‬
‫;‪CLOSE SYMMETRIC KEY SymKey_test‬‬
‫‪GO‬‬
‫حاال میتوانیم با استفاده از دستور زير خروجی کار را مشاهده کنیم‪:‬‬
‫* ‪SELECT‬‬
‫;‪FROM CustomerInfo‬‬

‫همانطور که در شکل ‪ 4-43‬مشاهده میکنید ستون جديد ايجاد شده و اطالعاتی که داخل آن قرار گرفتهاند رمزنگاري‬
‫شده و کسی نمیتواند از اطالعات را مشاهده کند‪.‬‬

‫شکل ‪ 4-43‬نمایش جدول‬

‫تا اينجا توانستیم يک ستون از جدول را رمزگذاري کنیم تا کسی نتواند اطالعات آن را مشاهده کند‪ ،‬اما اگر بخواهیم‬
‫اين اطالعات را مشاهده کنیم يعنی رمزگشايی يا همان ‪ Decrypt‬کنیم چه کاري بايد انجام دهیم؟‬
‫براي اين کار بايد از دستور ‪ DecryptByKey‬استفاده کنیم‪ ،‬براي تست اين موضوع به دستورات زير دقت کنید‪:‬‬
‫اولین کاري که انجام میدهیم کلید متقارن و گواهینامه مورد نظر را صدا میزنیم‪:‬‬

‫‪OPEN SYMMETRIC KEY SymKey_test‬‬


‫;‪DECRYPTION BY CERTIFICATE Certificate_test‬‬

‫بعد از بازکردن موارد مورد نظر بايد از دستورات زير استفاده کنید‪:‬‬

‫‪SELECT CustID, CustName,BankACCNumber_encrypt AS 'Encrypted data',‬‬


‫‪CONVERT(varchar, DecryptByKey(BankACCNumber_encrypt)) AS 'Decrypted Bank‬‬
‫'‪account number‬‬
‫;‪FROM CustomerData.dbo.CustomerInfo‬‬

‫در دستورات باال ستونهاي جدول مورد نظر انتخاب شدهاند ولی در ستون ‪ BankACCNumber_encrypt‬با استفاده از‬
‫‪ DecryptByKey‬اطالعات آن‬ ‫دستور ‪ AS‬به ستون ‪ Encrypted data‬تغییر نام پیدا کرد و همین ستون با استفاده از دستور‬
‫به ستون جديد با نام ‪ Decrypted Bank account number‬رمزگشايی شد که اين موضوع را در شکل ‪ 4-44‬مشاهده میکنید‪:‬‬
www.takbook.com

SQL Server 2019 ‫آموزش‬ 260

‫ رمزگشایی ستون‬4-44 ‫شکل‬

‫ حاال میخواهیم تست بگیريم که هر کاربري با هر دسترسی میتواند اين عملیات را‬،‫بعد از رمزگذاري و رمزگشايی‬
‫ ايجاد میکنیم‬DEC-USER ‫ براي تست اين موضوع با استفاده از دستورات زير يک کاربر جديد با نام‬،‫انجام دهد يا نه‬
.‫ دارد يعنی فقط میتواند اطالعات را بخواند‬db_datareader ‫ دسترسی‬CustomerData ‫که به ديتابیس‬
USE [master]
GO
CREATE LOGIN [DEC-USER] WITH PASSWORD=N'Test@12345', DEFAULT_DATABASE=[CustomerData],
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [CustomerData]
GO
CREATE USER [DEC-USER] FOR LOGIN [DEC-USER]
GO
USE [CustomerData]
GO
ALTER ROLE [db_datareader] ADD MEMBER [DEC-USER]
GO
.‫ شويد‬SQL ‫ با کاربر جديد وارد‬45-4 ‫ بايد با اين کاربر بهمانند شکل‬DEC-USER ‫بعد از ايجاد کاربر‬

SQL ‫ ورود به‬4-45 ‫شکل‬


:‫ اجرا کنید‬New Query ‫بعد از ورود دستور زير را در‬
OPEN SYMMETRIC KEY SymKey_test
DECRYPTION BY CERTIFICATE Certificate_test;

SELECT CustID, CustName,BankACCNumber_encrypt AS 'Encrypted data',


CONVERT(varchar, DecryptByKey(BankACCNumber_encrypt)) AS 'Decrypted Bank account
number'
FROM CustomerData.dbo.CustomerInfo;
‫‪www.takbook.com‬‬

‫‪261‬‬ ‫‪SQL Server‬‬ ‫فصل ‪ / 4‬امنیت در‬


‫با اجراي دستور باال با خطاي شکل ‪ 4-46‬مواجه خواهید شد که اشاره به دسترسی نداشتن کاربر مورد نظر دارد‪.‬‬

‫شکل ‪ 4-46‬تست دسترسی کاربر‬

‫براي حل اين مشکل بايد به کاربر مورد نظر دسترسی الزم را بدهیم تا بتواند هم به کلید متقارن و هم به گواهینامه‬
‫مورد نظر دسترسی داشته باشد‪.‬‬

‫;"‪GRANT VIEW DEFINITION ON SYMMETRIC KEY::SymKey_test TO "DEC-USER‬‬


‫‪GO‬‬
‫;"‪GRANT VIEW DEFINITION ON Certificate::[Certificate_test] TO "DEC-USER‬‬
‫‪GO‬‬
‫;"‪GRANT CONTROL ON Certificate::[Certificate_test] TO "DEC-USER‬‬

‫نتیجهي دستورات را در شکل ‪ 4-47‬مشاهده میکنید‪.‬‬

‫شکل ‪ 4-47‬افزایش دسترسی کاربر‬

‫بعد از دادن دسترسیهاي الزم دوباره دستورات باال را در اين قسمت وارد و اجرا میکنیم‪:‬‬
‫‪OPEN SYMMETRIC KEY SymKey_test‬‬
‫;‪DECRYPTION BY CERTIFICATE Certificate_test‬‬
www.takbook.com

SQL Server 2019 ‫آموزش‬ 262


SELECT CustID, CustName,BankACCNumber_encrypt AS 'Encrypted data',
CONVERT(varchar, DecryptByKey(BankACCNumber_encrypt)) AS 'Decrypted Bank account
number'
FROM CustomerData.dbo.CustomerInfo;
‫ مشاهده میکنید دستور مورد نظر با موفقیت اجرا شده و خروجی به نمايش گذاشته شده‬4-48 ‫همانطور که در شکل‬
.‫است‬

‫ تست دسترسی کاربر‬4-48 ‫شکل‬


‫‪www.takbook.com‬‬

‫فصل پنجم‬
‫پشتیبانگیري و بازيابی‬
‫میتوان يکی از مهمترين بخشهاي يک سیستم نرمافزاري را بخش پشتیبانی و بازيابی آن بیان کرد‪ .‬در سازمانهاي‬
‫بزرگ مانند بانکها در يک ثانیه چندين هزار رکورد در ديتابیس و جداول ثبت میشود و اگر چنانچه از ديتابیس مورد‬
‫نظر پشتیبان نداشته باشید با ازدسترفتن اطالعات اصلی ديگر نمیتوانید به آن اطالعات دسترسی داشته باشید پس‬
‫بايد مسیر را دقیقاً مشخص کرد تا بتوانیم در سريعترين زمان ممکن اطالعات را برگردانیم‪.‬‬
‫استفاده کنید و يا اينکه از‬ ‫‪SQL‬‬ ‫روشهاي پشتیبانگیري از ديتابیس بسیار زياد است که میتوانید از خود نرمافزار‬
‫نرمافزارهاي جانبی استفاده کنید که در اينجا همهي آنها را بررسی میکنیم‪.‬‬

‫‪ 5-1‬پشتیبانگیري از طريق نرمافزار ‪SQL‬‬


‫براي شروع کار بايد سرويس ‪ SQL Server Agent‬را فعال کنیم‪ ،‬براي اين کار بايد وارد ‪ SQL‬شويد و بهمانند شکل‬
‫‪ 1-5‬بر روي سرويس ‪ Agent‬کلیک راست کنید و گزينهي ‪ Start‬را انتخاب کنید‪ ،‬بعد از آن پنجرهاي باز خواهد شد‬
‫که بايد بر روي ‪ Yes‬کلیک کنید‪.‬‬

‫شکل ‪5-1‬‬

‫را با هم بررسی کنیم‪ ،‬براي اينکه سرويس ‪ Backup‬را فعال کنیم بايد‬ ‫‪Database Maintenance‬‬ ‫در ادامه میخواهیم ابزارهاي‬
‫کلیک راست کنید و گزينهي‬ ‫‪Maintenace Plans‬‬ ‫شويد و بر روي‬ ‫‪Management‬‬ ‫بهمانند شکل ‪ 5-2‬وارد قسمت‬
‫‪ Maintenace Plan Wizard‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪264‬‬

‫شکل ‪5-2‬‬

‫در شکل ‪ 5-3‬بايد يک نام بهدلخواه وارد کنید و در قسمت زيري آن براي زمانبندي فعالً گزينهي ‪ Separate‬را انتخاب‬
‫کنید‪.‬‬

‫شکل ‪5-3‬‬

‫در شکل ‪ 5-4‬گزينههاي مختلفی را مشاهده میکنید که هرکدام براي يک کار طراحی شدهاند که در زير آنها را بررسی‬
‫میکنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪265‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-4‬‬

‫‪Chech Database Integrity‬‬ ‫‪-1‬‬


‫اين گزينه براي اين است که بفهمیم يک ديتابیس مشکلی ندارد و میتوانیم از آن پشتیبان تهیه کنیم که اين‬
‫موضوع واقعاً براي پشتیبانگیري مهم است اگر چنانچه ديتابیس مورد نظر مشکل داشته باشد حتی بعد از‬
‫انجام پشتیبانگیري نمیتوانید از آن ديتابیس در آينده استفاده کنید‪ ،‬پس حتماً بايد از اين گزينه استفاده کنید‪.‬‬
‫‪Shrink Database‬‬ ‫‪-2‬‬
‫زمانی که يک ديتابیس ايجاد میشود دو فايل در محل ذخیرهسازي ايجاد میشود که يکی فايل اصلی و‬
‫ديگري فايل ‪ log‬است‪ ،‬اين فايل ‪ Log‬بسته به نوع کار در طی زمان حجم آن افزايش پیدا خواهد کرد که بايد‬
‫توسط اين گزينه حجم آن را کاهش دهید تا حجم اضافه در خروجی پشتیبانگیري ايجاد نشود‪.‬‬
‫‪Rebuld index‬‬ ‫‪ Reorganize index -3‬و‬
‫‪Insert, Delete‬‬ ‫زمانی که يا دستورت مختلف بر روي ديتابیس خودکار میکنید استفاده از اين دستورات مانند‬
‫و‪ ...‬بهمرورزمان باعث ايجاد ‪ Fragmentation‬يا همان پارگی میشوند و همین امر باعث میشود که اطالعات‬
‫بهدرستی در هاردديسک يا محل ذخیرهسازي قرار نگیرند به طور سادهتر بايد گفت که مثالً از يک محل‬
‫يا پارگی ايجاد شود يک ديتابیس‬ ‫‪Fragmentation‬‬ ‫ذخیرهسازي با حجم ‪ 1‬گیگابیت داشته باشید‪ ،‬زمانی که‬
‫‪ 500‬مگابايت در يک اين فضاي يک گیگابیت ذخیره خواهد شد و استفاده درستی از آن نخواهد شد و‬
‫مهمترين مشکلی که پارگی ايجاد میکند اين است که به شدت سرعت دسترسی و استفاده از ديتابیس را‬
‫کاهش میدهد‪.‬‬
‫‪Update Statistics‬‬ ‫‪-4‬‬
‫اين گزينه براي بهبود عملکرد پرسوجو طراحی شده است و باعث بهروزرسانی اطالعات براي انجام‬
‫پرسوجو خواهد شد‪.‬‬
‫‪Clean Up History‬‬ ‫‪-5‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪266‬‬


‫زمانی که ديتابیسهاي مختلفی را در طول زمان ايجاد میکنید يک سري داده در جدول سیستم ذخیره میکند‬
‫و اين دادهها بهمرورزمان منسوخ و ازکارافتاده خواهند شد و بايد با دستوري آن اطالعات قديمی را از‬
‫ديتابیس پاک کرد‪ ،‬البته اگر اين دادهها را حذف نکنید بهمرورزمان فضاي ذخیرهسازي را پر خواهند کرد‪.‬‬
‫‪execute sql server agent job‬‬ ‫‪-6‬‬
‫اين دستور براي اجراي کارهايی است که در ‪ agent‬ايجاد کرديد‪.‬‬
‫)‪Backup Database (FULL‬‬ ‫‪-7‬‬
‫براي اينکه به طور کامل از ديتابیسهاي خود پشتیبان تهیه کنیم‪ ،‬بايد از اين گزينه استفاده کنیم‪ ،‬داشتن حداقل‬
‫وجود نداشته باشد شما توانايی‬ ‫‪Full‬‬ ‫براي هر يک از ديتابیسها ضروري است و اگر‬ ‫‪Full‬‬ ‫يک پشتیبان‬
‫برگرداندن ديتابیس خراب شده را نخواهید داشت‪.‬‬
‫)‪Backup Database (Differential‬‬ ‫‪-8‬‬
‫اين روش يک روش براي پشتیبانگیري از تغییرات است‪ ،‬مثالً اگر يک پشتیبان ‪ Full‬تهیه کرده باشد با حجم‬
‫‪ 10‬گیگابايت در موقعی که از پشتیبان ‪ Differential‬استفاده کنید حجم آن بسیار کم خواهد شد چون فقط از‬
‫تغییراتی که بعد از ‪ Full‬ايجاد شده پشتیبان تهیه میشود‪ ،‬البته اگر تنها از روش ‪ Differential‬استفاده کنید در‬
‫اولین باري که از ديتابیس پشتیبان تهیه میکند از تمام اطالعات پشتیبان میگیرد‪.‬‬
‫)‪Backup Database (Transaction Log‬‬ ‫‪-9‬‬
‫زمانی که يک ديتابیس ايجاد میکنید‪ ،‬بايد حالت ‪ Recovery Model‬آن را مشخص کنید‪ ،‬اگر بر روي حالت‬
‫‪ Full‬قرار داشته باشد از ديتابیس مورد نظر يک فايل ‪ Log‬هم گرفته میشود که قبالً اين موضوع را توضیح‬
‫داديم‪ ،‬اگر از اين روش پشتیبانگیري استفاده کنید از دادههاي ‪ log‬هم پشتیبان تهیه خواهد شد و يک مزيت‬
‫آن اين است که بعد از انجام اين نوع پشتیبانگیري حجم فايل ‪ log‬ديتابیس کاهش پیدا خواهد کرد و ديگر‬
‫نیاز نیست خودتان آن را کم کنید‪.‬‬
‫‪Maintenance Cleanup Task‬‬ ‫‪-10‬‬
‫اين گزينه براي حذف پروندههاي مربوط به برنامههاي نگهداري مانند پروندههاي ديتابیس و‪ ...‬کاربرد دارد‪.‬‬

‫بعد از بررسی گزينههاي مورد نظر براي تست کار بهمانند شکل ‪ 5-5‬سه گزينهي مورد نظر را انتخاب کنید و بر روي‬
‫‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪5-5‬‬
‫‪www.takbook.com‬‬

‫‪267‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬
‫همانطور که در شکل ‪ 5-6‬مشاهده میکنید سه گزينهي مورد نظر انتخاب شده است و براي ادامه بر روي ‪ Next‬کلیک‬
‫کنید‪.‬‬

‫شکل ‪5-6‬‬

‫بهمانند شکل ‪ 5-7‬بايد مشخص کنید که چه ديتابیسی بايد انتخاب شود تا عملیات ‪ Check Integrity‬بر روي آن اعمال‬
‫و يا خودتان‬ ‫‪System Database‬‬ ‫شود که میتوانید با انتخاب گزينهي ‪ All databases‬همهي آنها را انتخاب کنید و يا‬
‫انتخاب کنید که بهتر است گزينهي ‪ All databases‬را انتخاب کنید‪.‬‬

‫شکل ‪5-7‬‬

‫بعد از انتخاب ‪ All database‬چند گزينه را در شکل ‪ 5-8‬مشاهده میکنید که در ادامه آنها را معرفی میکنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪268‬‬

‫شکل ‪5-8‬‬

‫‪Include Indexes‬‬
‫اين گزينه براي بررسی درستی و يکپارچگی ايندکسهاي جداول در ديتابیس است که انجام میشود‪.‬‬

‫‪Physical Only‬‬
‫اين گزينه بعد از اجرا فقط ساختار ‪Page‬ها و سرصفحههاي رکوردهاي موجود را بررسی میکند‪.‬‬

‫‪Tablock‬‬
‫با فعالکردن اين گزينه ديتابیس مورد نظر براي مدتزمان کوتاهی قفل شده و دستور بررسی سالمت ديتابیس يعنی‬
‫‪ DBCC CHECKDB‬فعال میشود و بعد از اجرا دستور ديتابیس مورد نظر از قفل باز میشود‪ ،‬بکی از ويژگیهاي اين‬
‫روش بعد از اجرا باعث افزايش سرعت بررسی ديتابیس خواهد شد‪.‬‬

‫‪Max Degree Of Parallelism‬‬


‫زمانی که از دستور بررسی سالمت ديتابیس يعنی ‪ DBCC CHECKDB‬استفاده میکنید ‪ SQL‬از تمام توان ‪ CPU‬استفاده‬
‫خواهد کرد‪ ،‬با اين گزينه میتوانید مشخص کنید که در زمان اجرا از چند هستهي ‪ CPU‬استفاده شود‪.‬‬
‫اگر به پايین شکل ‪ 5-9‬توجه کنید‪ ،‬شما میتوانید براي اين وظیفه يک زمانبندي مشخص ايجاد کنید‪ ،‬براي اين کار‬
‫بر روي ‪ Change‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪269‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-9‬‬

‫در شکل ‪ 5-9‬بايد يک نام براي زمانبندي خود وارد کنید و بعد بايد مشخص کنید که اين وظیفه در چه زمانهايی‬
‫اجرا شود مثالً میتوانید هفتگی انتخاب کنید يا بهصورت روزانه که در اينجا روزانه را انتخاب میکنیم‪ ،‬در قسمت‬
‫سوم می توانیم ساعت اجرا اين وظیفه را مشخص کنیم که ساعت ‪ 12‬بامداد انتخاب شده است و در قسمت آخر‬
‫میتوانید مشخص کنید که اين زمانبندي از چه تاريخی اجرا شود که بهصورت پیشفرض تاريخ امروز انتخاب خواهد‬
‫شد‪ ،‬بر روي ‪ OK‬کلیک کنید‪.‬‬
‫در شکل ‪ 5-10‬بايد مشخص کنید که چه ديتابیسهايی را میخواهید بر روي آن عملیات ‪ shrink‬انجام دهید که دو‬
‫ديتابیس که با هم ايجاد کرديم را انتخاب میکنیم‪ ،‬اگر در پايین صفحه تک گزينهي ‪ ignore..‬را انتخاب کنید در زمان‬
‫‪ Shrink‬از ديتابیسهايی که آفالين هستند صرفنظر خواهد شد‪.‬‬

‫شکل ‪5-10‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪270‬‬


‫بعد از انتخاب ديتابیس بهمانند شکل ‪ 5-11‬دو گزينه وجود دارد‪ ،‬گزينهي اول عدد ‪ 50‬را نشان میدهد و اين‬
‫نشاندهندهي اين است که روي ديتابیسهايی که بیشتر از ‪ 50‬مگابايت حجم داشته باشند عملیات ‪ Shrink‬انجام خواهد‬
‫انجام نخواهد شد‪ ،‬در قسمت بعدي عدد ‪ 10‬درصد را مشاهده‬ ‫‪Shrink‬‬ ‫شد و اگر کمتر از اين مقدار باشد عملیات‬
‫میکنید که نشاندهندهي اين است که چند درصد از فضاي ديتابیس بعد از ‪ Shrink‬خالی بماند‪ ،‬گزينهي ‪ Retain‬هم‬
‫اگر انتخاب شود فقط صفحههاي انتهايی را به ابتداي فايل انتقال خواهد داد و با صفحات میانی کاري ندارد‪ ،‬در آخر‬
‫صفحه هم میتوانید زمانبندي اجرا را بهمانند قبل مشخص کنید‪.‬‬

‫شکل ‪5-11‬‬

‫را بايد مشخص کنید‪ ،‬براي اين کار بايد ديتابیس مورد نظر خود را انتخاب‬ ‫‪Full backups‬‬ ‫در شکل زير نحوه انجام‬
‫استفاده کنید تا همهي ديتابیسها اعم از سیستمی و‬ ‫‪All Databases‬‬ ‫کنید که بهترين حالت اين است که از گزينهي‬
‫کاربر را تخصیص دهد‪ .‬در پايین شکل ‪ 5-12‬نوع ذخیرهسازي فايل را بايد مشخص کنید که داراي سه حالت است‬
‫که در زير بررسی میکنیم‪.‬‬

‫شکل ‪5-12‬‬
‫‪www.takbook.com‬‬

‫‪271‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬
‫براي ذخیره کردن فايلهاي پشتیبان در هاردديسک سیستم خود و يا در يک آدرس شبکه است که در‬ ‫‪Disk‬‬ ‫گزينهي‬
‫ادامه بررسی میکنیم‪.‬‬
‫براي ذخیره اطالعات بر روي نوار مغناطیسی میشد که يک روش بسیار مقرونبهصرفه است‪ ،‬هرچند‬ ‫‪tape‬‬ ‫گزينهي‬
‫که بسیار قديمی شده ولی به علت ظرفیت باالي آن و قیمت پايین آن حتی در شرکتهاي بزرگ هم در حال استفاده‬
‫است‪.‬‬
‫گزينهي ‪ URL‬براي ذخیره کردن اطالعات در يک آدرس تحت وب طراحی شده است مانند آدرس زير‪:‬‬
‫‪'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2‬‬
‫'‪_0.bak‬‬
‫در پايین صفحه میتوانید زمانبندي مورد نظر خود را مشخص کنید‪ ،‬در‬ ‫‪Disk‬‬ ‫در ادامه کار بعد از انتخاب گزينهي‬
‫شکل ‪ 5-13‬بايد زمانبندي انجام ‪ Full Backup‬را مشخص کنید‪ ،‬براي انجام ‪ Full Backup‬بهتر است گزينهي هفتگی‬
‫را انتخاب کنید دلیل آ ن هم اين است که اگر تعداد زيادي ديتابیس با حجم باال داشته باشید انجام ‪ Full Backup‬میتواند‬
‫حجم زيادي را از حافظهي شما پر کند و بهترين کار اين است که بهصورت هفتگی اين کار را انجام دهید و به‬
‫‪ Differential Backup‬را بهصورت روزانه انجام دهید‪.‬‬

‫شکل ‪5-13‬‬

‫‪Backup‬‬ ‫در ادامه کار بهمانند شکل ‪ 5-14‬وارد تب ‪ Destination‬شويد و در اين تب بايد مشخص کنید که فايلهاي‬
‫انتخاب شده است توجه داشته باشید براي اينکه نرمافزار‬ ‫‪C:\Backups‬‬ ‫در کدام مسیر ذخیره شود که در اينجا مسیر‬
‫دسترسی ايجاد ‪ SubFolder‬را داشته باشید بهتر است تیک گزينهي ‪ Create a sub-directory‬را انتخاب کنید‪ ،‬در پايین‬
‫صفحه میتوانید پسوند فايل ‪ Backup‬خود را بهدلخواه وارد کنید که بهصورت پیشفرض پسوند ‪ bak‬وارد شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪272‬‬

‫شکل ‪5-14‬‬

‫در ادامه بهمانند شکل ‪ 5-15‬وارد تب ‪ Options‬شويد‪ ،‬در اين تب میتوانید با انتخاب گزينهي ‪Backup set will Expore‬‬

‫مشخص کنید که فايلهاي ‪ Backup‬بعد از مدت مشخصشدهي ‪ 14‬روز ازروي هارد پاک شوند و فايل ‪ Backup‬جديد‬
‫جايگزين آن شود‪.‬‬
‫يکی از مهمترين قسمتهايی که بايد مراقب آن باشد اين است که تیک گزينهي ‪ Verify Backup Integirity‬را انتخاب‬
‫کنید‪ ،‬اين گزينه بعد از انجام ‪ Backup‬فايل ‪ Backup‬را تست میکند تا سالم باشد و بعد از آن پردازش به پايان میرسد‪،‬‬
‫قابل بازگردانی نبودن و مدير شبکه با مشکل بزرگی روبرو شده است‪،‬‬ ‫‪Backup‬‬ ‫در جاهايی ديده شده که فايلهاي‬
‫پس حتماً تیک اين گزينه را بزنید‪ ،‬البته اگر حجم ‪ Backup‬زياد باشد مقدار زمان انجام عملیات بیشتر خواهد شد‪.‬‬
‫گزينهي ‪ Backup Encryption‬را اگر انتخاب کنید بر روي فايلهاي ‪ Backup‬يک رمز عبور به همراه هشینگ قدرتمند‬
‫قرار میدهد تاکسی نتواند اطالعات را به سرقت ببرد‪.‬‬
‫‪www.takbook.com‬‬

‫‪273‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-15‬‬

‫در ادامه بر روي ‪ Next‬کلیک کنید‪ ،‬در شکل ‪ 5-16‬می توانید مشخص کنید که گزارشگیري از اطالعات اين کار در‬
‫چه مسیري ذخیره شود‪ ،‬البته اين فايل بهصورت ‪ TXT‬است و اگر هم بخواهید به يک آدرس خاص ايمیل شود بايد‬
‫تیک گزينهي ‪ E-mail report‬را انتخاب کنید‪.‬‬

‫شکل ‪5-16‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪274‬‬


‫اگر اطالعاتی در شکل ‪ 5-17‬مورد قبول بود میتوانید بر روي ‪ Finish‬کلیک کنید‪.‬‬

‫شکل ‪5-17‬‬

‫همانطور که در شکل ‪ 5-18‬مشاهده میکنید اطالعات بهدرستی تأيید و ايجاد شده است‪.‬‬

‫شکل ‪5-18‬‬

‫در شکل ‪ Plan 5-19‬مورد نظر ايجاد شده است و براي اينکه بررسی کاملتري داشته باشیم بر روي آن کلیک راست‬
‫کنید و گزينهي ‪ Modify‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪275‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-19‬‬

‫در شکل ‪ 5-20‬هر سه قسمتی که در قسمتهاي قبل ايجاد کرديم را مشاهده میکنید اگر بر روي آنها کلیک کنید‬
‫عملکرد آنها را مشاهده خواهید کرد‪ ،‬در جلوي آنها زمانبندي را میتوانید تغییر يا حذف کنید و حتی میتوانید نام‬
‫هر يک از ‪Rule‬ها را تغییر دهید‪.‬‬

‫شکل ‪5-20‬‬

‫بعد از ايجاد ‪ Plan‬بايد آن را اجرا کنیم‪ ،‬براي اجرا بهمانند شکل ‪ 5-21‬بر روي ‪ Plan‬مورد نظر کلیک راست کنید و‬
‫گزينهي ‪ Execute‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪276‬‬

‫شکل ‪5-21‬‬

‫بعد از اجرا بهاحتمال زياد با خطاي شکل ‪ 5-22‬مواجه خواهید شد که آن هم به اين خاطر است که ما براي هر يک‬
‫از قسمتها يک زمانبندي تعريف کرديم و بهخاطر همین اين سه قسمت از هم جداشدن‪ ،‬براي حل اين مشکل بايد‬
‫آنها را در يک قسمت قرار دهیم‪.‬‬

‫شکل ‪5-22‬‬

‫براي حل مشکل بهمانند شکل ‪ 5-23‬وارد ‪ Modify‬شويد و ‪ Subplan_2‬و ‪ Subplan_3‬را از لیست حذف کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪277‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-23‬‬

‫در ادامه بهمانند شکل ‪ 5-24‬وارد منوي ‪ View‬شويد و بر روي ‪ Toolbox‬کلیک کنید‪ ،‬البته از سمت چپ هم میتوانستید‬
‫‪ ToolBox‬را اجرا کنید‪.‬‬

‫شکل ‪5-24‬‬

‫بهمانند شکل ‪ 5-25‬در ‪ subplan_1‬بايد گزينهي ‪ Shrink‬را کشیده و در محل مورد نظر رها کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪278‬‬

‫شکل ‪5-25‬‬

‫بايد فلش بااليی را به آن متصل کنید و بعد براي تنظیم آن دو بار برروي ‪ Dhrink‬کلیک‬ ‫‪Shrink‬‬ ‫بعد از اضافهکردن‬
‫کنید‪.‬‬

‫شکل ‪5-26‬‬

‫در شکل ‪ 5-27‬بايد ‪ All databases‬را انتخاب کنید و بر روي ‪ OK‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪279‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-27‬‬

‫را هم به لیست اضافه کنیم که اين کار را بايد بهمانند شکل ‪5-28‬‬ ‫‪Back UP Database Task‬‬ ‫در ادامه بايد گزينهي‬
‫انجام دهید‪.‬‬

‫شکل ‪5-28‬‬

‫بهمانند شکل ‪ 5-29‬گزينهي آخر را هم متصل کنید و با دو بار کلیک بر روي آن تنظیمات آن را هم به نسبت قبل‬
‫انجام دهید و اطالعات را ذخیره کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪280‬‬

‫شکل ‪5-29‬‬

‫بعد از اجراي مراحل باال اگر بهمانند شکل ‪ 5-30‬بر روي ‪ Execute‬کلیک کنید عملیات بهمانند شکل ‪ 5-31‬با موفقیت‬
‫انجام شود‪.‬‬

‫شکل ‪5-30‬‬
‫‪www.takbook.com‬‬

‫‪281‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-31‬‬

‫بهمانند شکل ‪ 5 -32‬وارد آدرس ذخیرهسازي ‪ Backup‬شويد و مشاهده خواهید کرد فايلهاي ‪ Backup‬بهدرستی ايجاد‬
‫شدهاند‪.‬‬

‫شکل ‪5-32‬‬

‫براي اينکه متوجه شويد ‪ Maintenance Plans‬چند بار اجرا شده و درست کار کرده يا نه بايد بهمانند شکل ‪ 5-33‬بايد‬
‫بر روي ‪ Plan‬مورد نظر کلیک راست و گزينهي ‪ View History‬را انتخاب کنید‪.‬‬

‫شکل ‪5-33‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪282‬‬


‫مورد نظر شما نمايش داده‬ ‫‪Plan‬‬ ‫در شکل ‪ 5-34‬نتیجه کار را مشاهده میکنید‪ ،‬توجه داشته باشید براي اينکه فقط‬
‫شود بايد تیک آن را انتخاب کنید‪.‬‬

‫شکل ‪5-34‬‬

‫همانطور که گفتیم عملیات ‪ Maintenance Plans‬توسط سرويس ‪ Agent‬انجام میشود اگر بهمانند شکل ‪ 5 -35‬وارد‬
‫قسمت ‪ SQL Server agent‬شويد میتوانید ‪ Plan‬مورد نظر را مشاهده و آن را اجرا و تنظیمات آن را تغییر دهید‪.‬‬

‫شکل ‪5-35‬‬

‫به لیست‬ ‫‪Back UP Database‬‬ ‫استفاده کنیم بايد بهمانند شکل ‪ 5-36‬يک‬ ‫‪Differential Backup‬‬ ‫براي اينکه بتوانیم از‬
‫اضافه کنید و بر روي آن کلیک راست کنید و گزينهي ‪ Edit‬را انتخاب کنید‪ ،‬يا اينکه دوبار کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪283‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-36‬‬

‫در شکل ‪ 5-37‬بايد در قسمت ‪ Backups Type‬گزينهي ‪ Differential‬را انتخاب کنید و ‪ All Database‬را هم انتخاب‬
‫کنید‪.‬‬

‫شکل ‪5-37‬‬

‫بهمانند شکل ‪ 5-38‬در تب ‪ Destination‬هم همان آدرس قبلی را انتخاب و تیک گزينهي مورد نظر را انتخاب کنید‪،‬‬
‫در تب ‪ Options‬هم همان گزينههاي قبلی را انتخاب و بر روي ‪ OK‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪284‬‬

‫شکل ‪5-38‬‬

‫بعد از انجام مراحل باال میتوانید بهمانند شکل ‪ Plan 5-39‬مورد نظر خود را اجرا کنید‪.‬‬

‫شکل ‪5-39‬‬

‫بعد از اجرا اين سرويس بهمانند شکل ‪ 5-40‬در هر اجرا دو فايل پشتیبان ايجاد میکند که يکی ‪ Full‬است و ديگري‬
‫‪ Differenctail‬که حجم آنها مشخصکننده فايل مورد نظر است‪.‬‬
‫آيا به نظر شما اين روش پشتیبانگیري درست است؟‬
‫نه اين روش کامالً اشتباه است‪ ،‬بهخاطر اينکه اين ‪ Plan‬که ايجاد کرديم هر دو فايل را در هر بار اجرا تولید میکند و‬
‫اين کار بسیار بر حجم فضاي ذخیرهسازي تاثیر گذار خواهد بود‪ ،‬براي حل اين مشکل بهتر است هر کدام را جداگانه‬
‫در يک ‪ Plan‬مختلف با زمانبندي مختلف قرار دهیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪285‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-40‬‬

‫در شکل ‪ 5-41‬دو ‪ Plan‬متفاوت ايجاد کرديم و در زمانبندي آنها براي ‪ Full Backup‬هفگی را مشخص کرديم و براي‬
‫‪ Differenctial‬روزانه را مشخص کرديم‪ ،‬با اين کار هر هفته يک ‪ Full‬و هر روز يک ‪ Differenctial‬گرفته خواهد شد‪.‬‬

‫شکل ‪5-41‬‬

‫‪SQL‬‬ ‫‪ 5-1-1‬پشتیبانگیري بهصورت دستی در‬


‫تا به اينجا توانستیم از طريق ‪ Maintenance Plans‬و بهصورت اتوماتیک از ديتابیسها پشتیبان تهیه کنیم‪ ،‬اما اگر بخواهید‬
‫بهصورت دستی و سريع از ديتابیس مورد نظر پشتیبان تهیه کنید بايد بهصورت زير عمل کرد‪.‬‬
‫بهمانند شکل ‪ 5-42‬بر روي ديتابیس مورد نظر خود کلیک راست کنید و از قسمت ‪ Tasks‬گزينهي ‪ BackUP‬را انتخاب‬
‫کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪286‬‬

‫شکل ‪5-42‬‬

‫را انتخاب میکنیم و در پايین صفحه بايد مسیر‬ ‫‪Full‬‬ ‫را انتخاب کنید که گزينهي‬ ‫‪Backup‬‬ ‫در شکل ‪ 5-43‬بايد نوع‬
‫قرار خواهد گرفت‪ ،‬ولی‬ ‫‪SQL‬‬ ‫را مشخص کنید که بهصورت پیشفرض در مسیر نصب‬ ‫‪Backup‬‬ ‫ذخیره شدن فايل‬
‫چون در قسمت قبلی از ‪ Plan‬استفاده کرديم مسیر را تغییر داده است‪ ،‬در تبهای دیگر هم یمتوانید مشخص کنید‬
‫که بعد از تهیه پشتیبان فایلها تست شوند تا مشکیل نداشته باشند‪.‬‬

‫شکل ‪5-43‬‬

‫بعد از کلیک بر روي ‪ OK‬در شکل ‪ 5-43‬عملیات شروع شده و تايید آن در شکل ‪ 5-44‬مشخص میشود‪.‬‬
‫‪www.takbook.com‬‬

‫‪287‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-44‬‬

‫‪Backup‬‬ ‫‪ 5-1-2‬نحوهي بازگرداندن فايلهاي‬


‫بعد از انجام پشتیبانگیري از ديتابیسهاي ‪ SQL‬بايد توانايی اين را داشته باشید در صورت خرابی هر يک از ديتابیسها‬
‫بتوانید آن را برگردانید‪.‬‬
‫براي اينجام دستور ‪ Restore‬بايد بهمانند شکل ‪ 5-45‬بر روي ديتابیس مورد نظر که مشکل دارد کلیک راست کنید و‬
‫از قسمت ‪ Tasks‬و بعد ‪ Restore‬گزينهي ‪ Database‬را انتخاب کنید‪.‬‬

‫شکل ‪5-45‬‬

‫در شکل ‪ 5-46‬بايد نام ديتابیس به همراه پشتیبانی که از قبل تهیه کرديد را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪288‬‬

‫شکل ‪5-46‬‬

‫توجه داشته باشید که براي اينکه فايل پشتیبان براي تاريخ خاصی را انتخاب کنید بايد در شکل ‪ 5-46‬بر روي ‪Timeline‬‬

‫کلیک کنید‪.‬‬
‫در شکل ‪ 5-47‬میتوانید با انتخاب گزينهي ‪ Last Backup taken‬از آخرين ‪ Backup‬گرفته شده استفاده کنید و يا اينکه‬
‫اگر تاريخ خاصی مد نظر شما هست بايد گزينهي ‪ Specific date and time‬را انتخاب کنید و بعد تاريخ مورد نظر خود‬
‫را مشخص کنید‪ ،‬البته در قسمت ‪ Timeline‬میتوانید بهصورت گرافیکی بر روي آيکونهاي مورد نظر کلیک کنید که‬
‫آيکون سبز پر رنگ نشاندهندهي ‪ Full Backup‬است‪.‬‬

‫شکل ‪5-47‬‬

‫بعد از اينکه بر روي ‪ OK‬کلیک کرديد بايد عملیات ‪ Restore‬انجام شود که در شکل ‪ 5-48‬اين موضوع را مشاهده‬
‫میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪289‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-48‬‬

‫‪ 5-1-3‬بازگرداندن ديتابیس حذف شده‬


‫در بعضی مواقع امداً يا سهواً ديتابیس از داخل ‪ SQL‬حذف میشود و ديگر نمیتوانیم به ان دسترسی داشته باشیم‪ ،‬در‬
‫بازگردانیم‪.‬‬ ‫اين زمان بايد نسخه پشتیبان را‬
‫بهمانند شکل ‪ 5-49‬بر روي پوشهي ‪ Databases‬کلیک راست کنید و گزينهي ‪ Restore Databases‬را انتخاب کنید‪.‬‬

‫شکل ‪5-49‬‬

‫در شکل ‪ 5-50‬شما بايد ديتابیسی که قرار است برگردانید را از لیست انتخاب کنید که اين کار به علت حذف ان‬
‫ديتابیس امکان پذير نیست بهخاطر همین موضوع بايد در قسمت ‪ Database‬نام ديتابیس خود را وارد کنید و در ادامه‬
‫بايد گزينهي ‪ Device‬کلیک کنید و بعد بر روي ‪ Browse‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪290‬‬

‫شکل ‪5-50‬‬

‫در شکل ‪ 5-51‬بايد بر روي ‪ Add‬کلیک کنید و فايل پشتیبان ‪ Full‬را به لیست اضافه و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪5-51‬‬

‫بهمانند شکل ‪ 5-52‬بعد از کلیک بر روي ‪ OK‬بهدرستی ديتابیس مورد نظر به لیست اضافه خواهد شد‪.‬‬
‫‪www.takbook.com‬‬

‫‪291‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-52‬‬

‫‪ Attach 5-1-4‬و ‪ Detach‬کردن ديتابیس‬


‫براي اينکه بتوانید يک ديتابیس را از لیست ‪ SQL‬مخفی و يا آن را اضافه کنید بايد از اين دستورات استفاده کنید‪ ،‬براي‬
‫را‬ ‫‪Detach‬‬ ‫گزينهي‬ ‫‪Tasks‬‬ ‫اين کار بهمانند شکل ‪ 5-53‬بر روي ديتابیس مورد نظر کلیک راست کنید و از قسمت‬
‫انتخاب کنید‪.‬‬

‫شکل ‪5-53‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪292‬‬


‫‪Drop Connection‬‬ ‫کلیک کنید‪ ،‬گزينهي‬ ‫‪OK‬‬ ‫در شکل ‪ 5-54‬بايد دو تیک مرود نظر را انتخاب کنید و بعد بر روي‬
‫ارتباط اين ديتابیس را با هر نرمافزاري قطع میکند و گزينهي بعدي براي آپديت اطالعات است‪.‬‬

‫شکل ‪5-54‬‬

‫همانطور که در شکل ‪ 2-55‬مشاهده میکنید ديتابیس ‪ DB1‬از لیست حذف شده است اين بدان معنا نیست که ديتابیس‬
‫از هارد حذف شده باشد بلکه فقط از لیست حذف شده است که اين موضوع را در شکل ‪ 5-56‬مشاهده میکنید‬

‫شکل ‪5-55‬‬

‫اگر بهمانند شکل ‪ 5-56‬وارد آدرس مورد نظر شويد ديتابیس ‪ DB1‬را مشاهده خواهید کرد‪.‬‬

‫شکل ‪5-56‬‬

‫اضافه کنیم بهمانند شکل ‪ 5-57‬بر روي پوشهي ‪ Databases‬کلیک راست کنید‬ ‫‪SQL‬‬ ‫براي اينکه دوباره ديتابیس را به‬
‫و گزينهي ‪ Attach‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪293‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪5-57‬‬

‫در شکل ‪ 5-58‬بر روي ‪ Add‬کلیک کنید و ديتابیس ‪ DB1‬را از آدرس مورد نظر که در شکل ‪ 5-56‬مشخص کرديم‬
‫انتخاب کنید و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪5-58‬‬

‫استفادههاي ديگر اين ابزار زمانی است بخواهید سرور ‪ SQL‬خود را تغییر دهید و ديتابیسها را از يک سرور به سرور‬
‫ديگر انتقال دهید‪ ،‬البته راههاي بهتر و متنوعتري هم براي اين کار وجود دارد‪.‬‬

‫‪ 5-2‬پشتیبانگیري از طريق نرمافزار ‪Veeam Backup‬‬


‫يک نرمافزار قدرتمند در پشتیبانگیري است که حداکثر اطمینان را براي شما به ارمغان میآورد؛ با اين نرمافزار‬
‫فوقالعاده میتوانید از نرمافزارها‪ ،‬فايلها‪ ،‬سايتها و‪ ...‬پشتیبان تهیّه کنید و کمتر از چند ثانیه آن را برگردانید‪ .‬نرمافزار‬
‫‪ ،Veeam‬يکی از بهترينها در بازار نرمافزارها است و بهخاطر اطمینان کامل در بازگردانی اطّالعات‪ ،‬رقیبی مقابل خود‬
‫نمیبیند‪.‬‬
‫‪Veeam Backup and Replication‬‬ ‫‪ 5-2-1‬نصب نرمافزار‬
‫اين نرمافزار بهمانند ديگر نرمافزارها داراي نیازمنديهايی براي نصب است که در زير آنها را مورد بررسی قرار میدهیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪294‬‬


‫جدول ‪ 5-1‬نیازمندی سختافزاری‬

‫پردازنده بهتر است‪ ،‬حداقل دو هستهاي و ‪ 2‬گیگاهرتز سرعت داشته باشد‪.‬‬ ‫پردازنده‬
‫حداقل رم بايد ‪ 4‬گیگابايت باشد تا عملکرد متوسّط از سرور را داشته باشیم‪.‬‬ ‫رم‬
‫بهترين حالت استفاده از کارت شبکه‪ ،‬گیگابايت است تا حداکثر سرعت را در‬ ‫کارت‬
‫انتقال فايل داشته باشیم‪.‬‬ ‫شبکه‬
‫هارددیسک براي نصب و راهاندازي‪ ،‬حداقل بايد ‪ 6‬گیگابايت محلّ ذخیرهسازي داشته باشیم‪،‬‬
‫و ذخیره اين فايلها بايد هاردهايی با ظرفیّت باال به‬ ‫‪Backup‬‬ ‫البتّه براي اجراي‬
‫نسبت شبکه داشته باشیم تا کلّ اطّالعات شبکة ما را پشتیبانی کند‪.‬‬

‫جدول ‪ 5-2‬نیازمندی نرمافزاری‬

‫سیستمعامل از سیستمعامل ويندوز که لیست آن در زير آمده است‪ ،‬میتوان استفاده کرد‪:‬‬
‫‪Microsoft Windows Server 2019‬‬
‫‪Microsoft Windows Server 2016‬‬
‫‪Microsoft Windows Server 2012 R2‬‬
‫‪Microsoft Windows Server 2012‬‬
‫‪Microsoft Windows Server 2008 R2 SP1‬‬
‫‪Microsoft Windows Server 2008 SP2‬‬
‫‪Microsoft Windows 10‬‬
‫‪Microsoft Windows 8.x‬‬
‫‪Microsoft Windows 7 SP1‬‬

‫اين نرمافزارهاي اوّلیّه براي نصب ‪ Veeam‬موردنیاز است‪:‬‬ ‫نرمافزار‬


‫‪Microsoft .NET Framework 4.5.2‬‬
‫‪Microsoft Windows Installer 4.5‬‬
‫‪Microsoft SQL Server Management Objects‬‬
‫‪Microsoft SQL Server System CLR Types‬‬
‫‪Microsoft Visual C++ 2010 Service Pack 1 redistributable package‬‬
‫در زير‪ ،‬لیستی از ديتابیسهاي مورد استفادة نرمافزار ‪ Veeam‬را مشاهده میکنید‪:‬‬ ‫ديتابیس‬
‫‪Microsoft SQL Server 2017‬‬
‫‪Microsoft SQL Server 2016‬‬
‫‪Microsoft SQL Server 2014‬‬
‫‪Microsoft SQL Server 2012 (Microsoft SQL Server 2012 SP3 Express Edition‬‬
‫)‪is included in the setup‬‬
‫‪Microsoft SQL Server 2008 R2‬‬
‫‪Microsoft SQL Server 2008‬‬

‫براي دانلود اين نرمافزار میتوانید از لینک زير استفاده کنید‪:‬‬


‫‪https://soft98.ir/software/backup/2098-veeam-backup.html‬‬
‫براي‬ ‫‪Enterprise‬‬ ‫کلیک کنید‪ ،‬گزينههاي ديگري نیز وجود دارد که گزينة‬ ‫‪Install‬‬ ‫بر روي‬ ‫‪Setup‬‬ ‫بعد از اجراي فايل‬
‫نیز براي ارتباط از سیستم خودتان با‬ ‫‪Console‬‬ ‫مديريّت چندين ‪ Backup & Replication Veeam‬کاربرد دارد و گزينة‬
‫سرورهاي ‪ Veeam‬است که فعالً کاري با آنها نداريم‪.‬‬
‫‪www.takbook.com‬‬

‫‪295‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-59‬نصب ‪Veeam‬‬

‫در شکل ‪ ،5-60‬قرار دادنامه را بررسی و تأيید کنید و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 5-60‬نصب ‪Veew‬‬

‫در شکل ‪ ،5-61‬اگر اليسنس نرمافزار را خريداري کرديد‪ ،‬بر روي ‪ Browse‬کلیک کنید و فايل اليسنس را معرّفی کنید‬
‫کلیک کنید که البته يک اليسنس‬ ‫‪Next‬‬ ‫و اگر اليسنسی در اختیار نداريد‪ ،‬میتوانید از آن صرفنظر کنید و بر روي‬
‫‪ Trial‬را براي شما در نظر میگیرد و بعد از چند روز غیرفعال خواهد شد‪.‬‬

‫شکل ‪ 5-61‬نصب ‪Veew‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪296‬‬


‫در شکل ‪ 5-62‬می توانید مسیر نصب و اجراي نرمافزار را تغییر دهید‪ ،‬حتماً مطمئن شويد که مسیر مورد نظر داراي‬
‫فضاي کافی براي نصب باشد‪ ،‬بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 5-62‬نصب ‪Veew‬‬

‫در شکل ‪ ،5-63‬اگر پیشنیازهاي نرمافزار بر روي سیستم شما نصب باشد‪ ،‬خطايی نمیدهد‪ ،‬امّا اگر با خطا مواجه‬
‫شديد میتوانید بر روي ‪ Install‬کلیک کنید تا کار نصب انجام شود‪.‬‬

‫شکل ‪ 5-63‬نصب ‪Veew‬‬

‫همانطور که در شکل ‪ 5-64‬مشاهده میکنید‪ ،‬پیشنیازهاي نرمافزار بهدرستی نصب شده است‪ ،‬بر روي ‪ Next‬کلیک‬
‫کنید‪.‬‬

‫شکل ‪ 5-64‬نصب ‪Veew‬‬


‫‪www.takbook.com‬‬

‫‪297‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬
‫در شکل ‪ 5-65‬بر روي ‪ Install‬کلیک کنید تا کار نصب آغاز شود‪.‬‬

‫شکل ‪ 5-65‬نصب ‪Veew‬‬

‫بعد از نصب‪ ،‬نرمافزار ‪ Veeam backup & Replication Console‬را اجرا کنید‪ ،‬بهمانند شکل ‪ 5-66‬در قسمت اوّل‪ ،‬کلمة‬
‫نوشته شده است که اشاره میکند به سیستمی که در حال کار با آن هستید و نرمافزار بر روي آن نصب‬ ‫‪Localhost‬‬

‫شده است‪ ،‬اگر نرمافزار بر روي سرور ديگري نصب شده باشد بايد بهجاي ‪ ،Localhost‬نام سرور مورد نظر را وارد‬
‫کنید‪ ،‬براي ورود از همان کاربري استفاده میکند که با آن وارد سیستم شدهايد؛ بر روي ‪ Connect‬کلیک کنید تا نرمافزار‬
‫اجرا شود‪.‬‬

‫شکل ‪ 5-66‬اجرای ‪Veeam‬‬

‫همانطور که در شکل ‪ 5-67‬مشاهده میکنید‪ ،‬نرمافزار اجرا شده و آماده کار است‪ ،‬البته اليسنس آن بايد فعال شود‬
‫تا چند روز ديگر انقضا نشود‪ ،‬اين نرمافزار داراي ابزارهاي مختلفی است که میتواند عملکرد مشخصی را ارائه دهد‪،‬‬
‫در ادامه نحوهي پشتیبانگیري از ماشین مجازي و فايلهاي آنها مخصوصاً ديتابیس ‪ SQL‬را بررسی خواهیم کرد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪298‬‬

‫شکل ‪ 5-67‬اجرای نرمافزار‬

‫‪ 5-2-2‬اضافهکردن سرورها براي پشتیبانگیري‬


‫در قسمت ‪Inventory‬‬ ‫در شکل ‪ ،5-68‬براي اينکه سرورهاي و فايلهايی که قرار است از آنها پشتیبان تهیه کنیم را بايد‬
‫تعريف کنیم‪ ،‬حاال می تواند يک ماشین مجازي باشد و يا يک فايل خاص در مسیر مشخص از شبکه‪ ،‬براي معرفی‬
‫سرور خود میتوانید بر روي ‪ Add Server‬کلیک کنید‪.‬‬

‫شکل ‪5-68‬‬

‫بايد مشخص کنید که سیستم مجازيسازي شما مربوط به کدام شرکت است اگر از ‪VMware vSphere‬‬ ‫در شکل ‪5-69‬‬
‫استفاده میکنید گزينهي اول را انتخاب کنید و يا اگر از ‪ Hyper-v‬شرکت مايکروسافت استفاده میکنید گزينهي دوم‬
‫را انتخاب کنید‪ ،‬در مورد هر دو نرمافزار در کتابهاي مدير شبکه و ‪ Vmware Systems‬آموزش کافی داده شده و براي‬
‫دريافت می توانید به سايت بنده مراجعه کنید‪ ،‬براي ادامه کار بر روي گزينهي اول کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪299‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-69‬معرفی سرور ‪vSphere‬‬

‫در صفحهي شکل ‪ 5-70‬بر روي ‪ vSphere‬کلیک کنید تا سرور ‪ vCenter‬يا ‪ ESXi‬خود را معرفی کنیم‪.‬‬

‫شکل ‪ 5-70‬معرفی سرور ‪vSphere‬‬

‫در شکل ‪ 5-71‬بايد آدرس سرور ‪ ESXi‬يا ‪ vCenter‬خود را وارد کنید‪ ،‬توجّه داشته باشید‪ ،‬البته شايد براي راهاندازي‬
‫يا يک سرور فیزيکی استفاده کرده باشید که در ادامه کتاب نحوه‬ ‫‪VMware Workstation‬‬ ‫از نرمافزار‬ ‫‪SQL‬‬ ‫سرور‬
‫پشتیبانگیري از آنها هم آموزشداده شده است‪.‬‬

‫شکل ‪ 5-71‬معرفی سرور ‪ESXi‬‬

‫در شکل ‪ 5-72‬بايد نام کاربري که براي ورود به سرور استفاده میکنید را وارد کنید‪ ،‬براي اين کار بر روي ‪ Add‬کلیک‬
‫کنید و در قسمت شمارة دو‪ ،‬نام کاربر را وارد و بر روي ‪ OK‬کلیک کنید‪ ،‬پورت پیشفرض براي ارتباط با سرور‪443 ،‬‬
‫است که در صورت تغییر آن بايد شمارة پورت خود را وارد کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪300‬‬

‫شکل ‪ 5-72‬تعریف نام کاربری و رمز عبور‬

‫بعد از اينکه بر روي ‪ Apply‬کلیک کنید شکل ‪ 5-73‬ظاهر خواهد شد که بايد گواهینامهي سرور را مورد تأيید قرار‬
‫دهید‪.‬‬

‫شکل ‪ 5-73‬تأیید گواهینامه‬

‫همانطور که در شکل ‪ 5-74‬مشاهده میکنید سرور مورد نظر به لیست اضافه شده است و با کلیک بر روي آن همهي‬
‫ماشینهاي مجازي مورد نظر را مشاهده خواهید کرد‪.‬‬

‫شکل ‪ 5-74‬سرور ‪ESXi‬‬

‫بهمانند شکل ‪ ،5-75‬براي اينکه تستی از نرمافزار داشته باشیم‪ ،‬میتوانیم بر روي ماشین مجازي خود در سرور‬
‫‪ Vmware‬کلیک راست کنیم و از آن پشتیبان تهیّه کنیم‪ ،‬قسمت شمارة ‪ 1‬و ‪ ،2‬ابزارهايی براي اين کار وجود دارد؛ براي‬
‫شروع بر روي ‪ VeeamZip‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪301‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-75‬ایجاد پشتیبان دستی‬

‫در شکل ‪ 5-76‬بايد آدرس ذخیره شدن آن را بر روي سیستم خود مشخّص و بر روي ‪ ok‬کلیک کنید‪ ،‬توجه داشته‬
‫باشید که براي ذخیره اطالعات و فايلهاي پشتیبان بايد در قسمت ‪ Repository‬يک مسیر ذخیرهسازي مشخص کنیم‬
‫نصب شده است انتخاب شد ولی در ادامه و در‬ ‫‪Veeam‬‬ ‫که در اينجا بهصورت پیشفرض يک مسیر در سروري که‬
‫قسمت ‪ Repository‬حتماً مراحل را بهصورت کامل بررسی خ‪.‬اهیم کرد‪.‬‬

‫شکل ‪ 5-76‬ایجاد پشتیبان دستی‬

‫براي اينکه متوجّه شويم کاري که انجام داديم بهدرستی عمل کرد يا نه بايد از سمت چپ بر روي ‪ Home‬کلیک کنید‬
‫و در قسمت ‪ Last 24 Houres‬میتوانیم آخرين تغییرات را مشاهده کنیم‪ ،‬در شکل ‪ 5-77‬مشخص شده است که عملیات‬
‫پشتیبانگیري از سرور ‪ SQL‬با موفقیت انجام شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪302‬‬

‫شکل ‪ 5-77‬تغیرات فایل‬

‫اگر بر روي هرکدام از ‪ Log‬هاي مورد نظر در شکل ‪ 5-77‬کلیک کنید‪ ،‬صفحهاي بهمانند شکل ‪ 5-78‬ظاهر میشود‪،‬‬
‫در اين قسمت‪ ،‬اطّالعات مربوط به فايلی که از آن پشتیبان تهیّه کرديد را مشاهده خواهید کرد‪ ،‬در اين قسمت میتوانید‬
‫اندازة بک آپ را در قسمت ‪ Transfer‬مشاهده کنید که برابر با ‪ 23.8‬گیگابايت است‪.‬‬

‫شکل ‪ 5-78‬بررسی ‪Log‬‬

‫اگر بخواهیم فايل پشتیبان را مشاهده کنید يا نه وارد مسیر ذخیرهسازي مورد نظر شويد که بهمانند شکل ‪5-79‬‬
‫بهصورت يک فايل تکّی در قسمت مشخّصشده ذخیره شده است و حجم آن نیز ‪ 23.8‬گیگابايت است‪ ،‬براي اينکه‬
‫از اين پشتیبان استفاده کنید بايد بر روي آن دو بار کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪303‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-79‬بررسی فایل پشتیبان‬

‫باتوجهبه شکل‪ ، 5-80‬اندازة فايل پشتیبان و تاريخ پشتیبانی آن مشخّص شده است که براي برگشت به آن روز بايد‬
‫فايل مورد نظر را از لیست‪ ،‬انتخاب و بر روي ‪ Restore‬کلیک کنید‪ ،‬با اين کار بسته بهسرعت شبکه و يا هاردديسک‬
‫سرور ماشین مورد نظر شما برگشت داده خواهد شد‬

‫شکل ‪ 5-80‬بررسی فایل پشتیبان‬

‫منوي شکل ‪ 5-81‬ظاهر خواهد شد که براي اينک ماشین مورد نظر را در همان مسیر‬ ‫‪Restore‬‬ ‫بعد از کلیک بر روي‬
‫‪ Restore‬کنیم بايد گزينهي ‪ Entire VM‬را انتخاب کنید‪.‬‬

‫شکل ‪ 5-81‬بررسی فایل پشتیبان‬

‫در شکل ‪ ،5-82‬آخرين بک آپ مربوط به ماشین مورد نظر را مشاهده میکنید که میتوانید تاريخ مورد نظر خود را‬
‫انتخاب کنید و بر روي ‪ Next‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪304‬‬

‫شکل ‪ 5-82‬برگشت دادن فایل پشتیبان‬

‫در شکل ‪ 5-83‬اگر گزينه ي اول را انتخاب کنید فايل پشتیبان دقیقاً جاي همان ماشین مورد نظر را خواهد گرفت و‬
‫اگر بخواهید مسیر آن را عوض کنید بايد گزينهي دوم را انتخاب کنید‪.‬‬

‫شکل ‪ 5-83‬برگشت دادن فایل پشتیبان‬

‫& ‪Backup‬‬ ‫روش ديگر براي استفاده از فايل بک آپ‪ ،‬اين است که بهمانند شکل ‪ 5-84‬از قسمت شمارة يک وارد‬
‫را انتخاب کنید؛ با انتخاب اين گزينه‪ ،‬صفحة مربوط به فايلهاي‬ ‫‪Disk‬‬ ‫شويد و از قسمت شمارة دو‪،‬‬ ‫‪Replication‬‬

‫پشتیبانگیري شده را مشاهده خواهید کرد‪ ،‬بر روي فايل مورد نظر کلیک راست کنید؛ در اين منو گزينههاي مختلف‬
‫وجود دارد‪ ،‬با انتخاب گزينة اوّل میتوانید خیلی سريع بک آپ مورد نظر را برگردانید‪.‬‬

‫شکل ‪ 5-84‬برگشت دادن فایل پشتیبان‬

‫اگر بخواهید اطالعات ماشین مجازي را مشاهده کنید‪ ،‬مثالً می خواهید يک فايل خاصی را از درون ماشین مجازي و‬
‫‪Microsoft‬‬ ‫از يکی از درايوهايش برداريد‪ ،‬براي اين کار بايد بهمانند شکل ‪ 5-85‬از قسمت ‪ Restore guest files‬گزينهي‬
‫‪ Windows‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪305‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-85‬نمایش اطالعات ماشین مجازی‬

‫همانطور که در شکل ‪ 5-86‬مشاهده میکنید‪ ،‬فايلهاي مربوط به ماشین مجازي را مشاهده میکنید و اگر بخواهید‬
‫فايل خاصی را برگردانید بايد فايل مورد نظر را انتخاب کنید و در تب بااليی بر روي ‪ Restore‬کلیک کنید‪.‬‬

‫شکل ‪ 5-86‬نمایش اطالعات ماشین مجازی‬

‫اين روشهايی که با هم بررسی کرديم‪ ،‬کار سادهاي است که اين نرمافزار میتواند بهخوبی انجام دهد‪ ،‬در ادامه بیشتر‬
‫با ويژگیهاي قدرتمند آن آشنا خواهیم شد‪.‬‬

‫‪Backup‬‬ ‫‪ 5-2-3‬اضافهکردن سرور‬


‫در اين قسمت میخواهیم کمی کار را باکیفیتتر کنیم؛ کار اصولی و درست اين است که شما يک سرور پشتیبان يا‬
‫را به نرمافزار معرّفی کنید و ماشینها و اطّالعات را به آن سرور انتقال دهید‪ ،‬در اين قسمت‬ ‫‪Repository‬‬ ‫همان‪،‬‬
‫میخواهیم اين کار را با هم انجام دهیم‪ .‬سروري که براي اين کار انتخاب میکنید بايد از سرعت شبکة خوبی برخوردار‬
‫باشد‪ ،‬يعنی بايد حداقل سرعت گیگابايت داشته باشد تا در موقع پشتیبانگیري با عملکرد ضعیف روبرو نشويد‪ ،‬در‬
‫بخش ديگر بايد هاردديسک با ظرفیّت باال براي آن در نظر بگیريد تا با کمبود فضا روبرو نشويد‪ ،‬اگر براي شرکت‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪306‬‬


‫شما‪ ،‬هزينه مالک نیست میتوانید از هاردديسکهاي ‪ SAS‬با سرعت باال استفاده کنید که البتّه نیاز به سرورهايی دارد‬
‫که آنها را پشتیبانی کند‪.‬‬
‫براي شروع کار میخواهیم يک سرور معمولی را به نرمافزار اضافه کنیم تا در ادامة کار بتوانیم بهعنوان يک پشتیبان‬
‫از آن استفاده کنیم‪.‬‬
‫بهمانند شکل ‪ 5-87‬وارد قسمت ‪ Backup Infrastructure‬شويد و از سمت چپ بر روي ‪ Microsoft Windows‬کلیک‬
‫‪Add Server‬‬ ‫کنید‪ ،‬بهخاطر اين موضوع اين گزينه را انتخاب کرديم که سیستمعامل ما از نوع ويندوز است‪ ،‬بر روي‬
‫کلیک کنید‪.‬‬

‫شکل ‪ 5-87‬اضافهکردن سرور‬

‫در شکل ‪ 5-88‬بايد در قسمت مورد نظر‪ ،‬نام يا آدرس ‪ IP‬سرور خود که قرار است نقش پشتیبان را بازي کند را وارد‬
‫کنید و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 5-88‬اضافهکردن سرور‬

‫در شکل ‪ 5-89‬با کلیک بر روي ‪ Add‬بايد نام کاربري را وارد کنید که دسترسی کامل به شبکه داشته باشد‪ ،‬اگر از قبل‬
‫وارد کرديد‪ ،‬می توانید آن را از لیست انتخاب کنید؛ در قسمت پايین صفحه‪ ،‬گزينة ‪ Port‬وجود دارد که پورتهايی را‬
‫که نرمافزار نیاز دارد تا با اين سرور در ارتباط باشد را مشخّص میکند که البتّه قابل تغییر است‪.‬‬
‫‪www.takbook.com‬‬

‫‪307‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-89‬اضافهکردن سرور‬

‫همانطور که در شکل ‪ 5-90‬مشاهده میکنید‪ ،‬اطّالعات در سرور ‪ FS‬در حال نصب است‪ ،‬اگر به شکل ‪ 5-90‬دقّت‬
‫انتقال داده شد و در حال نصب است که اين پکیج‪ ،‬شامل‬ ‫‪FS‬‬ ‫به سیستم‬ ‫‪Transport Veeam‬‬ ‫کنید‪ ،‬يک پکیج با نام‬
‫سرويسهاي مربوط به نرمافزار ‪ Veeam‬است‪ ،‬بعد از پايان کار بر روي ‪ Finish‬کلیک کنید‪.‬‬

‫شکل ‪ 5-90‬اضافهکردن سرور‬

‫در مرحلة بعد بايد سیستمی را که بهعنوان پشتیبان اضافه کرديد را در لیست ‪ Repositories‬يا همان‪ ،‬مخزن اضافه کنید‬
‫شويد و در‬ ‫‪Backup Repositories‬‬ ‫تا بتوانید اطّالعات را به آن انتقال دهید‪ ،‬براي اين کار بهمانند شکل ‪ 5-91‬وارد‬
‫صفحه باز شده کلیک راست و گزينهي ‪ Add backup repository‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪308‬‬

‫شکل ‪ 5-91‬اضافهکردن ‪Repoeitory‬‬

‫در شکل ‪ 5-92‬چند نوع مختلف ‪ Repository‬وجود دارد که براي اين قسمت بايد گزينهي اول را انتخاب کنید‪.‬‬

‫شکل ‪ 5-92‬اضافهکردن ‪Repoeitory‬‬

‫در شکل ‪ 5-92‬سیستمعامل ويندوز را انتخاب و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 5-92‬انتخاب سیستمعامل‬


‫‪www.takbook.com‬‬

‫‪309‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬
‫در شکل ‪ 5-93‬بايد از قسمت‪ ،Repository Server‬نام سرور خود را انتخاب کنید‪ ،‬اگر بر روي ‪ Populate‬کلیک کنید‪،‬‬
‫کلّ درايوهاي سیستم مورد نظر را براي شما مشخّص میکند‪ ،‬بعدازاين کار بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 5-93‬انتخاب ‪Storage‬‬

‫در شکل ‪ 5-94‬بايد درايو مورد نظر را در سرور انتخاب کنید‪ ،‬اگر بر روي ‪ Populate‬کلیک کنید‪ ،‬فضاي خالی آن را‬
‫مشاهده خواهید کرد‪ ،‬در قسمت شمارة يک میتوانید تعداد وظايف همزمان را مشخّص کنید‪ ،‬مثالً در اين شکل‪ ،‬عدد‬
‫چهار در نظر گرفته شده است که همزمان‪ ،‬چهار وظیفه میتواند بر روي اين سیستم (‪ )FS‬اجرا کرد‪.‬‬

‫شکل ‪ 5-94‬اضافهکردن ‪Storage‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪310‬‬


‫در قسمت شمارة دو میتوانید‪ ،‬مشخّص کنید که سرعت خواندن و نوشتن در سیستم چقدر باشد‪ ،‬با اين کار میتوانید‬
‫‪Advanced‬‬ ‫سرور را بهتر مديريّت کنید و از اينکه سیستم مورد نظر از شبکه خارج شود‪ ،‬جلوگیري کنید‪ ،‬در قسمت‬
‫گزينههايی وجود دارد که در صورت نیاز آنها را بررسی خواهیم کرد‪.‬‬

‫شکل ‪ 5-95‬مربوط به ‪ Restore‬شدن اطّالعات و نمايش آن است که بايد ‪ Mount Server‬را مشخّص کنید که همان‪،‬‬
‫بر روي سیستم شما‬ ‫‪NFS‬‬ ‫با همان را انتخاب میکنیم‪ ،‬تیک گزينة مورد نظر را انتخاب کنید تا سرويس‬ ‫‪FS‬‬ ‫سیستم‬
‫فعّال شود‪ ،‬توجّه داشته باشید‪ ،‬اگر از قبل بر روي سیستم شما اين سرويس نصب شده باشد در اين قسمت اين‬
‫نیز میتوانید آدرسی براي ذخیره شدن‬ ‫‪Folder‬‬ ‫سرويس نصب نخواهد شد و با مشکل روبرو میشويد‪ ،‬در قسمت‬
‫اطّالعات مشخّص کنید و بعدازاين کار بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 5-95‬ایجاد ‪Repository‬‬

‫در اين صفحه‪ ،‬اطّالعات کلّی را مشاهده میکنید‪ ،‬اگر تیک گزينة آخر‪ ،‬يعنی …‪ Import Ex‬را انتخاب کنید‪ ،‬نرمافزار‬
‫بهصورت اتوماتیک از بکآپهاي قبلی نیز استفاده خواهد کرد و اگر تیک بعدي انتخاب شود‪ ،‬فايلهاي ‪ Index‬را نیز‬
‫به بک آپ اضافه میکند‪.‬‬

‫شکل ‪ 5-96‬نصب ‪ Agent‬در ویندوز‬


‫‪www.takbook.com‬‬

‫‪311‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬
‫همانطور که در شکل ‪ 5-97‬مشاهده میکنید‪ ،‬نرمافزارهاي مورد نظر در سرور نصب شده است‪.‬‬

‫شکل ‪ 5-97‬نصب ‪Agent‬‬

‫در شکل ‪ ،5-98‬سؤال میکند که آيا مايل هستید ‪ Repository‬پیشفرض را تغییر دهید يا نه که بايد بر روي ‪ Yes‬کلیک‬
‫کنید‪.‬‬

‫شکل ‪ 5-98‬انتخاب ‪Repository‬‬

‫بعد از انجام مراحل باال براي تست بهمانند شکل ‪ 5-99‬وارد قسمت ‪ Fils‬شويد‪ ،‬در اين قسمت میتوانید سرورها و‬
‫سیستم هاي کالينتی خود را به لیست اضافه کنید و از آنها پشتیبان تهیّه کنید‪ ،‬براي تعريف سرور جديد و اضافهکردن‬
‫آن به لیست بايد بر روي ‪ Add Server‬کلیک کنید‪.‬‬

‫شکل ‪ 5-99‬بررسی سرور‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪312‬‬


‫در شکل ‪ 5-100‬وارد يکی از سیستمها که به لیست اضافه کرديم‪ ،‬شديم؛ بر روي يکی از فايلها که داخل درايو آن‬
‫است‪ ،‬کلیک راست کنید و گزينة ‪ Add to File Copy Job‬و سپس گزينة ‪ New job‬را انتخاب کنید‪.‬‬

‫شکل ‪5-100‬‬

‫در شکل ‪ ،5-101‬نام مورد نظر خود را وارد و بر روي ‪ next‬کلیک کنید‪.‬‬

‫شکل ‪ 5-101‬ایجاد ‪job‬‬

‫در شکل ‪ 5-102‬بايد فايلهاي منبع خود را انتخاب کنید تا يک پشتیبان از آن تهیّه کنید‪ ،‬براي اضافهکردن فايل جديد‬
‫میتوانید بر روي ‪ Add‬کلیک کنید‪.‬‬

‫شکل ‪ 5-102‬ایجاد ‪job‬‬

‫‪Path‬‬ ‫در شکل ‪ 5-103‬بايد سرور مقصد که در قسمت قبل به لیست اضافه کرديم را انتخاب کنید‪ ،‬سپس در قسمت‬
‫‪ ،to folder‬هاردديسک داخل سرور را انتخاب و بر روي ‪ Next‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪313‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-103‬ایجاد ‪job‬‬

‫در شکل ‪ 5-104‬بايد زمان انجام اين کار را مشخّص کنید تا بهصورت اتوماتیک در زمان مشخّصشده‪ ،‬کار پشتیبان‪-‬‬
‫گ یري انجام شود‪ ،‬سعی کنید زمان آن را در ساعات بیکاري سرور در نظر بگیريد تا مشکلی در شبکه پیش نیايد؛ بر‬
‫روي ‪ Save‬کلیک کنید‪.‬‬

‫شکل ‪ 5-104‬ایجاد ‪job‬‬

‫اگر میخواهید بعد از بستن اين پنجره‪ ،‬کار پشتیبانگیري آغاز شود بايد تیک گزينة…‪ Run the job when‬را بهمانند‬
‫شکل ‪ 5-105‬انتخاب و بر روي ‪ Finish‬کلیک کنید‪.‬‬

‫شکل ‪ 5-105‬ایجاد ‪job‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪314‬‬


‫اگر به شکل ‪ 5-106‬دقت کنید فايل مورد نظر که براي انتقال انتخاب کرده بوديم در مسیر مشخص شده کپی شده‬
‫است‪ ،‬حاال شما می توانید هر فايلی را براي اين کار انتخاب کنید‪ ،‬فقط توجه داشته باشید که فايلی که انتخاب میکنید‬
‫توسط پردازش ديگر در حال استفاده نباشد که با خطا روبرو خواهید شد‪.‬‬

‫شکل ‪ 5-106‬انتقال فایل‬

‫‪ 5-2-4‬پشتیبانگیري از ماشین مجازي‬


‫وارد & ‪Backup‬‬ ‫خوب در ادامه میخواهیم از ماشین مجازي پشتیبان تهیه کنیم‪ ،‬براي اين کار بهمانند شکل ‪5-107‬‬
‫‪ Replication‬شويد و از منوي بااليی بر روي ‪ Backup Job‬کلیک کنید و بعد گزينهي ‪ Virtual machine‬را انتخاب کنید‪.‬‬

‫شکل ‪ 5-107‬اضافهکردن ماشین مجازی‬

‫در شکل ‪ 5-108‬يک نام بهدلخواه وارد و بر روي ‪ Next‬کلیک کنید‪.‬‬


‫‪www.takbook.com‬‬

‫‪315‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-108‬اضافهکردن ماشین مجازی‬

‫در شکل ‪ 5-109‬میتوانید تمام ماشین هاي مجازي يا تنها‪ ،‬يکی را به لیست اضافه کنید‪ ،‬براي اين کار بايد بر روي‬
‫‪ Add‬کلیک کنید‪.‬‬

‫شکل ‪ 5-109‬اضافهکردن ماشین مجازی‬

‫در شکل ‪ 5-110‬در قسمت ‪ Repository Backup‬بايد سرور مورد نظر خود را انتخاب کنید که بعد از انتخاب‪ ،‬مقدار‬
‫را انتخاب کنید‪،‬‬ ‫…‪Configure secondary‬‬ ‫فضاي خالی از کلّ هارد را در زير آن نمايش میدهد‪ ،‬اگر تیک گزينة‬
‫میتوانید در ادامه يک سرور ‪ Repository‬ديگري براي گرفتن پشتیبان دوّم انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪316‬‬

‫شکل ‪ 5-110‬اضافهکردن ماشین مجازی‬

‫کلیک کنید تا اين گزينه را نیز بررسی کنیم‪ ،‬بهمانند شکل ‪ 5-111‬در‬ ‫‪Advanced‬‬ ‫بعد از انجام مراحل باال بر روي‬
‫قسمت ‪ Advanced‬و در تب ‪ ،Backup‬گزينة ‪ Incremental‬را براي انجام پشتیبانگیري از تغییرات انتخاب کنید و بعد‪،‬‬
‫گزينة ‪ backups Create active full‬را انتخاب کنید تا يک هفته‪ ،‬يکبار‪ ،‬يا چند بار از ماشین مورد نظر پشتیبان کامل‬
‫تهیّه کند‪.‬‬

‫شکل ‪ 5-111‬بررسی قسمت ‪Advanced‬‬

‫بهمانند شکل ‪ 5-112‬در قسمت ‪ ،Maintenance‬شمارة يک‪ ،‬براي اينکه از وضعیّت سالم بودن فايلهاي پشتیبان خود‬
‫مطّلع شويم‪ ،‬اين گزينه را فعّال میکنیم‪ ،‬در قسمت شمارة دو میتوانید بر اساس روزهايی که نیاز به فايل پشتیبان‬
‫داريد‪ ،‬يک عدد بهجاي عدد ‪ 14‬وارد کنید که تعداد روز نگهداري از فايل پشتیبان را به شما اعالم میکند‪ ،‬در قسمت‬
‫شمارة سه‪ ،‬اگر اين گزينه را فعّال کنید‪ ،‬فايلهاي پشتیبان‪ Defragment ،‬خواهند شد تا فضاي اضافی بین آنها کم شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪317‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-112‬بررسی قسمت ‪Advanced‬‬

‫بهمانند شکل ‪ 5-113‬در تب ‪ Storage‬و در قسمت اوّل میتوانید تیک هر سه گزينه را که يکسري دستورالعمل براي‬
‫کاهش حجم فايل پشتیبان است را انتخاب کنید‪ ،‬در قسمت شمارة دو میتوانید طبق سرعت پردازندة خودتان‪ ،‬مقدار‬
‫فشردهسازي فايلهاي پشتیبان را انتخاب کنید و در گزينة پايین آن میتوانید به نسبت سرعت شبکه‪ ،‬يکی از گزينهها‬
‫را انتخاب کنید‪ ،‬مثالً اگر از شبکة داخلی استفاده میکنید‪ ،‬میتوانید گزينة ‪ LAN‬را انتخاب کنید‪ ،‬در قسمت شمارة سه‬
‫میتوانید رمز عبور بر روي فايلهاي پشتیبان خود قرار دهید‪.‬‬

‫شکل ‪ 5-113‬بررسی قسمت ‪Advanced‬‬

‫بهمانند شکل ‪ 5-114‬در تب ‪ Notification‬میتوانید يک آدرس ايمیل وارد کنید تا تمام رويدادهايی که در اين پشتیبانی‬
‫انجام میشود‪ ،‬براي شما ايمیل شود‪ .‬بقیّة تبها را در صورت نیاز بررسی خواهیم کرد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪318‬‬

‫شکل ‪ 5-114‬بررسی قسمت ‪Advanced‬‬

‫در شکل ‪ 5-115‬با فعالکردن اين دو گزينه میتوانید به نرمافزار اين امکان را دهید تا بر روي سرويسها‪ ،‬مانند‪:‬‬
‫‪ Active Directory‬يا بر روي جدولهاي ‪ SQL‬تغییرات ايجاد کند که در ادامه اين کار را انجام خواهیم داد‪.‬‬

‫شکل ‪ 5-115‬اضافهکردن ماشین مجازی‬

‫شکل ‪ 5-116‬در اين قسمت بايد زمان انجام کار را مشخّص کنید‪ ،‬بهتر است زمان مورد نظر در ساعات بیکاري شبکه‬
‫باشد؛ بر روي ‪ Save‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪319‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-116‬اضافهکردن ماشین مجازی‬

‫در شکل ‪ ،5-117‬تیک گزينة مورد نظر را انتخاب کنید تا بعد از بسته شدن صفحه‪ ،‬کار پشتیبانگیري آغاز شود‪.‬‬

‫شکل ‪ 5-117‬اضافهکردن ماشین مجازی‬

‫همانطور که در شکل ‪ 5-118‬مشاهده میکنید‪ ،‬فايل پشتیبان در حال تکمیل است‪.‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪320‬‬

‫شکل ‪ 5-118‬ایجاد پشتیبان از ماشین مجازی‬

‫بعد از انجام شدن پشتیبان‪ ،‬بهمانند شکل ‪ 5-119‬در قسمت ‪ ،Success‬میتوانید موفّق بودن کار را مشاهده کنید‪.‬‬

‫شکل ‪ 5-119‬پشتیبانگیری از ماشین مجازی‬

‫‪Veeam Agent‬‬ ‫‪ 5-2-5‬استفاده از‬


‫يکی از ابزارهاي فوقالعادة نرمافزار ‪ ،Veeam‬استفاده از سرويس ‪ Agent‬است که به شما اين امکان را میدهد که از‬
‫تمام اطالعات کالينت‪ ،‬يک پشتیبان تهیّه کنید‪ ،‬يعنی اينکه با نصب اين نرمافزار از سیستمهاي کاربران با تنظیمی که‬
‫بر روي آنها انجام میدهید‪ ،‬پشتیبان تهیّه خواهد شد و با ازدستدادن اطّالعات کاربري‪ ،‬مشکلی براي برگشت نخواهید‬
‫داشت‪ ،‬يعنی يک شبکة کامالً قابلاعتماد‪.‬‬
‫براي دانلود ‪ Veeam Agent‬به لینک زير مراجعه کنید‪:‬‬
‫‪https://www.veeam.com/downloads.html‬‬
‫‪www.takbook.com‬‬

‫‪321‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬
‫بهمانند شکل ‪ 5-120‬بايد بر روي لینک دانلود نسخهي ويندوزي آن کلیک و آن را دانلود کنید البته براي دانلود نیاز‬
‫به ثبتنام و ورود داريد که البته میتوانید از سايتهاي ايرانی اين نسخه را دانلود کنید‪.‬‬

‫شکل ‪ 5- 120‬دانلود ‪Veeam Agent‬‬

‫بعد از دانلود نرمافزار‪ ،‬آن را اجرا کنید و بر روي ‪ Install‬کلیک کنید‪.‬‬


‫در شکل ‪ 5-121‬از شما درخواست می شود که براي ايجاد يک فايل پشتیبان از سیستم خود‪ ،‬يک هاردديسک يا يک‬
‫فلش ديسک بر روي سیستم قرار دهید تا اين کار انجام شود‪ ،‬در غیر اين صورت بر روي تیک مورد نظر‪ ،‬کلیک و بر‬
‫روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪Veeam Agent 5-121‬‬

‫در شکل ‪ ،5-122‬تیک گزينة مورد نظر را برداريد و بر روي ‪ Finish‬کلیک کنید‪.‬‬

‫شکل ‪Veeam agent 5-122‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪322‬‬


‫بر روي آيکون آن کلیک راست کنید و از قسمت ‪ ،Backup‬گزينة‬ ‫‪Taskbar‬‬ ‫بعد از نصب بهمانند شکل ‪ 5-123‬در‬
‫‪ Configure Backup‬را انتخاب کنید‪.‬‬

‫شکل ‪ 5-123‬تنظیم ‪Veeam Agent‬‬

‫در شکل ‪ ،5-124‬سه گزينه را مشاهده میکنید که اگر گزينة اوّل انتخاب شود‪ ،‬از کلّ اطّالعات سیستم‪ ،‬پشتیبان تهیّه‬
‫خواهد کرد‪ ،‬يعنی از همة پارتیشنهاي موجود؛ در گزينة دوّم میتوانید پارتیشن مورد نظر خود را بهصورت دستی‬
‫انتخاب کنید و در قسمت آخر نیز میتوانید فايلهاي مشخّص خود را در پارتیشن انتخاب کنید؛ در حال حاضر‪ ،‬گزينة‬
‫اوّل را انتخاب و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 5-124‬تنظیم ‪Veeam agent‬‬

‫در شکل ‪ 5-125‬بايد مسیر ذخیرهسازي را انتخاب کنید که اين محل میتواند بر روي هاردديسک خود سیستم باشد‪،‬‬
‫‪backup Veeam‬‬ ‫يا بر روي شبکه يا بر روي مايکروسافت ‪ ondrive‬که البتّه در اينجا میخواهیم از گزينة سوّم‪ ،‬يعنی‬
‫‪ Repository‬که قبالً با هم ايجاد کرديم‪ ،‬استفاده کنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪323‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-125‬تنظیم ‪Veeam agent‬‬

‫در شکل ‪ ،5-126‬بايد آدرس سروري که بر روي آن‪ ،‬نرمافزار ‪ Backup & Repository‬را نصب کرديد را وارد کنید و‬
‫يک نام کاربري با دسترسی کامل را وارد کنید‪ ،‬اگر در موقع نصب نرمافزار‪ ،‬پورت آن را تغییر داديد‪ ،‬بايد در اين‬
‫قسمت نیز تغییر دهید و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 5-126‬تنظیم ‪Veeam agent‬‬

‫در شکل ‪ 5-127‬بايد ‪ Repository‬مورد نظر خود را انتخاب کنید‪ ،‬در قسمت پايین‪ ،‬مدّتزمان نگهداري از فايل پشتیبان‬
‫را که بهصورت پیشفرض‪ 14 ،‬روز است را تغییر دهید‪ ،‬بر روي ‪ Advcanced‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪324‬‬

‫شکل ‪ 5-127‬تنظیم ‪Veeam agent‬‬

‫را در طول ماه يا در طول هفته‬ ‫‪Backup Full‬‬ ‫میتوانید تعداد دفعات گرفتن‬ ‫‪Backup‬‬ ‫بهمانند شکل ‪ ،5-128‬در تب‬
‫مشخّص کنید که در اين قسمت بايد تیک گزينهي مورد نظر را فعّال کنید‪.‬‬

‫شکل ‪ 5-128‬تنظیم ‪Veeam agent‬‬

‫در تب ‪ Storage‬میتوانید حالت فشردهسازي و سرعت ذخیرهسازي آن را مشخّص کنید و بر روي آن‪ ،‬رمز عبور قرار‬
‫دهید که البتّه قبالً اين مورد را انجام داديم‪.‬‬
‫‪www.takbook.com‬‬

‫‪325‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-129‬تنظیم ‪Veeam agent‬‬

‫يک نکتهي مهم قبل از ادامهي اين قسمت‪ ،‬اين است که زمانی که به ‪ Repository‬متّصل میشويد بايد يک دسترسی‬
‫به آن منبع را براي اين کاربر يا کاربرانی که در حال متّصلشدن به آن هستند‪ ،‬مشخص کنید؛ براي اين کار دوباره وارد‬
‫سرور ‪ Veeam‬شويد‪.‬‬
‫در شکل ‪ ،5-130‬از سمت چپ بر روي ‪ Infrastructure Backup‬کلیک کنید و در قسمت ‪ ،Repository Backup‬گزينهي‬
‫‪Permissions Access‬‬ ‫مورد نظر خود را که از قبل ايجاد کرديد را انتخاب کنید و بر روي آن کلیک راست و گزينهي‬
‫را انتخاب کنید‪.‬‬

‫شکل ‪ 5-130‬تنظیم دسترسی ‪Veeam agent‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪326‬‬


‫در شکل ‪ 5-131‬بايد دسترسی الزم را به کاربر مورد نظر دهید‪ ،‬البتّه میتوانید گزينهي ‪ Allow to everyone‬را انتخاب‬
‫کنید که با فعّالکردن آن‪ ،‬همه می توانند به آن دسترسی داشته باشند که از نظر امنیّتی کار جالبی نیست‪ ،‬بهتر است‬
‫کلیک کنید و کاربر مورد نظر را به لیست اضافه‬ ‫‪Add‬‬ ‫گزينهي سوّم را بهمانند شکل روبرو انتخاب کنید و بر روي‬
‫کنید‪ ،‬در قسمت پايین صفحه میتوانید بر روي فايلهايی که در اين ‪ Repository‬قرار میگیرند‪ ،‬رمز قرار دهید‪.‬‬

‫شکل ‪ 5-131‬دسترسی به کاربر‬

‫در شکل ‪ 5-132‬در قسمت شمارهي يک میتوانید زمان پشتیبانگیري را مشخّص کنید‪ ،‬در قسمت شمارهي دو اگر‬
‫گزينهي اوّل را انتخاب کنید‪ ،‬در هنگام شروع پشتیبانگیري اگر سیستم خاموش باشد‪ ،‬بعد از روشن شدن آن‪ ،‬پشتیبان‪-‬‬
‫گیري آغاز خواهد شد و اگر گزينهي دوّم را انتخاب کنید‪ ،‬اين کار انجام نخواهد شد‪ ،‬در قسمت شمارهي سه نیز‬
‫میتوانید نوع ازدسترفتن سیستم را انتخاب کنید که بهترين گزينه‪ ،‬همان ‪ Keep Running‬است‪ ،‬در قسمت شمارهي‬
‫‪Log‬‬ ‫چهار می توانید نوع واکنش سیستم را در هنگام شروع به کار پشتیبانگیري مشخّص کنید که سیستم را ‪ Lock‬يا‬
‫‪ off‬کنید و در قسمت شمارهي پنج‪ ،‬اگر اين گزينه را فعّال کنید میتوانید مقدار زمان انجام پشتیبانگیري را مشخّص‬
‫‪Yes‬‬ ‫و بعد بر روي‬ ‫‪Apply‬‬ ‫کنید تا زمان زيادي را درگیر کار پشتیبانگیري نباشد و سیستم را خسته نکند‪ ،‬بر روي‬
‫کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪327‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-132‬تنظیم زمانبندی ‪Agent‬‬

‫کلیک کنید‪ ،‬البتّه اگر بخواهید بعد از بستن اين‬ ‫‪Finish‬‬ ‫در شکل ‪ ،5-133‬اطّالعات نهايی را مشاهده کنید و بر روي‬
‫پنجره‪ ،‬کار پشتیبانگیري آغاز شود‪ ،‬تیک مورد نظر را انتخاب و بر روي ‪ Finish‬کلیک کنید‪.‬‬

‫شکل ‪ 5-133‬تنظیم ‪Veeam Agent‬‬

‫همانطور که در شکل ‪ 5-134‬مشاهده میکنید‪ ،‬عملیّات پشتیبانگیري از ويندوز مورد نظر و ارسال آن به سیستم‬
‫‪ Veeam‬با موفّقیّت انجام شد‪ ،‬اگر بر روي هر يک از ستونهاي مورد نظر کلیک کنید میتوانید اطّالعات کاملتري از‬
‫پشتیبانگیري انجامشده به دست آوريد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪328‬‬

‫شکل ‪ 5-134‬اجرا نرمافزار ‪Veeam Agent‬‬

‫همانطور که در شکل ‪ 5-135‬مشاهده میکنید‪ ،‬مراحل ساخت و ايجاد فايل پشتیبان نمايشداده شده است‪ ،‬اگر‬
‫کلیک کنید و يا اگر‬ ‫‪Files Restore‬‬ ‫بخواهید فقط‪ ،‬فايل خاصّی را دوباره به موقعیّت خود برگردانید بايد بر روي‬
‫بخواهید کلّ پارتیشن را برگردانید بايد بر روي ‪ Restore Volumes‬کلیک کنید‪.‬‬

‫شکل ‪ 5-135‬تنظیمات ‪Veeam Agent‬‬

‫بازگرديد‪ ،‬دو گزينهي ديگر وجود دارد که براي انجام‬ ‫‪Configure backup‬‬ ‫باتوجهبه شکل ‪ ،5-136‬اگر دوباره به‬
‫‪ ،storage‬يک محلّ ذخیرهسازي را بر روي همان سیستم‬ ‫‪Local‬‬ ‫پشتیبانگیري مورداستفاده قرار میگیرد‪ ،‬گزينهي‬
‫مشخّص میکند که کار جالبی نخواهد بود و گزينهي ‪ Shared folder‬براي ذخیره در يکپوشهي اشتراکگذاري شده‬
‫مورداستفاده قرار میگیرد‪.‬‬
‫‪www.takbook.com‬‬

‫‪329‬‬
‫فصل ‪ / 5‬پشتیبانگیري و بازيابی‬

‫شکل ‪ 5-136‬تنظیمات ‪Veeam Agent‬‬

‫در شکل ‪ 5-137‬بايد آدرس فولدر به اشتراکگذاري شده را وارد کنید‪ ،‬مطمئن باشید که محلّ مورد نظر داراي فضاي‬
‫مناسب براي اين کار است‪ ،‬در قسمت پايین میتوانید نام کاربري را که به آن دسترسی دارد را وارد کنید‪.‬‬

‫شکل ‪ 5-137‬تنظیمات ‪Veeam Agent‬‬

‫براي بهدستآوردن بهترين عملکرد در شبکه بهتر است از هاردهاي‪ SSD‬و شبکه با سرعت گیگابايت استفاده کنید‪.‬‬
‫بهمانند شکل ‪ ،5-138‬اگر وارد نرمافزار شويد از سمت چپ و از قسمت ‪ ،Home‬قسمت ‪ Backups‬را باز کنید و بر‬
‫پشتیبان گرفته شده است را به ما نمايش میدهد و‬ ‫‪Agent‬‬ ‫کلیک کنید‪ ،‬با اين کار سروري که از طريق‬ ‫‪Disk‬‬ ‫روي‬
‫میتوانید آن را دوباره برگردانید و يا اطالعات آن را مشاهده کنید‪.‬‬
www.takbook.com

SQL Server 2019 ‫آموزش‬ 330

Veeam Agent ‫ تنظیمات‬5-138 ‫شکل‬


‫‪www.takbook.com‬‬

‫فصل ششم‬
‫‪SQL Replication‬‬

‫‪ 8-1‬بررسی سرويس ‪Replication‬‬


‫عمل ‪ Replication‬يکی از ويژگیهاي سطح باالي ‪ SQL Server‬محسوب میشود‪ Replication .‬متقابل هنگامی استفاده‬
‫اجرا شده روي يک شی موجود در ديتابیس يک سرور نیازمند منعکس‬ ‫‪DDL‬‬ ‫يا‬ ‫‪DML‬‬ ‫میشود که تغییرات شماي‬
‫شدن بر روي پايگاه دادهاي موجود بر روي سرور ديگر نیز باشد‪ .‬اين تغییرات تقريباً در يک بازهي زمانی ‪ Real‬مثالً‬
‫‪ Replication‬میپردازيم‪:‬‬ ‫در ثانیه اتفاق میافتند‪ .‬پس از بیان فنی‪ ،‬حال به زبانی ساده و در قالب مثال به توضیح‬

‫همانطور که میدانیم افراد بسیاري وجود دارند که مشترک مجالت الکترونیکی بوده و يا اخبار روز جهان را از طريق‬
‫ايمیل خود دريافت میکنند؛ بنابراين با عضويت و مشترک شدن در اين مجالت و ‪mailer‬ها بهسادگی قادر به دريافت‬
‫نیز همین نقش را ايفا کرده و‬ ‫‪MS SQL‬‬ ‫در‬ ‫‪Replication‬‬ ‫اخبار روز و مورد نظر خود هستند‪ .‬به طور مشابه قابلیت‬
‫دادهها را بهعنوانمثال از يک سرور ريموت به ‪Box‬هاي سرورهاي لوکال از طريق مکانیزم نشر و اشتراکگذاري‬
‫(‪ )publications and subscriptions‬انتقال میدهد‪.‬‬

‫‪ Replication‬در واقع به مجموعهاي از توپولوژيها براي کپی و توزيع دادهها و اشیاء و يا ‪Object‬هاي پايگاهداده‪ ،‬از‬
‫يک پايگاهداده به ديگري و نیز به هماهنگسازي بین پايگاههاي داده براي حفظ انسجام اطالق میشود‪ .‬با استفاده از‬
‫‪ Replication‬میتوانیم دادهها را به مکانهاي مختلف و میان کاربران از راه دور يا ريموت در سراسر شبکههاي محلی‬
‫و نیز گسترده و ارتباطات ‪ dial-up‬و‪ wireless‬و همچنین در اينترنت‪ ،‬توزيع کنیم‪ .‬داليل و سناريوهاي مختلفی موجود‬
‫است که موجب میشود که ‪ Replication‬بهعنوان ابزاري قدرتمند براي پخش کردن و انتشار دادهها در نظر گرفته شود‪.‬‬
‫در اينجا به داليلی براي عمل ‪ Replication‬اشاره خواهیم کرد‪:‬‬

‫درنظرگرفتن ‪ replication‬براي ازبینبردن اثرات عملیات متمرکز و فشردهي ‪ Read‬مثل تولید گزارش و‪ . ...‬در واقع‬
‫‪source‬‬ ‫‪ replication‬گزينهي مناسبی است براي زمانی که اطالعات مورد نظر ‪ read only‬بوده و نیازي به آپديت کردن‬
‫نداريم‪.‬‬
‫در تهران است و ازآنجايیکه سازماندهی بخش‬ ‫‪A1‬‬ ‫در دسترس قراردادن دادهها براي کاربر‪ ،‬بهعنوانمثال سرور‬
‫توزيع ويدئوهاي آموزشی آن در شهر اهواز صورت میگیرد‪ ،‬براي چنین سازماندهی‪ ،‬نیازمند اطالعات کامالً مرتب‬
‫هستیم‪ .‬حال هر بار که ما نیاز به استفاده از دادههاي مربوط به محصوالت و يا جداول فروش داشته باشیم از يک‬
‫‪ Linked Server‬براي برقراري ارتباط با سرور تهران و دريافت دادههاي مورد نظر استفاده خواهیم کرد‪ .‬چنین شرايطی‬
‫اثراتی را نیز به دنبال دارد‪:‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪332‬‬

‫قطعاً براي دريافت دادهها در هر زمان شديداً به ارتباطات شبکهاي متکی خواهیم بود‪.‬‬
‫سرور منبع يا همان ‪ Source Server‬نیز ‪ Load‬کاري بااليی را براي خواندن دادهها متحمل خواهد شد‪.‬‬

‫و جزئیات مربوط به نصب آن ابتدا بايد با مفهوم چند واژه آشنا شويم‪ .‬عمل‬ ‫‪replication‬‬ ‫پیش از پرداختن به انواع‬
‫‪ replication‬به طور سنتی از ساختار ‪ publisher//subscriber‬تبعیت میکند‪ .‬همانند رابطهي مشترکین و ناشران مجالت‪.‬‬
‫براي هر مجله يک ناشر (‪ )publisher‬وجود دارد که اطالعات را در قالب مقاالت (‪ )articles‬منتشر میکند‪.‬‬

‫حال اين مجلهاي که دربردارندهي مجموعهاي از مقاالت است براي انتشار و در اختیار عموم و نیز مشترکان قرارگرفتن‬
‫نیاز به يک توزيعکننده (‪ )distributer‬دارد و اين يک ساختار استاندارد براي چرخهي ‪ publisher // subscriber‬محسوب‬
‫میشود‪ .‬اما گاهاً با تغییراتی در اين روند نیز مواجه میشويم بهعنوانمثال ممکن است که يک ‪ publisher‬بهعنوان يک‬
‫نیز‬ ‫‪subscriber‬‬ ‫يا توزيعکننده ايفاگر نقش يک‬ ‫‪distributer‬‬ ‫يا توزيعکننده ايفاي نقش کند و يا اينکه يک‬ ‫‪distributer‬‬

‫باشد‪ .‬حال به توضیح هر يک از اين واژههاي کلیدي میپردازيم‪:‬‬

‫‪ Article‬يا مقاله‪ :‬به اطالعاتی اطالق میشود که قصد ‪ replicate‬آنها را داريم‪ .‬اين اطالعات میتواند يک جدول يا‬
‫يک روال يا ‪ procedure‬يا يک جدول فیلتر شده و ‪ ...‬را در برگیرد‪.‬‬
‫‪ Publication‬يا نشريه‪ :‬به گروهی از ‪article‬ها اطالق میشود‪ .‬يک ‪ article‬بهتنهايی قادر به انتشار نیست ازاينرو‬
‫به معنی مجموعهاي از ‪Article‬ها است (اشیاء‬ ‫‪publication‬‬ ‫داريم‪ .‬به بیان ديگر انتشار يا‬ ‫‪publication‬‬ ‫نیاز به ايجاد‬
‫مختلف پايگاهداده) که توسط ناشر منتشر شده است‪.‬‬

‫‪ Publisher‬يا ناشر‪ :‬به ‪ database‬روي ‪ Source‬سرور گفته میشود که در واقع قصد ‪ replicate‬دادههاي آن را داريم‪.‬‬
‫بهعبارتديگر يک ‪ Publisher‬در واقع يک ‪ database Instance‬است که دادههاي موجود در طی فرايند ‪ Replication‬به‬
‫مکانهاي ديگر را در دسترس قرار میدهد‪ .‬يک ناشر میتواند يک يا چندين نشريه و هر تعريف منطقی مرتبط با‬
‫مجموعهي اشیاء و دادههايی براي ‪ Replicate‬را در برداشته باشد‪.‬‬
‫يا توزيعکننده‪ :‬يک توزيعکننده را میتوان همانند پسربچهاي در نظر گرفت که مسئولیت تحويل‬ ‫‪Distributor‬‬

‫نشريات به مشترکین را به عهده دارد‪ .‬يک توزيعکننده میتواند ايفاگر نقش ناشر يا مشترک نیز باشد‪.‬‬
‫‪replication‬‬ ‫‪ Distribution Database‬يا پايگاه دادهي توزيع شده‪ :‬اين پايگاهداده دربردارندهي تمامی خط فرمانهاي‬
‫است‪ .‬زمانی که هرگونه از تغییرات شماي ‪ DML‬يا ‪ DDL‬در ‪ Publisher‬اجرا شود‪ ،‬دستورات مربوط به اين اعمال که‬
‫توسط ‪ SQL‬سرور تولید میشود ‪ ،‬دراين بخش ذخیره خواهد شد ‪ .‬اين پايگاهداده میتواند روي همان سرور ‪Publisher‬‬

‫موجود باشد اما معمو ًال براي عملکرد بهتر توصیه میشود که آن را بر روي يک سرور مجزا قرار دهند‪ .‬به طور معمول‬
‫روي آن قرار دارد‪،‬‬ ‫‪publisher‬‬ ‫روي همان ماشینی باشد که پايگاهدادهي‬ ‫‪distribution database‬‬ ‫مشاهده شده که اگر‬
‫‪www.takbook.com‬‬

‫‪333‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬


‫درصورتیکه تعداد زيادي ‪ Publisher‬موجود باشد‪ ،‬اين موضوع عملکرد سیستم را تحت تأثیر قرار میدهد و اين دلیلی‬
‫است که براي هر ‪ Publisher‬يک فايل ‪ distrib.exe‬ايجاد میشود‪.‬‬

‫‪ Subscriber‬يا مشترک‪ :‬چرخهي انتشار با دريافت دادهها توسط يک مشترک پايان میيابد‪ .‬تغییرات منتشر شده میان‬
‫تمامی مشترکین يک فرايند انتشار‪ ،‬از طريق يک توزيعکننده تکثیر میشود؛ بنابراين يک مشترک با اشتراک و عضويت‬
‫‪Database Instance‬‬ ‫در يک فرايند انتشار در نهايت قادر به دريافت دادهها خواهد بود‪ .‬بهعبارتديگر ‪ Subscriber‬يک‬
‫شده را دريافت میکند و نیز میتواند دادهها را از چندين ناشر (‪ )publisher‬يا نشريه‬ ‫‪replicate‬‬ ‫است که دادههاي‬
‫(‪ )publishers‬بگیرد‪ .‬بسته به نوع ‪ Replication‬اي که انتخاب میشود‪ ،‬يک ‪ Subscriber‬میتواند دادهها را متقابالً به ناشر‬
‫انتقال داده و يا آنها را براي ساير مشترکین منتشر کند‪.‬‬
‫‪ Subscription‬يا اشتراک‪ :‬به درخواست يک مشترک يا ‪ subscriber‬براي دريافت نشريه يا ‪ publication‬اطالق میشود‬
‫و بر دو نوع است‪ Pull :‬و‪ Push‬که در واقع دو روش براي انتقال دادهها از ‪ distributor‬يا توزيعکننده به ‪subscriber‬ها‬
‫يا مشترکین محسوب میشوند‪ .‬در ذيل به شرح آنها میپردازيم‪:‬‬

‫‪ :Push Subscription‬در روش ‪ push subscription‬يک ‪ distributor‬يا توزيعکننده مسئول دادههاي بر صف از يک‬
‫بوده و درنهايت آنها را در اختیار‪subscriber‬ها قرار میدهد‪ .‬اين نوع اشتراک مديريت را ساده و متمرکز‬ ‫‪publisher‬‬

‫میکند چون سناريوي ‪ replication‬معمولی‪ ،‬يک ‪ publisher‬و چندين ‪ subscriber‬را شامل میشود‪ .‬مزيت اين اشتراک‬
‫امنیت باالي آن است چراکه فرايند آغازين در يک مکان مديريت میشود‪ .‬بهعبارتديگر کارايی ‪distributor‬ها کاهش‬
‫میيابد زيرا کل توزيع ‪subscriber‬ها يکدفعه اجرا میشود‪.‬‬
‫‪ :Pull subscription‬همانند روش ‪ push‬يک ‪ distributor‬يا توزيعکننده دادههاي بر صف يک ‪ publisher‬بوده و اين‬
‫ارتباط برقرار کرده و دادههاي صفبندي شدهي آماده براي عمل‬ ‫‪distributor‬‬ ‫وظیفهي ‪subscriber‬ها است که با‬
‫‪ replication‬را به تصرف خود درآورند‪ .‬در مقايسه با روش ‪ push‬از روش ‪ pull‬براي نشريههايی با امنیت پايین و تعداد‬
‫و يا‬ ‫‪publication‬‬ ‫باالي مشترک ها استفاده میشود‪ .‬اين نوع اشتراک رايج تر بوده چرا که يک مشترک میتواند‬
‫نشريههايی را انتخاب کند تا در آن شرکت کند‪.‬‬

‫شرح ‪ replication Agent‬ها در ‪ SQL‬سرور‬

‫حال به توضیح عواملی که براي انجام ‪ replication‬در پشتصحنه فعالیت میکنند میپردازيم که ‪ Agent‬نامیده میشوند‪.‬‬
‫قرار دارند‪ .‬همچنین تمامی‬ ‫مسیر………‪COM folder\110\.‬‬ ‫در‬ ‫‪exe‬‬ ‫اين ‪agent‬ها در فايلهاي مربوطه با پسوند‬
‫‪Distribution‬‬ ‫موجود در‬ ‫‪dbo.MSxxx__history‬‬ ‫و‬ ‫‪dbo.MSxxx__agents‬‬ ‫اطالعات مربوط به ‪agent‬ها در جداول‬
‫‪ database‬ثبت شدهاند‪ .‬حال به شرح انواع ‪agent‬ها و اينکه در کدام نوع از انواع ‪ replication‬کاربرد دارند میپردازيم‬
‫براي روشن شدن اين مبحث در اينجا اشاره میکنیم که ‪ replication‬در ‪ SQL‬سرور به سه نوع ‪ Snapshot‬و ‪transactional‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪334‬‬


‫و ‪ merge‬تقسیم میشود که نیازمند ‪Agent‬ها براي فعالیت خود هستند‪ .‬در ادامه عناوين ذکر شده شفافسازي خواهند‬
‫شد‪.‬‬

‫‪ :Snapshot Agent‬يک فايل اجرايی است که ‪ snapshot‬فايلهاي دربردارندهي شماتیک يا ساختار و دادههاي جداول و‬
‫ذخیره میکند همچنین اطالعات مربوط به وضعیت‬ ‫‪Distributor‬‬ ‫اشیاء پايگاهداده را ايجاد کرده و آنها را در‬
‫‪ synchronization‬را در ‪ distribution database‬ثبت میکند‪.‬‬

‫را از‬ ‫‪snapshot‬‬ ‫مورداستفاده قرار میگیرد‪ .‬و فايلهاي‬ ‫‪transactional‬‬ ‫و‬ ‫‪snapshot‬‬ ‫‪ :Distribution Agent‬براي انواع‬
‫‪ distribution db‬به مشترکین انتقال میدهد همچنین تمامی تراکنشهاي منتظر براي انتشار را نیز به ‪subscriber‬ها منتقل‬
‫میکند و براي هر دو ‪ push subscription‬و ‪ pull subscription‬قابلاجرا است‪.‬‬
‫‪replication‬‬ ‫‪ :Log Reader Agent‬براي ‪ transactional replication‬استفاده میشود تراکنشهاي مشخص شده براي‬
‫را از ‪ transaction log‬به ‪ distribution db‬روي ‪ publisher‬انتقال میدهد‪ .‬هر پايگاه دادهي ‪ log reader‬مختص به خود را‬
‫دارد که روي ‪ distributor‬اجرا شده و با ‪ publisher‬ارتباط برقرار میکند‪.‬‬
‫ها اجرا کرده و تغییرات‬ ‫‪subscriber‬‬ ‫اولیه را براي‬ ‫‪snapshot‬‬ ‫کاربرد دارد و‬ ‫‪merge replication‬‬ ‫‪ :Merge Agent‬در‬
‫‪subscriber‬ها انتقال میدهد‪ .‬هر اشتراک ادغامی ‪merge agent‬‬ ‫تدريجی به وجود آمده روي دادهها را نیز ادغام کرده وبه‬
‫خود را دارد که قادر به برقراري ارتباط با ‪ publisher‬و ‪ subscriber‬و بهروزرسانی هر دوي آنها میباشد‪.‬‬
‫اجرا شده و تغییرات‬ ‫‪Distributor‬‬ ‫کاربرد دارد و بر روي‬ ‫‪transactional replication‬‬ ‫‪ :Queue Reader Agent‬براي‬
‫صورتگرفته در سمت ‪ subscriber‬را به ‪ publisher‬بازمیگرداند‪ .‬برخالف ‪ merge agent‬و‪ agent distribution‬تنها يک‬
‫‪distribution‬‬ ‫نمونه از ‪ Queue Reader Agent‬براي سرويسدهی بهتمامی ‪ publisher‬ها و ‪ publication‬ها و براي يک‬
‫‪ db‬معین وجود دارد‪.‬‬

‫فیلترکردن دادههاي منتشر شده‪:‬‬

‫فیلترکردن جداول موجود در ‪article‬ها ما را قادر میسازد تا پارتیشنهايی از دادهها را براي انتشار ايجاد کنیم‪ .‬به کمک‬
‫فیلترکردن دادههاي منتشر شده میتوان‪:‬‬

‫دادههاي ارسال شده روي شبکه را به حداقل رساند‪.‬‬ ‫•‬

‫مقدار فضاي ذخیرهسازي موردنیاز براي يک مشترک را کاهش داد‪.‬‬ ‫•‬

‫نشريات يا ‪ publication‬ها را سفارشیسازي کرده و نیز شرايطی را فراهم کرد که ‪application‬ها بر اساس‬ ‫•‬

‫نیازهاي اختصاصی يک مشترک باشند‪.‬‬


‫‪www.takbook.com‬‬

‫‪335‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬


‫اگر مشترکین دادهها را بهروزرسانی کنند‪ ،‬میتوان از بروز ‪conflict‬ها جلوگیري کرده و يا آنها را کاهش داد زيرا‬
‫پارتیشنهاي دادههاي مختلف میتوانند براي مشترکین مختلف ارسال شوند‪( .‬در واقع در اين شرايط هیچ دو مشترکی‬
‫قادر به بهروزرسانی دادههاي مشابه نخواهند بود)‬
‫میتوان از انتقال اطالعات مهم و حساس جلوگیري کرد‪ .‬فیلترهاي رديف و فیلترهاي ستونها میتوانند براي‬
‫محدودکردن دسترسی مشترک به دادهها مورداستفاده قرار گیرند‪.‬‬

‫‪ Replication‬چهار نوع فیلتر را ارائه میدهد که در ذيل به معرفی آنها میپردازيم‪:‬‬

‫‪Static row filter‬ها يا فیلترکردن رديفها بهصورت استاتیک که براي تمامی انواع ‪ replication‬از قبیل ‪ snapshot‬و‬
‫کاربرد دارد‪ .‬با استفاده از آن قادر خواهیم بود زير مجموعهاي از رديفهايی را که منتشر‬ ‫‪merge‬‬ ‫و‬ ‫‪transactional‬‬

‫میشوند‪ ،‬انتخاب کنیم و يا در واقع برحسب نیازمان آنها را محدود کنیم‪.‬‬


‫‪ Column filter‬يا فیلترکردن ستون که اين نوع فیلتر نیز براي تمامی انواع ‪ replication‬به کار میرود و به کمک آن‬
‫میتوان زيرمجموعهاي از ستونهايی را که منتشر میشوند‪ ،‬انتخاب کرد‪.‬‬
‫‪ Parameterized row filtered‬يا فیلترهاي پارامتري رديفها تنها براي ‪ merge replication‬به کار گرفته میشود‪ .‬اين‬
‫است اما در اجرا تفاوت قابلتوجهی با يکديگر دارند‪ .‬هدف‬ ‫‪static filter‬‬ ‫نوع از فیلتر از نظر مفهوم همانند‬
‫‪ parameterized filter‬ايجاد چندين پارتیشن از دادهها است که بدون ايجاد چندين نشريه يا ‪ publication‬بتوانند ‪replicate‬‬

‫نیز‬ ‫‪B‬‬ ‫و‬ ‫‪A‬‬ ‫داشته باشند‪ .‬بهعنوانمثال اگر ما از جدول پايهي يکسانی استفاده کنیم و دو مشترک مختلف به نامهاي‬
‫داشته باشیم که هرکدام به زيرمجموعههايی متفاوتی از آن جدول نیاز داشته باشند‪ ،‬هنگام استفاده از فیلترهاي رديفی‬
‫استاندارد نیازمند ايجاد دو نشريه يکی براي مشترک ‪ A‬و ديگري براي مشترک ‪ B‬خواهیم بود‪ .‬اما با استفاده از فیلترهاي‬
‫پارامتري میتوانیم براي مشترکین ‪ A‬و ‪ B‬بهصورت مجزا مقادير مورد نظر متفاوتی را در نظر بگیريم‪ .‬اما در نهايت هر‬
‫يک از اين مقادير و مجموعه دادهها بهعنوان بخشی از يک نشريه محسوب میشوند‪.‬‬
‫کاربرد دارد و اين نوع فیلتر به طور معمول همراه با‬ ‫‪merge replication‬‬ ‫يا فیلتر الحاق که تنها براي‬ ‫‪Join filter‬‬

‫ها براي بسط و گسترش فیلترينگ به ديگر جداول مربوطه به کار میرود‪ .‬مثالً يک نمايندگی‬ ‫‪parameterized filter‬‬

‫فروش معمو ًال دادههاي جداول ديگر از قبیل مشتريان و ديگر جداول را دارد‪ .‬اين دادها میتوانند فیلتر شده باشند‬
‫بهطوريکه نماينده فروش تنها دادههاي مشتريان خود و سفارشها آنها را دريافت کند‪ .‬اين نوع فیلتر همچنین میتواند‬
‫همراه با ‪ static filter‬ها نیز به کار گرفته شود‪.‬‬

‫توپولوژيهايی که ‪ MS SQL‬سرور براي انجام ‪ Replication‬آنها را پشتیبانی میکند‪:‬‬


‫‪ :Central Publisher‬اين يکی از پرکاربردترين نوع توپولوژيها است که در ‪ replication‬مورداستفاده قرار میگیرد‪ .‬در‬
‫اين سناريو يک سرور بهعنوان ‪ publisher‬و ‪ distributor‬منظور شده و سرور و يا سرورهاي ديگر بهعنوان ‪subscriber‬ها‬
‫در نظر گرفته میشوند‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪336‬‬

‫شکل ‪Central Publisher 6-1‬‬

‫‪ :Central subscriber‬اين يک توپولوژي رايج در انبار دادهها است‪ .‬سرورها يا پايگاه دادههاي متعددي دادههاي خود‬
‫را با يک سرور مرکزي ‪ replicate‬میکنند‪.‬‬

‫شکل ‪Central subscriber 6-2‬‬

‫روي يک سرور مجزا از‬ ‫‪Distribution database‬‬ ‫‪ :‬در اين توپولوژي‬ ‫‪Central publisher with remote distributor‬‬

‫‪ Distributor‬در نظر گرفته میشود از اين ساختار زمانی استفاده میشود که سطح فعالیتهاي ‪ replication‬افزايش پیدا‬
‫میکند و يا اينکه سرور و يا منابع شبکه محدود شدهاند‪ .‬اين توپولوژي زمان ‪ load‬را براي ‪ publisher‬کاهش داده اما‬
‫بهطورکلی موجب افزايش ترافیک شبکه میشود‪.‬‬

‫شکل ‪Central publisher with remote distributor 6-3‬‬

‫‪ : Central distributor‬در اين توپولوژي ‪publisher‬هاي متعدد تنها از يک ‪ distributor‬استفاده میکنند که روي سروري‬
‫‪point‬‬ ‫مجزا پیادهسازي شده است‪ .‬اين نوع توپولوژي عمالً چندان مورداستفاده قرار نمیگیرد‪ .‬چراکه تنها داراي يک‬
‫‪distributor‬‬ ‫‪ of failure‬میباشد (يعنی همان سروري که بهعنوان ‪ distributor‬مرکزي پیکربندي شده است) و اگر سرور‬
‫دچار اختالل شده و يا از کار بیفتد‪ ،‬کل عملیات ‪ replication‬اي که بر اساس اين سناريو صورت میگیرد‪ ،‬نابود خواهد‬
‫شد‪.‬‬
‫‪www.takbook.com‬‬

‫‪337‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫شکل ‪Central distributor 6-4‬‬

‫‪ : Publishing Subscriber‬اين توپولوژي داراي نقشی دوگانه است‪ .‬در اين ساختار دو سرور دادههاي يکسان را منتشر‬
‫میکنند‪ .‬يکی از سرورهايی که عهدهدار نقش ‪ publisher‬است دادهها را براي ‪ subscriber‬ارسال کرده و سپس ‪subscriber‬‬

‫دادهها را براي هر تعداد از مشترکین موجود منتشر میکند‪ .‬اين توپولوژي هنگامی کاربرد دارد که يک ‪ publisher‬قصد‬
‫انتقال دادهها را از طريق لینکهاي ارتباطی کُند و يا گرانقیمت به ‪subscriber‬ها داشته باشد‪.‬‬

‫شکل ‪Publishing Subscriber 6-5‬‬

‫‪Replication‬‬ ‫انواع‬
‫انواع ‪ replication‬اي که در ‪ SQL Server 2019‬صورت میگیرند بهقرار زير است‪:‬‬

‫‪ Transactional Replication‬يا رونوشت تراکنش‬


‫‪ Merge Replication‬يا رونوشت ادغامی‬
‫‪ Snapshot replication‬يا رونوشت ثبت لحظهاي‬

‫نوع ‪ replication‬اي که ما انتخاب میکنیم به فاکتورهاي مختلفی وابسته است اين فاکتورها محیط فیزيکی ‪،replication‬‬
‫نوع و کمیت دادههايی که قصد ‪ replicate‬آنها را داريم و اينکه آيا دادهها بايد براي ‪ subscriber‬بهروزرسانی شوند يا‬
‫خیر را شامل میشود‪ .‬محیط فیزيکی به تعداد و مکان کامپیوترهاي درگیر در عمل ‪ replication‬اطالق میشود‪ .‬حال‬
‫اين کامپیوترها میتوانند ‪client‬هايی همچون ‪workstation‬ها‪ ،‬لپتاپها و يا ‪ device‬هاي ‪ handle‬بوده و يا سرورها را‬
‫در برگیرند‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪338‬‬


‫‪subscriber‬‬ ‫و‬ ‫‪publisher‬‬ ‫به طور معمول با همگامسازي اولیهي ‪object‬هاي ‪ publish‬شده میان‬ ‫‪replication‬‬ ‫هر نوع از‬
‫شروع میشود‪ .‬اين همگامسازي اولیه میتواند توسط ‪ replication‬و با يک ‪ snapshot‬ايجاد شود‪ Snapshot .‬يک کپی‬
‫از تمامی ‪object‬ها و دادههاي مشخص شده توسط يک نشريه يا ‪ publication‬تهیه میکند‪ .‬پس از اينکه ‪ snapshot‬ايجاد‬
‫شد‪ ،‬به مشترکین يا ‪subscriber‬ها تحويل داده میشود‪.‬‬

‫موردنیاز میباشد و براي ديگر ‪application‬ها اين مسئله‬ ‫‪snapshot replication‬‬ ‫براي برخی از نرمافزارهاي کاربردي‬
‫قرار بگیرد‪.‬‬ ‫‪Subscriber‬‬ ‫مهم است که تغییرات ايجاد شده روي دادهها بهصورت تدريجی در طول زمان در اختیار‬
‫برخی از ‪Application‬ها نیازمند بازگشت تغییرات صورتگرفته روي داده از از ‪ subscriber‬به ‪ publisher‬نیز هستند‪.‬‬
‫‪ transactional replication‬و ‪ merge replication‬آپشنهايی هستند که اين امکان را براي اينگونه ‪application‬ها فراهم‬
‫میآورند‪ .‬تغییرات صورتگرفته روي دادهها‪ ،‬از طريق ‪ snapshot‬قابلپیگیري نیست و هر زمان که يک ‪ snapshot‬گرفته‬
‫پیگیري تغییرات از طريق‬ ‫‪transnational replication‬‬ ‫خواهد شد‪ .‬در‬ ‫‪overwrite‬‬ ‫شده تأيید شود‪ ،‬روي دادهي موجود‬
‫‪transaction log‬هاي ‪ SQL Server‬و در ‪ merge replication‬نیز از طريق ‪trigger‬ها و ‪metadata table‬ها میسر خواهد بود‪.‬‬
‫حال به شرح هرکدام از انواع ‪ replication‬میپردازيم‪:‬‬
‫‪ Snapshot Replication‬يا رونوشت ثبت لحظهاي‬

‫دادهها را دقیقاً همانگونه که در يک لحظهي خاص زمانی ظاهر میشوند توزيع میکند و نمیتوان بواسطهي آن آپديت‬
‫تولید شده و براي‬ ‫‪Snapshot‬‬ ‫اتفاق میافتد‬ ‫‪synchronization‬‬ ‫و بهروزرسانی دادهها را مانیتور کرد‪ .‬وقتیکه عمل‬
‫‪subscriber‬ها ارسال میشود‪ .‬بايد اين نکته را در نظر داشت که ‪ Snapshot Replication‬بهخوديخود مورداستفاده قرار‬
‫میگیرد اما فرايند پردازش ‪snapshot‬ها که در واقع مراحل کپیبرداري از ‪object‬ها و دادههاي تعیین شده توسط يک‬
‫هاي پايگاهداده براي‬ ‫‪object‬‬ ‫نشريه را نیز شامل میشود و معمو ًال براي فراهمآوردن مجموعهي اولیهاي از دادهها و‬
‫بهخوديخود هنگامی مناسب‬ ‫‪snapshot replication‬‬ ‫کاربرد دارد‪ .‬استفاده از‬ ‫‪transactional /merge replication‬‬ ‫انواع‬
‫است که موارد عنوان شده در ذيل محقق باشند‪:‬‬

‫دادهها بهندرت تغییر داشته باشند‬ ‫•‬

‫قصد ‪ replicate‬کردن حجم کمی از دادهها را داشته باشیم‪.‬‬ ‫•‬

‫اگر که حجم زيادي از دادهها در طی يک دوره کوتاه زمانی تغییر کند‪.‬‬ ‫•‬

‫مناسبترين زمان براي استفاده از ‪ snapshot replication‬هنگامی است که تغییراتی اساسی و قابلتوجه اما نادر براي‬
‫دادهها اتفاق بیفتد‪ .‬براي مثال اگر لیست قیمت محصوالت موجود در فروشگاه ‪ ITPro‬ثابت بوده و يک يا دو بار در‬
‫سال در يکزمان مشخص آپديت و بهروزرسانی میشوند‪ ،‬در چنین وضعیتی استفاده از ‪ snapshot replication‬بعد از‬
‫‪www.takbook.com‬‬

‫‪339‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬


‫اعمال تغییرات روي دادهها توصیه میشود باتوجهبه انواع خاصی از دادهها‪ ،‬ممکن است که ‪Snapshot‬هاي مکرري‬
‫نیاز باشد‪.‬‬

‫مثالً اگر يک جدول نسبتاً کوچک در سرور ‪ publisher‬در طی روز آپديت شده اما اندکی تاخیر نیز جايز باشد‪ ،‬اين‬
‫تغییرات میتوانند بهعنوان يک ‪ Snapshot‬شبانه تحويل داده شوند‪ Snapshot replication .‬داراي سربار مداوم کمتري‬
‫نسبت به ‪ transactional replication‬بر روي ‪ publisher‬میباشد چراکه تغییرات تدريجی را دنبال نمیکند‪ .‬بااينحال اگر‬
‫‪snapshot‬‬ ‫مجموعه دادهاي که درحال ‪ replicate‬است بسیار بزرگ باشد به منابع قابلتوجهی براي ساخت و بهکاربردن‬
‫بايد اندازهي کل مجموعه دادهها و فراوانی‬ ‫‪snapshot replication‬‬ ‫نیاز دارد‪ .‬هنگام ارزيابی شرايط براي استفاده از‬
‫تغییرات ايجاد شده روي آنها را در نظر گرفت‪.‬‬
‫‪ Snapshot replication‬چگونه کار میکند؟‬

‫براي مقداردهی اولیه به ‪subscriber‬ها استفاده میکنند‪.‬‬ ‫‪snapshot‬‬ ‫ازيک‬ ‫‪replication‬‬ ‫به طور پیشفرض هر سه نوع‬
‫همیشه ‪ Snapshot agent‬موجود در ‪ SQL Server‬وظیفة تولید فايلهاي ‪ snapshot‬را به عهده دارد اما ‪ agent‬مربوط به‬
‫‪transactional‬‬ ‫ارائه و تحويل اين فايلها بسته به نوع ‪ replication‬انتخاب شده‪ ،‬متفاوت است‪ Snapshot replication .‬و‬
‫‪ replication‬براي ارائة فايلها از ‪ distribution agent‬استفاده میکنند درحالیکه ‪ merge replication‬براي اين منظور از‬
‫‪ merge agent‬بهره میگیرد‪ Snapshot agent .‬روي ‪ distributor‬اجرا میشود‪ distribution agent .‬و ‪ Merge Agent‬روي‬
‫يک ‪ Distributor‬براي ‪push subscription‬ها اجرا شده و همچنین بر روي ‪subscription‬ها براي ‪pull subscriber‬ها اجرا‬
‫میشوند‪.‬‬

‫‪ Snapshot‬میتواند بالفاصله بعد از ايجاد يک ‪ ، subscription‬تولید و اعمال شود و يا اينکه بر اساس يک برنامه در‬
‫زمان انتشار ساخته شود‪ Snapshot Agent .‬فايلهاي ‪ snapshot‬حاوي ساختار و دادههاي جداول منتشر شده ( ‪published‬‬

‫‪ )tables‬و نیز اشیاء پايگاهداده را آماده کرده و اين فايلها را براي ناشر يا ‪ publisher‬در ‪ Snapshot folder‬ذخیره میکند‬
‫در ‪ Distribution database‬موجود در ‪ Distributor‬ثبت میکند‪ .‬میتوان ‪snapshot folder‬‬ ‫و مسیر رديابی اين اطالعات را‬
‫پیشفرض را به هنگام پیادهسازي و پیکربندي يک ‪ Distributor‬مشخص کنیم اما میشود که محل ديگري نیز براي‬
‫نشريه‪ ،‬بهجاي آن فولدر يا عالوهبرآن فولدر پیشفرض در نظر گرفت‪.‬‬

‫عالوه بر فرايند ‪ snapshot‬استاندارد که به توضیح آن پرداختیم‪ ،‬يک فرايند دوبخشی ‪ snapshot‬نیز وجود دارد که در‬
‫‪filter‬‬ ‫انتشار بهصورت ادغام کاربرد دارد که از ‪parameterized filter‬ها بهره میبرد‪ .‬همان گونه که قبالً گفتیم يک‬
‫به ما اين‬ ‫‪parameterized filter‬‬ ‫فرايندي است که اطالعات را محدود و يک زيرمجموعه را تولید میکند‪ .‬استفاده از‬
‫اجازه را میدهد که پارتیشنهاي مختلفی از دادهها را براي ‪subscriber‬هاي متعدد ارسال کنیم بدون اينکه نیاز به ايجاد‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪340‬‬


‫نمايش داده‬ ‫‪Snapshot replication‬‬ ‫ها و يا همان نشريه هاي متعدد باشد ‪.‬در تصوير ‪ 6-6‬اجزاي اصلی‬ ‫‪publication‬‬

‫شده که به درک بهتر مفاهیم گفته شده کمک خواهد کرد‪:‬‬

‫شکل ‪Snapshot replication 6-6‬‬

‫‪ Transactional Replication‬يا رونوشت تراکنشی‬

‫از اشیا و دادههاي پايگاهدادهي يک‬ ‫‪snapshot‬‬ ‫به طور معمول با گرفتن يک‬ ‫‪transactional replication‬‬ ‫عملیات‬
‫‪ publication‬شروع میشود‪ .‬بهمحض اينکه ‪ Snapshot‬اولیه گرفته شد‪ ،‬تغییرات بعدي که روي دادهها و شماهاي موجود‬
‫در سمت ناشر يا ‪ publisher‬ايجاد شده به ‪subscriber‬ها تحويل داده میشوند‪ .‬به طور جزئیتر میتوان گفت که تغییرات‬
‫و تراکنشهاي که روي ‪article‬هاي منتشر شده رخدادهاند از سمت ‪ publisher‬براي ‪ distributor‬ارسال میشود تا آنها‬
‫‪www.takbook.com‬‬

‫‪341‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬


‫را براي ‪subscriber‬ها و يا همان مشترکین بفرستد ‪subscriber.‬ها تنها میتوانند از اين دادهها بهصورت ‪ read only‬استفاده‬
‫کنند چراکه در اين نوع ‪ ، replication‬تغییراتی که صورت میگیرد مجدداً براي ‪ publisher‬بازگردانده نمیشود‪ .‬بااينحال‬
‫آپشنهايی ارائه میدهد که شرايط بهروزرسانی اطالعات را براي ‪Subscriber‬ها فراهم‬ ‫‪transactional replication‬‬

‫میآورند‪.‬‬

‫قطعاً عنوان کردن يک مثال مسئله را روشنتر میکند‪ :‬يک وبسايت رزرو بلیط را در نظر میگیريم تمامی بلیطهاي‬
‫رزرو شده بهصورت متمرکز در پايگاهدادهي واقع در شهر تهران ذخیره میشوند و در هر شهر از کشور نیز يک مرکز‬
‫توزيع يا ‪ distribution center‬قرار دارد که رزروها را گرفته و بلیطهاي رزرو شده را براي آدرسهاي موجود ارسال‬
‫میکند‪ .‬الزم است که تمامی بلیطهاي رزرو شده از اهواز براي مشتريان مربوطه ارسال شوند‪ .‬پايگاه توزيع مرکزي‬
‫موجود در اهواز میتواند که يک ‪ transnational replication‬فیلتر شده را راهاندازي کند براي اينکه هر رزرو جديدي‬
‫(تراکنشی) که صورت گرفت با ساير شعب مربوط به اين مرکز‪ ،‬در حداقل زمان ممکن ‪ replicate‬شود‪( .‬فیلتر موجب‬
‫میشود که اين مرکز تنها رزروها را براي اهواز دريافت کند)‪ .‬اين شعب نیازمند دسترسی ‪ read only‬براي استفاده از‬
‫دادههاي ‪ replicate‬شده هستند که ‪ transnational replication‬اين امکان را براي آنها فراهم میآورد؛ بنابراين مواردي را‬
‫میشود براي ‪ transactional replication‬بهخاطر سپرد‪:‬‬

‫ازآنجايیکه عمل ‪ replication‬در طی يک تراکنش اتفاق میافتد‪ ،‬تأخیر تکرار و ‪ replicate‬دادهها بسیار ناچیز است‪.‬‬
‫به دادهها دارند‪ ،‬ازاينرو تقريباً هیچگونه استقاللی براي مشترکین يا ‪subscribe‬ها‬ ‫‪read only‬‬ ‫مشترکین دسترسی‬
‫وجود ندارد‪.‬‬

‫شکل ‪Transactional Replication 6-7‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪342‬‬


‫‪ Transactional replication‬به طور معمول براي محیطهاي سرور به سرور (‪ )server-to-server‬استفاده میشود و براي‬
‫هر يک از موارد زير مناسب است‪:‬‬

‫زمانی که بخواهیم تغییرات تدريجی دادههاي مورد نظر را پس از وقوع براي مشترکین منتشر کنیم‪.‬‬
‫براي ‪application‬هايی که به تأخیر کمی بین زمانی که يک تغییر در سمت ناشر ايجاد میشود تا زمانی که تغییر به‬
‫يک مشترک میرسد نیاز دارند‪.‬‬
‫هنگامیکه ‪ publisher‬داراي حجم بسیار بااليی از فعالیتها از قبیل درج‪ ،‬بهروزرسانی و يا حذف باشد‪.‬‬
‫براي زمانی که ‪ Publisher‬يا‪ Subscriber‬پايگاهداده اي غیر از ‪ SQL‬سرور باشد‪ .‬مثالً ‪ Oracle‬باشد‪.‬‬
‫يک ‪ Application‬نیاز به دسترسی براي مداخله در وضعیت دادهها داشته باشد براي مثال اگر رديفی از يک جدول‬
‫به هر ‪ Application‬اين امکان را میدهد که قادر باشد براي هر تغییر‬ ‫‪Transactional Replication‬‬ ‫پنج بار تغییر کند‪،‬‬
‫مداخله کند (مثالً استفاده از ‪trigger‬ها ) و تغییرات دادهها بهسادگی بهرديفها اعمال نشوند‪.‬‬

‫‪ Transactional Replication‬چگونه کار میکند؟‬

‫‪Distribution Agent‬‬ ‫براي پیادهسازي‪ transactional replication‬عواملی مانند ‪ Snapshot Agent‬و ‪ Log Reader Agent‬و‬
‫فايلهاي دربردارندهي ساختارها (‪ )schema‬و دادههاي جداول‬ ‫‪snapshot‬‬ ‫درواقع‬ ‫‪Snapshot Agent‬‬ ‫ها دخیل هستند‪.‬‬
‫ذخیره میکند و نتیجهي عمل‬ ‫‪Snapshot‬‬ ‫منتشر شده و اشیاء پايگاهداده را مهیا کرده و اين فايلها را در فولدر‬
‫‪ synchronization‬را در ‪ Distribution database‬موجود روي ‪ Distributor‬ثبت میکند‪.‬‬

‫‪ Log Reader Agent‬وظیفهي مانیتور کردن ‪transaction log‬هاي هر پايگاه دادهاي که براي عمل ‪transactional replication‬‬

‫به‬ ‫‪transaction log‬‬ ‫را از‬ ‫‪replication‬‬ ‫پیکربندي شده را به عهده داشته و تراکنشهاي مشخص شده براي عمل‬
‫‪ distribution database‬کپی میکند‪ Distribution Agent .‬نیز ‪ Snapshot‬فايلهاي اولیه از پوشهي ‪ snapshot‬و همچنین‬
‫تراکنشهاي نگهداشته شده در جداول ‪ distribution database‬را براي مشترکین يا ‪subscriber‬ها کپی میکند‪.‬‬

‫در دسترس مشترکین قرار‬ ‫‪Distribution Agent‬‬ ‫تغییرات تدريجی ايجاد شده سمت ناشر مطابق برنامه زمانبندي‬
‫میگیرند که اين جريان انتقال اطالعات میتواند به طور مداوم با حداقل زمان تأخیر و يا در فواصل زمانی‬
‫‪transactional‬‬ ‫برنامهريزيشده اجرا شود‪ .‬ازآنجاکه تغییرات دادهها بايد در سمت ناشر ايجاد میشوند‪( .‬زمانی که از‬
‫‪ replication‬بدون آپشنهاي ‪ immediate updating‬و ‪ queued updating‬بهره میگیريم‪{ .‬البته در ادامه به شرح کارايی‬
‫در بهروزرسانیها جلوگیري کرد‪ .‬در نهايت تمامی مشترکین به‬ ‫‪conflict‬‬ ‫اين دو آپشن میپردازيم}) بايد از ايجاد‬
‫‪queued‬‬ ‫مقادير مشابه و يکسان از يک ناشر دست خواهند يافت‪ .‬همچنین اگر از آپشنهاي ‪ immediate updating‬يا‬
‫‪queued‬‬ ‫‪updating‬براي ‪ transactional replication‬بهره بگیريم‪ ،‬بهروزرسانیها میتوانند سمت مشترکین ايجاد شوند و با‬
‫‪ ، updating‬ممکن است تضاد و ‪ conflict‬اتفاق بیفتد‪.‬‬
‫‪www.takbook.com‬‬

‫‪343‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫‪ Immediate Updating‬به مشترکین ‪ Snapshot // Transactional Replication‬اجازه میدهد تا دادههاي ‪ replicate‬شده را‬
‫در سمت مشترک بهروزرسانی کرده و تغییرات به وقوع پیوسته را به ناشر و ديگر مشترکین بازگردانی کند‪ .‬اين آپشن‬
‫براي زمانی مفید است که قصد استفاده از ‪ Snapshot‬يا ‪ transactional replication‬را داشته باشیم اما نیازمند شرايطی‬
‫باشیم که بهروزرسانیهاي گاهبهگاه در سمت مشترک صورت گیرد‪ .‬براي استفاده از اين آپشن‪ ،‬ناشر و مشترک بايد‬
‫در دسترس بوده و ارتباط بین آن دو برقرار باشد‪.‬‬

‫‪ Queued Updating‬به مشترکین ‪ Snapshot // Transactional Replication‬نیز اجازه میدهد دادههاي منتشر شده را بدون‬
‫نیاز به يک اتصال شبکهاي اکتیو به ‪ ، publisher‬تغییر دهند‪ .‬وقتیکه يک نشريه يا ‪ publication‬را با استفاده از اين آپشن‬
‫ايجاد میکنیم و يکی از مشترکین عملیاتی چون ‪ Insert‬يا ‪ Update‬يا ‪ Delete‬را روي دادههاي منتشر شده پیادهسازي‬
‫میکند‪ ،‬اين تغییرات در يک صف ذخیره میشوند‪ .‬هنگامیکه ارتباطات شبکهاي مجدداً برقرار شود‪ ،‬اين تراکنشهاي‬
‫بر صف بهصورت غیر همزمان به ‪ publisher‬اعمال میشوند‪.‬‬

‫منتشر میشوند‪ ،‬همان دادهها ممکن است‬ ‫‪publisher‬‬ ‫ازآنجايیکه که بهروزرسانی دادهها به طور غیر همزمان براي‬
‫توسط خود ناشر يا ‪ publisher‬و يا مشترک ديگري نیز آپديت شده باشند در نتیجه به هنگام اعمال آپديتهاي برصف‬
‫که به هنگام‬ ‫‪conflict resolution policy‬‬ ‫يا ناسازگاري به وجود بیايد‪ .‬اين ‪conflict‬ها به کمک‬ ‫‪conflict‬‬ ‫ممکن است‬
‫هايی‬ ‫‪Application‬‬ ‫براي‬ ‫‪Queued updating.‬‬ ‫تنظیم میشود‪ ،‬شناسايی و حلوفصل میشوند‬ ‫‪publication‬‬ ‫ايجاد يک‬
‫مناسب است که کاربران آنها اغلب دادهها را خوانده و گاهبهگاه بهروزرسانی دادهها میپردازند‪ .‬ارتباطات مشترکین نیز‬
‫بايد اکثر اوقات برقرار باشد و اگر که مشترکین آفالين باشند نیز عملیات بهروزرسانی بدون وقفه ادامه خواهد يافت‪.‬‬

‫نکته‪ :‬اين آپشنها قابلیت سوئیچ شدن روي يکديگر را دارند بهعنوانمثال براي ‪ Subscription‬مشخص کردهايم که از‬
‫حالت ‪ immediate updating‬استفاده کند‪ ،‬اما فرضاً تحت شرايطی ارتباطات شبکه دچار مشکل شده بنابراين میتوانیم‬
‫بهصورت اتوماتیک‬ ‫‪replication‬‬ ‫سوئیچ کنیم‪ .‬بايد در نظر داشت که‬ ‫‪queued updating‬‬ ‫براي دريافت آپديتها روي‬
‫‪SQL‬‬ ‫از طريق‬ ‫‪update mode‬‬ ‫نمیتواند بین حاالت آپديت سوئیچ کند و براي اين منظور بايد تنظیمات مربوط به‬
‫را براي سوئیچ بین دو حالت‬ ‫‪sp_setreplfailovermode‬‬ ‫ما‬ ‫‪application‬‬ ‫انجام شود و يا‬ ‫‪Server Management Studio‬‬

‫فراخوانی کند‪( .‬اين روال به ما اجازه میدهد تا تنظیمات مربوط به ‪ failover‬را براي مشترکین يا ‪subscriber‬ها انجام‬
‫باشند‪ ).‬نحوه عملکرد‬ ‫‪Queued updating‬‬ ‫به‬ ‫‪immediate updating‬‬ ‫دهیم تا قادر به تعويض وضعیت از حالت‬
‫‪ transactional replication‬در تصوير ‪ 6-8‬نمايشداده شده است‪:‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪344‬‬

‫شکل ‪transactional replication 6-8‬‬

‫‪ Merge Replication‬يا رونوشت ادغامی‪:‬‬


‫ناشران دادهها را ارسال کرده و مشترکین آنها را دريافت میکنند و احتمال‬ ‫‪snapshot//transactional replication‬‬ ‫در‬
‫‪merge replication‬‬ ‫اينکه يک مشترک دادههايش کپی شده را به ناشران ارسال کند‪ ،‬وجود ندارد اما اين امکان به کمک‬
‫فعالیت خود را به طور معمول با گرفتن‬ ‫‪transactional replication‬‬ ‫نیز همانند‬ ‫‪Merge replication‬‬ ‫میسر شده است‪.‬‬
‫‪ snapshot‬از اشیا و دادههاي موجود در پايگاهدادهي يک ‪ publication‬آغاز میکند‪ .‬تغییرات ثانويه دادهها و نیز تغییرات‬
‫طرح يا ‪ schema‬در سمت ناشر صورت میگیرد و مشترکین نیز به واسطهي ‪trigger‬ها اين تغییرات را دنبال میکنند‪.‬‬
‫‪www.takbook.com‬‬

‫‪345‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬


‫يک مشترک يا ‪ subscriber‬به هنگام اتصال به شبکه دادههاي خود را با ناشر تطبیق داده و ‪ synchronize‬میکنند و در‬
‫بین ناشر و مشترک دچار تغییر شدهاند‪،‬‬ ‫‪synchronization‬‬ ‫واقع به مبادلهي تمامی رديفهايی که از آخرين عمل‬
‫کاربرد دارد و‬ ‫‪Server-to-Client‬‬ ‫معمو ًال براي محیطهاي سرور به سرويسگیرنده يا‬ ‫میپردازد‪Merge replication.‬‬

‫بهکارگیري آن در هريک از شرايط عنوان شده در زير مناسب است‪:‬‬

‫در شرايطی که چندين مشترک ممکن است که دادههاي مشابه را در زمانهاي مختلفی بهروزرسانی کرده و اين‬
‫تغییرات را براي ناشر و ساير مشترکین منتشر کنند‪.‬‬
‫زمانی که مشترکین نیاز به دريافت دادهها و ايجاد تغییرات بهصورت آفالين داشته باشند و بعداً اين تغییرات را با‬
‫ناشر و ديگر مشترکین ‪ synchronize‬کنند‪.‬‬
‫هر مشترک به يک پارتیشن متفاوت از دادهها نیاز داشته باشد‪.‬‬
‫هنگامیکه ممکن است ‪ conflict‬اتفاق بیفتد و در چنین شرايطی بايد قادر به تشخیص و رفع اين مشکل باشیم‪.‬‬

‫‪ Merge replication‬به سايتهاي مختلف اجازه میدهد تا بهصورت مستقل کار کنند و در نهايت آپديتها را با يکديگر‬
‫ادغام کرده تا به نتیجهاي يکسان و يکنواخت دست يابند‪ .‬ازآنجايیکه بهروزرسانی در بیشتر از يک گره صورت‬
‫میگیرد‪ ،‬دادههاي مشابه ممکن است توسط ناشر و نیز بیش از يک مشترک آپديت شوند بنابراين ممکن است به‬
‫راههايی را براي رسیدگی به مشکل‬ ‫‪merge replication‬‬ ‫اتفاق بیفتد و‬ ‫‪conflict‬‬ ‫هنگام ادغام اين آپديتها تضاد يا‬
‫‪conflict‬ها فراهم میآورد‪.‬‬
‫‪ Merge Replication‬چگونه کار میکند؟‬

‫يا نشريه‬ ‫‪publication‬‬ ‫اجرا میشود‪ .‬اگر‬ ‫‪merge agent‬‬ ‫و‬ ‫‪snapshot agent‬‬ ‫توسط عاملهايی چون‬ ‫‪Merge replication‬‬

‫فیلتر نشده باشد و يا از فیلترهاي استاتیک استفاده میکند‪ Snapshot agent ،‬تنها يک ‪ snapshot‬ايجاد میکند و اگر که‬
‫‪ publication‬از فیلترهاي پارامتري يا ‪parameterized filter‬ها بهره میگیرد‪ snapshot agent،‬از هر پارتیشن دادهها يک‬
‫‪ snapshot‬تهیه میکند‪ merge agent.‬نیز ‪snapshot‬هاي اولیهي تهیه شده را به مشترکین اعمال میکند‪ .‬اين عامل همچنین‬
‫اولیه صورتگرفته را ادغام‬ ‫‪snapshot‬‬ ‫تغییرات تدريجی که روي دادهها در سمت ناشر و يا مشترکین پس از ايجاد‬
‫کرده وبا توجه به قوانینی که براي آن پیکربندي میکنیم به تشخیص و حلوفصل ‪conflict‬هاي ايجاد شده میپردازد‪.‬‬
‫به هنگام استفاده از ‪ Merge replication‬سه تغییر براي ساختار پايگاه دادهي نشريه اتفاق میافتد‪:‬‬

‫يک ستون منحصربهفرد را براي هر سطر کپی شده تعیین میکند‬


‫چندين جدول سیستمی اضافه میشود‬
‫‪Trigger‬هايی براي جداولی که دادههاي آنها کپی شدهاند‪ ،‬ايجاد میکند‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪346‬‬


‫براي رديابی تغییرات‪ merge replication ،‬و نیز ‪ transactional replication‬اي که از قابلیت ‪ queued updating‬استفاده‬
‫‪merge‬‬ ‫میکند بايد قادر به شناسايی هر رديف از جدول منتشر شده بهگونهاي منحصربهفرد باشند‪ .‬براي انجام اين عمل‬
‫‪ replication‬ستون ‪ rowguid‬را به هر جدول اضافه میکند مگر اينکه جدول در حال حاضر داراي ستونی با نوع دادهي‬
‫‪ uniqueidentifier‬و ويژگی ‪ ROWGUIDCOL‬باشد که در اين صورت از همین ستون براي شناسايی هر سطر و تغییرات‬
‫آنها استفاده میشود‪.‬‬

‫‪ SQL‬سرور چندين جدول سیستمی براي پشتیبانی از رديابی دادهها‪ ،‬انجام عمل ‪ synchronization‬بهصورت کارآمد و‬
‫براي تشخیص ‪Conflict‬ها و نیز براي گزارشدهی‪ ،‬را به پايگاهداده اضافه میکند‪ .‬تمامی تغییرات مربوط به دادهها در‬
‫جداول سیستمی ‪ msmerge__contents‬و ‪ msmerge__tombstone‬ذخیره میشوند‪ .‬اين نوع از ‪replicatin‬ها ‪trigger‬هايی‬
‫را نصب میکند که تغییرات دادههاي هر ستون و يا هر رديف از جدول را دنبال میکنند‪.‬‬

‫‪Trigger‬ها تغییرات ايجاد شده روي جدول منتشر شده را ضبط کرده و اين تغییرات را در جدولهاي سیستمی‬
‫‪ msmerge__contents‬و ‪ msmerge__tombstone‬ثبت میکنند‪ .‬اين ‪trigger‬ها هنگامیکه ‪ snapshot agent‬براي اولینبار‬
‫براي يک نشريه يا ‪ publication‬اجرا میشود‪ ،‬ايجاد میشوند‪Trigger .‬ها در سمت يک مشترک نیز هنگامی به وجود‬
‫میآيند که ‪ snapshot‬براي مشترک استفاده شود‪ .‬در تصوير زير اجزايی که در‪ merge replication‬به کار گرفته میشوند‬
‫نمايشداده شده است‪:‬‬
‫‪www.takbook.com‬‬

‫‪347‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫شکل ‪merge replication 6-9‬‬

‫‪ 8-2‬نصب و راهاندازي سرويس ‪Replication‬‬


‫براي راهاندازي اين سرويس نیاز به سه سرور داريم تا بتوانیم اين سرويس را پیادهسازي کنیم‪ ،‬در شکل ‪ 44‬سه سرور‬
‫را براي اين کار مشاهده میکنید‪ ،‬سرور ‪ SQLServer‬که سرور اصلی میباشد و نقش ‪ Publisher & Distributor‬را بازي‬
‫میکند‪ ،‬در سرور ‪ DB-2‬و ‪ DB-3‬نقش ‪ Subscriber‬را دارند‪ ،‬براي اينکه سرورها را ايجاد کنید پیشنهاد من سرور مجازي‬
‫است تا هم نحوهي ايجاد و کار با آن آسان باشد و هم نحوهي پشتیبانگیري آن سريع و بدون مشکل انجام شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪348‬‬

‫‪SQLServer‬‬
‫‪Publisher & Distributor‬‬

‫‪REP-1 :‬‬

‫‪DB2‬‬ ‫‪DB3‬‬
‫‪Subscriber 2‬‬
‫‪Subscriber 1‬‬
‫‪REP-3 :‬‬
‫‪REP-2 :‬‬

‫شکل ‪ 44‬سناریو ‪Replication‬‬

‫هرگونه تغییري که در جدول مرتبط با لیست کاربران‬ ‫‪SQLServer‬‬ ‫در ادامه و در سناريو شکل ‪ 44‬میخواهیم که سرور‬
‫برتر ايجاد میشود را با جداول موجود روي سرورهاي ‪ DB2‬و ‪ Replicate ،DB3‬کند؛ بنابراين بايد تنظیمات الزم براي‬
‫توزيع و انتشار (‪ Distribution‬و ‪ )Publication‬را روي سرور ‪ SQLServer‬و تنظیمات مربوط به اشتراک (‪)Subscription‬‬
‫را روي سرورهاي ‪ DB2‬و ‪ DB3‬انجام دهیم‪.‬‬
‫اول از هر چیز بايد در نظر داشته باشیم که موقع نصب ‪ SQL‬سرور‪ ،‬قابلیت ‪ Replication‬را نیز فعال کنیم‪ ،‬براي همین‬
‫بهمانند شکل ‪ 45‬بايد تیک گزينهي ‪ SQL Server Replication‬را انتخاب و آن را نصب کنید‪ ،‬در هر سه سرور بايد اين‬
‫کار را انجام دهید‪.‬‬

‫شکل ‪45‬‬

‫‪SQL Server Configuration Manager‬‬ ‫بعد از فعالکردن سرويس ‪ SQL Server Replication‬بايد بهمانند شکل ‪ 47‬وارد‬
‫شويد و سرويس ‪ SQL Server Browser‬را فعال کنید‪ ،‬اين کار را بايد در همهي سرورها انجام دهید‪ ،‬البته براي اينکه‬
‫اين سرويس را فعال کنید بايد بر روي آن کلیک راست کنید و گزينهي ‪ Properties‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪349‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫شکل ‪47‬‬

‫در شکل ‪ 48‬بايد وارد تب ‪ Service‬شويد و گزينهي ‪ Start Mode‬را در حالت ‪ Automatic‬قرار دهید و ‪ ok‬کنید‪.‬‬

‫شکل ‪48‬‬

‫در ادامه بهمانند شکل ‪ 49‬بايد سرويس را ‪ Start‬کنید‪.‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪350‬‬

‫شکل ‪49‬‬

‫براي اينکه همزمان به هر سه سرور دسترسی داشته باشید بايد ‪ SQL Server Management Studio‬را اجرا کنید و بهمانند‬
‫شکل ‪ 50‬دو سرور ‪ DB2‬و ‪ DB3‬را با کلیک بر روي ‪ Connect‬اضافه کنید‪.‬‬

‫شکل ‪50‬‬

‫در شکل ‪ 51‬بايد سرور ‪ DB2‬را وارد کنید و بر روي ‪ Connect‬کلیک کنید‪ ،‬توجه داشته باشید دقیقاً همین کار را براي‬
‫سرور ‪ DB3‬انجام دهید‪.‬‬

‫شکل ‪51‬‬

‫همانطور که در شکل ‪ 52‬مشاهده میکنید هر سه سرور به لیست اضافه شده است و حاال میتوانیم عملیات‬
‫‪ Replication‬را آغاز کنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪351‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫شکل ‪52‬‬

‫پیکربندی بخش توزیع یا ‪Distribution‬‬


‫‪Replication‬‬ ‫در ابتداي کار به سراغ ‪ Distribution‬بر روي سرور ‪ SQLServer‬میرويم‪ .‬براي اين منظور روي گزينهي‬
‫در کنسول مديريتی راست کلیک کرده و عبارت ‪ Configure Distribution‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪352‬‬

‫شکل ‪53‬‬

‫بهمانند شکل ‪ 54‬سرور توزيعکننده يا ‪ Distributor‬را انتخاب میکنیم که میتوان خود سرور فعلی را انتخاب کرده و‬
‫يا سرور ديگري را بهعنوان توزيعکننده در نظر بگیريم‪ .‬فقط بايد در نظر داشته باشیم که پیکربندي ‪ Distribution‬روي‬
‫سرور ديگر که آن را بهعنوان توزيعکننده انتخاب میکنیم‪ ،‬از قبل انجام شده باشد‪ .‬در اينجا ما سرور فعلی را انتخاب‬
‫و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪54‬‬

‫در شکل ‪ 55‬گزينهي اول را براي سرويس ‪ Agent‬انتخاب کنید تا سرويس بهصورت اتوماتیکالی اجرا شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪353‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫شکل ‪55‬‬

‫شکل ‪ 56‬مربوط به تعیین مسیر فولدري است که ‪Snapshot‬هاي گرفته شده از تغییرات در آن کپی میشوند‪ .‬براي‬
‫و ‪Merge agent‬هاي اجرا شده روي ‪Subscriber‬ها بتوانند به ‪Snapshot‬هاي ‪publication‬ها‬ ‫‪Distribution agent‬‬ ‫اينکه‬
‫دسترسی داشته باشند‪ ،‬در اين قسمت بايد مسیر فولدر در نظر گرفته شده براي ذخیرهي ‪Snapshot‬ها را معرفی کنیم‪.‬‬
‫در واقع بايد آدرس شبکهي پوشهي نگهدارندهي ‪snapshot‬ها را مشخص کنیم‪ .‬مسیر لوکال و پیشفرضی که در اين‬
‫قسمت قرار دارد‪pull Subscription ،‬هاي ايجاد شده سمت مشترکین را پشتیبانی نمیکند چراکه اين مسیر يک مسیر‬
‫تحت شبکه نمیباشد و براي ايجاد ‪ pull Subscription‬بايد يک مسیر شبکهاي را در اينجا معرفی کنیم که به پوشهي‬
‫‪Snapshot‬ها اشاره کند‪ ،‬توجه داشته باشید که مسیري که ايجاد میکنید بايد‬

‫شکل ‪56‬‬

‫و نیز محل ذخیرهسازي آن را مشخص میکنیم‪ .‬اين پايگاهداده براي‬ ‫‪Distribution‬‬ ‫در شکل ‪ ،58‬نام پايگاه دادهاي‬
‫دادهايی با پسوند (‪ )MDF.‬و براي ‪ Log‬فايلها با پسوند (‪ )ldf.‬پیکربندي میشود‪ .‬پايگاه دادهاي مربوط به ‪Distribution‬‬

‫تغییرات ايجاد شده در دادهها را در ‪ transactional publication‬ذخیره میکند تا زمانی که مشترکین يا همان ‪Subscriber‬ها‬
‫‪merge‬‬ ‫و‬ ‫‪Snapshot publication‬‬ ‫بتوانند آپديت شوند‪ .‬همچنین اين ديتابیس اطالعات را برحسب تاريخ براي‬
‫‪drive‬‬ ‫‪ publication‬ذخیره میکند‪ .‬مسیري که در اينجا در نظر میگیريم حتماً بايد يک آدرس لوکال باشد و با يک‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪354‬‬


‫‪ letter‬و عالمت دو نقطه شروع شود (بهعنوانمثال ‪ )C:‬و در اينجا استفاده از ‪Drive letter‬هاي ‪ map‬شده و مسیرهاي‬
‫تحت شبکه غیرمجاز میباشد‪.‬‬

‫شکل ‪58‬‬

‫سرور و يا سرورهايی که قرار است بهعنوان ناشر و يا همان ‪ publisher‬فعالیت کنند را در شکل ‪ 59‬مشخص میکنیم‪.‬‬
‫براي انجام توزيع انتشارات و يا ‪publication‬هاي خود استفاده میکند‪ .‬بهصورت‬ ‫اين سرور و يا سرورها از ‪Distributor‬‬

‫پیشفرض سرور فعلی بهعنوان ‪ publisher‬در نظر گرفته میشود که بسته به ساختار پايگاههاي داده و سناريوي مورد‬
‫نظر با کلیک بر روي گزينه ‪ Add‬میتوانیم سرورهاي ديگري نیز براي اين بخش در نظر بگیريم‪.‬‬

‫شکل ‪59‬‬

‫در اين قسمت چگونگی خاتمه يافتن تنظیمات انجام شده را مشخص میکنیم‪ .‬بهصورت پیشفرض گزينهي‬
‫‪ Configure distribution‬انتخاب شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪355‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫شکل ‪60‬‬

‫در نهايت در صورت عدم بروز مشکل‪ ،‬با نمايش عبارت ‪ success‬در قسمت وضعیت‪ ،‬انجام موفقیتآمیز تنظیمات را‬
‫در شکل ‪ 61‬مشاهده خواهیم کرد‪.‬‬

‫شکل ‪61‬‬

‫پیکربندی نشریه یا ‪Publication‬‬

‫انجام تنظیمات اين بخش نیز روي سرور اول (‪ )SQLServer‬صورت خواهد گرفت چراکه طبق سناريو اين سرور هر‬
‫دو نقش ناشر و توزيعکننده را ايفا میکند؛ بنابراين بهمانند شکل ‪ 62‬روي گزينه ‪ Local Publication‬در کنسول مديريتی‬
‫راست کلیک کرده و گزينهي ‪ New Publication‬را انتخاب میکنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪356‬‬

‫شکل ‪62‬‬

‫در شکل ‪ ،63‬لیستی از پايگاههاي دادهي دربردارندهي دادهها و يا اشیايی که قصد انتشار آنها را داريم نمايش داده‬
‫میشود‪ .‬در اينجا لیست همهي ديتابیسهاي موجود را مشاهده میکنید‪ ،‬بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪63‬‬

‫در شکل ‪ 64‬انواع نشريه و يا همان ‪publication‬ها نمايش داده میشود و درواقع بخشی است که در آن نوع ‪replication‬‬

‫مشخص میشود‪ ،‬در اين قسمت گزينهي ‪ Transactional publication‬را انتخاب کرده و روي ‪ Next‬کلیک میکنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪357‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫شکل ‪64‬‬

‫در شکل ‪ 65‬نیز بايد جداول و دادههاي مورد نظر که قرار است ‪ Replication‬شود را از لیست انتخاب کنید‪.‬‬

‫شکل ‪65‬‬

‫در شکل ‪ 65‬با کلیک روي گزينهي ‪ Article properties‬میتوانیم جزئیات توضیحات مرتبط با جدولی را که انتخاب‬
‫کرديم و يا توضیحات مربوط بهتمامی اشیاء موجود در ‪ Article‬را مشاهده کرده و در صورت نیاز تغییراتی را در آن‬
‫ايجاد کنیم‪ .‬در اين جا ما همان تنظیمات پیشفرض را دستنخورده باقی میگذاريم‪.‬‬
‫در شکل ‪ 66‬بايد از عملیات فیلترينگ استفاده کنیم‪ ،‬از جمله داليل استفاده از فیلتر میتوان به‪ ،‬بهحداقلرساندن‬
‫دادههاي ارسالی روي شبکه و کاهش مقدار فضاي ذخیرهسازي براي يک مشترک را يادآور شد‪ .‬در اين بخش از‬
‫تنظیمات با ايجاد فیلترينگ میتوانیم به حذف رديفهايی که به آنها نیاز نداريم از جدول منتشر شده بپردازيم‪ .‬يک‬
‫مثال ساده براي درک فیلترکردن اين است که مثالً نام و نام خانوادگی کاربران برتر تغییر نخواهد کرد بنابراين نیاز به‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪358‬‬


‫انتشار مجدد آنها نداريم‪ .‬در اين تصوير با کلیک روي گزينه ‪ Add‬صفحهي مربوط به ايجاد فیلترينگ نمايش داده‬
‫میشود‪ .‬در اين سناريو ما هیچگونه فیلتري را در نظر نگرفته و با کلیک روي ‪ Next‬به مرحلهي بعدي میرويم‪.‬‬

‫شکل ‪66‬‬

‫در شکل ‪ 67‬تعیین میکنیم که چه زمانی ‪ Snapshot agent‬اجرا شود‪ .‬مشترکین به واسطهي ‪snapshot‬هاي داده و‬
‫طرحهاي يک نشريه مقداردهی میشوند و اين ‪ Snapshot agent‬است که ‪ snapshot‬را ايجاد میکند‪ .‬در اين تصوير دو‬
‫گزينه وجود دارد اولین گزينه بیانگر ايجاد يک ‪ Snapshot‬بهصورت فوري و در دسترس نگهداشتن آن براي مقداردهی‬
‫اولیه به مشترکین است و گزينهي دوم شرايط زمانبندي را براي فعالیت ‪ Snapshot agent‬فراهم میآورد‪ .‬گزينهي اول‬
‫را مارکدار میکنیم‪.‬‬

‫شکل ‪67‬‬

‫شکل ‪ 68‬مربوط با مشخصکردن حساب کاربري براي هر ‪ Agent‬میباشد که اجرا و تنظیمات ارتباطات آن تحت اين‬
‫کلیک میکنیم‪ .‬در شکل ‪،69‬‬ ‫‪Security Settings‬‬ ‫انجام خواهد شد‪ .‬براي انجام اين تغییرات روي گزينهي‬ ‫‪Account‬‬
‫‪www.takbook.com‬‬

‫‪359‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬


‫سطح‬ ‫‪SQL Server Agent‬‬ ‫را مارکدار میکنیم‪ .‬اگر سرويس‬ ‫‪Run under the SQL Server Agent account‬‬ ‫گزينهي‬
‫دسترسی و مجوزهاي الزم را براي دسترسی به پوشهاي که براي نگهداري ‪Snapshot‬ها انتخاب کردهايم نداشته باشد‪،‬‬
‫بايد روشی ديگر از احراز هويت حساب کاربري را براي فراهمآوردن اين دسترسی در نظر بگیريم‪ .‬در نهايت تنظیمات‬
‫صورتگرفته همانند کادر کوچک مشخص شده در صفحهنمايش داده خواهند شد‪.‬‬

‫شکل ‪68‬‬

‫شکل ‪69‬‬

‫‪Create the‬‬ ‫در شکل ‪ 70‬چگونگی پايان يافتن تنظیمات انجام شده را مشخص میکنیم‪ .‬بهصورت پیشفرض گزينهي‬
‫‪ publication‬مارکدار شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪360‬‬

‫شکل ‪70‬‬

‫در شکل ‪ ،71‬خالصهاي از تنظیماتی که انجام داديم‪ ،‬نمايش داده میشود‪ .‬نام مورد نظر براي نشريه يا ‪publication‬اي‬
‫را که ايجاد کردهايم در اين بخش مشخص وارد و در نهايت بر روي گزينهي ‪ Finish‬کلیک میکنیم‪.‬‬

‫شکل ‪71‬‬

‫‪Replication‬‬ ‫پس از پیکربندي موفقیتآمیز ‪ ،Publication‬میتوانیم همانند تصوير ‪ Publication‬ايجاد شده را در بخش‬
‫کنسول مديريتی مشاهده کنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪361‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫شکل ‪72‬‬

‫همانطور که قبالً گفتیم در اينجا هر سه سرور موجود در سناريو را از طريق کنسول ‪ Management Studio‬مديريت‬
‫اي ن‬ ‫‪Replication‬‬ ‫زيرمجموعهي‬ ‫‪Local Subscription‬‬ ‫میکنیم‪ .‬در سرور دوم يعنی ‪ ،DB2‬بهمانند شکل ‪ ،73‬بر روي‬
‫سرور در کنسول مديريتی راست کلیک کرده و گزينهي ‪ New Subscription‬را انتخاب میکنیم‪.‬‬

‫شکل ‪73‬‬

‫همانطور که در شکل ‪ ،74‬نشانداده شده است بايد سرور ‪ publisher‬و يا نشريهاي را که میخواهیم ‪Subscription‬ها‬
‫‪Find SQL Server‬‬ ‫از قسمت نوار کشويی گزينهي‬ ‫‪publisher‬‬ ‫را براي آن ايجاد کرده‪ ،‬تعیین کنیم‪ .‬پس در پنجرة‬
‫‪ Publisher‬را بازکرده و پس از انتخاب سرور مورد نظر (در اينجا ‪ )SQLServer‬نام ‪ publication‬ايجاد شده در لیست‬
‫نمايان خواهد شد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪362‬‬

‫شکل ‪74‬‬

‫در شکل ‪ ،75‬بايد محلی که ‪Distribution Agent‬ها روي آن اجرا میشوند را مشخص کنیم‪ .‬براي اين منظور دو گزينه‬
‫‪subscriber‬‬ ‫پیشروي ماست‪ :‬اجراي همهي ‪Agent‬ها روي ‪ Distributor‬يا ‪ Push subscription‬و اجراي هر ‪ Agent‬روي‬
‫به توضیح ‪pull\Push Subscription‬ها پرداختیم‬ ‫‪replication‬‬ ‫‪ .‬در اوايل اين فصل در مورد‬ ‫‪Pull subscription‬‬ ‫خود يا‬
‫برحسب شرايط میتوان يکی از اين دو نوع را براي ‪Agent‬ها در نظر گرفت‪ .‬در قسمت قبل ما يک مسیر لوکال را‬
‫براي دسترسی به پوشهي ‪Snapshot‬ها تعیین کرديم و میدانیم آدرس لوکال ‪ Pull Subscription‬را پشتیبانی نمیکند‪،‬‬
‫بنابراين در اينجا گزينهي اول يعنی ‪ Push Subscription‬را انتخاب میکنیم‪.‬‬

‫شکل ‪75‬‬

‫در اين قسمت بايد ‪subscriber‬ها يا مشترکین و ديتابیس آنها را مشخص کنیم‪ .‬بهصورت پیشفرض ويزارد سروري را‬
‫که تنظیمات در حال حاضر روي آن صورت میگیرد بهعنوان يکی از مشترکین انتخاب میکند‪ .‬با کلیک روي گزينهي‬
‫‪ Add SQL Server Subscriber‬میتوانیم سرورهاي ديگري را بهعنوان مشخص کنیم‪ .‬در سناريو ما دو ‪ Subscriber‬وجود‬
‫‪Replicate‬‬ ‫دارد‪ :‬سرورهاي ‪ DB2‬و ‪ .DB3‬پس از انتخاب اين سرورها حال نوبت به تعیین ديتابیسی که قرار است عمل‬
‫با آنها صورت گیرد‪ ،‬میباشد‪ .‬بدين منظور بهمانند شکل ‪ 76‬با کلیک روي نوار کشويی مقابل سرورهاي انتخابی‪،‬‬
‫‪www.takbook.com‬‬

‫‪363‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬


‫ديتابیس مورد نظر را برمیگزينیم‪ .‬اگر ديتابیسی را روي سرور براي ‪ Replication‬در نظر نگرفته باشیم‪ ،‬باتوجهبه شکل‬
‫‪ 76‬و کلیک روي گزينهي ‪ New Data base‬نیز میتوان ديتابیس مورد نظر را در لحظه ايجاد کرد‪.‬‬

‫شکل ‪76‬‬

‫در شکل ‪ 77‬بايد ديتابیس مربوطه که در قسمت قبلی انتخاب کرديم را ايجاد کنید و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪77‬‬

‫‪FB3‬‬ ‫همانطور که در شکل ‪ 78‬مشاهده میکنید ديتابیس مورد نظر ايجاد شده است‪ ،‬و در ادامه بايد سرور سوم يعنی‬
‫را هم به لیست اضافه کنید و براي آن هم ديتابیس ‪ DB22‬را ايجاد کنید‪ ،‬براي اين کار بر روي ‪ Add Subscriber‬کلیک‬
‫کنید و گزينهي ‪ Add SQL Server Subscriber‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪364‬‬

‫شکل ‪78‬‬

‫همانطور که در شکل ‪ 79‬مشاهده میکنید سرور ‪ DB3‬هم به لیست اضافه شده و ديتابیس مورد نظر را هم براي آن‬
‫ايجاد کرديم‪.‬‬

‫شکل ‪79‬‬

‫مشخص کنیم‪ ،‬بر روي‬ ‫‪Distribution Agent‬‬ ‫در شکل ‪ 80‬بايد آپشنهاي مرتبط با ارتباطات و پردازشها را براي‬
‫گزينهي مورد نظر کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪365‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫شکل ‪80‬‬

‫تحت آن اجرا شده و عمل همگامسازي با مشترکین را انجام‬ ‫‪Distribution Agent‬‬ ‫‪.‬براي تعیین حساب کاربري که‬
‫خواهد داد بهمانند شکل ‪ 81‬گزينهي ‪ Run the SQL Server Agent Service Account‬را انتخاب کرده و براي برقراري‬
‫ارتباط با ‪ Distributor‬و ‪ Subscriber‬نیز گزينهي ‪ By impersonation the process account‬را برمیگزينیم‪ .‬اين تنظیمات‬
‫بايد براي هر دو سرور انتخاب شده بهعنوان ‪ ،Subscriber‬بهصورت مجزا انجام شود‪.‬‬

‫شکل ‪81‬‬

‫پس از انجام تنظیمات باال نتیجهي آن همانند شکل ‪ 82‬خواهد بود‪ ،‬بر روي ‪ Next‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪366‬‬

‫شکل ‪82‬‬

‫در شکل ‪ ،83‬بايد برنامهي زمانبندي همگامسازي را براي هر ‪ Agent‬مشخص کنیم‪ .‬منوي کشويی در اينجا سه گزينه‬
‫در اختیار ما قرار میدهد که بواسطهي آنها ‪ Distribution agent‬به ترتیب میتواند در حالت اجرا بهصورت مداوم‪ ،‬اجرا‬
‫‪agent‬‬ ‫بر برحسب تقاضا و يا اجرا بر اساس برنامهي زمانبندي تعیین شده‪ ،‬قرار گیرد‪ .‬پس از اطمینان از قرارگرفتن‬
‫در وضعیت ‪ Run continuously‬روي ‪ Next‬کلیک میکنیم‪.‬‬

‫شکل ‪83‬‬

‫يا نشريه در اين‬ ‫‪Publication‬‬ ‫از دادهها و طرحهاي‬ ‫‪Snapshot‬‬ ‫نحوهي مقداردهی اولیه هر اشتراک بهواسطهي يک‬
‫قسمت مشخص میشود‪ .‬دو روش براي مقداردهی اولیهي ‪Subscription‬ها وجود دارد‪ :‬بهصورت فوري و در اولین‬
‫يا بالفاصله را براي هر دو سرور‬ ‫‪Immediately‬‬ ‫همگامسازي يا ‪ .Synchronization‬از منوي کشويی موجود گزينهي‬
‫موجود انتخاب کرده و روي ‪ Next‬کلیک میکنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪367‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬

‫شکل ‪84‬‬

‫در شکل ‪ 83‬میتوانیم تعیین کنیم که تنها ‪ Subscription‬ايجاد شده و يا فايل اسکريپت پیکربندي ‪ Subscription‬نیز‬
‫ايجاد شود‪ .‬در اين بخش گزينهي اول را انتخاب میکنیم‪.‬‬

‫شکل ‪83‬‬

‫در شکل ‪ ،84‬خالصهاي از تنظیماتی که براي ايجاد ‪Subscription‬ها انجام داديم نمايشداده شده است‪.‬‬

‫شکل ‪84‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪368‬‬


‫با کلیک روي گزينهي ‪ Finish‬در شکل ‪ ،84‬فرايند ايجاد ‪subscription‬ها آغاز خواهد شد و در نهايت با نمايش عبارت‬
‫‪ success‬در قسمت ‪ ،Status‬انجام موفقیتآمیز تنظیمات را مشاهده خواهیم کرد‪.‬‬
‫حاال هر تغییري در سرور اصلی (‪ )SQLServer‬ايجاد شود در سرورهاي ديگر‬ ‫‪Replication‬‬ ‫خوب بعد از ايجاد‬
‫(‪ )DB2,DB3‬هم انجام خواهد شد که اين موضوع را میتوانیم بررسی کنیم‪ ،‬طبق شکل ‪ 85‬در سرور اصلی يعنی‬
‫‪ SQLServer‬بر روي جدول مورد نظر خود کلیک راست کنید و گزينهي ‪ Edit Top‬را انتخاب کنید‪.‬‬

‫شکل ‪85‬‬

‫يک سطر جديد بهمانند شکل ‪ 86‬به جدول مورد نظر اضافه میکنیم‪ ،‬بعدازاين کار اين تغییرات بهسرعت و ظرف‬
‫مدت چند ثانیه به سرورهاي ديگر هم ارسال میشود‪.‬‬

‫شکل ‪86‬‬

‫براي اينکه تغییرات را مشاهده کنیم بهمانند شکل ‪ 87‬وارد سرور ‪ DB2‬شويد و بر روي جدول مورد نظر کلیک‬
‫راست و گزينهي ‪ Edit Top‬را انتخاب کنید‪.‬‬

‫شکل ‪87‬‬
‫‪www.takbook.com‬‬

‫‪369‬‬ ‫‪SQL Replication‬‬ ‫فصل ‪/ 6‬‬


‫همانطور که مشاهده میکنید در شکل ‪ 88‬تغییرات بهدرستی انجام شده است‪.‬‬

‫شکل ‪88‬‬

‫براي اينکه سرويس ‪ Replication‬را مانیتور کنیم‪ ،‬بايد بهمانند شکل ‪ 89‬بر روي ‪ Publications‬مورد نظر که با هم ايجاد‬
‫کرديم کلیک راست کنید و گزينهي ‪ Lunch Replication Monitor‬انتخاب کنید‪.‬‬

‫شکل ‪89‬‬

‫همانطور که در شکل ‪ 90‬مشاهده میکنید هر دو سرور ‪ DB2‬و ‪ DB3‬در حال کار با بهترين ‪ Permorfance‬هستند‪،‬‬
‫اگر اطالعات بیشتري از هر سرور بخواهید میتوانید بر روي آنها دو بار کلیک کنید‪.‬‬
www.takbook.com

SQL Server 2019 ‫آموزش‬ 370

90 ‫شکل‬
‫‪www.takbook.com‬‬

‫فصل هفتم‬
‫‪SQL Reporting Service‬‬

‫‪SQL‬‬ ‫يا همان ‪ SQL Server Reporting Service‬يک سرويس براي گزارشگیري از عملکرد شما در‬ ‫‪SSRS‬‬ ‫سرويس‬
‫است و حتی سازمانهايی که از ‪ SQL‬استفاده نمیکنند اين قابلیت وجود دارد که سرويس ‪ Reporting‬به پايگاه دادههاي‬
‫ديگر متصل شود و يک گزارش کامل از آنها تهیه کند‪ ،‬در نظر داشته باشید اين سرويس بسیار کارآمد است و بهتر‬
‫است در سازمان خود براي ارائه گزارش کامل فعال کنید‪.‬‬
‫بايد فايل آن را از سايت مايکروسافت دريافت و در سرور‬ ‫‪SQL‬‬ ‫براي راهاندازي اين سرويس در ورژنهاي جديد‬
‫‪ SQL Server‬که با هم راه انداختیم نصب کنید‪ ،‬براي دانلود اين سرويس به شکل ‪ 10-1‬توجه کنید‪ ،‬در اين صفحه بر‬
‫روي ‪ Install SQL Server Reporting Services‬کلیک کنید‪ ،‬بعد از کلیک وارد سايت مايکروسافت خواهید شد‪.‬‬

‫شکل ‪10-1‬‬

‫در شکل ‪ 10-2‬بر روي لینک دانلود مورد نظر کلیک کنید‪.‬‬

‫شکل ‪10-2‬‬

‫در شکل ‪ 10-3‬بر روي ‪ Download‬کلیک کنید و در ادامه فايل مورد نظر را نصب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪372‬‬

‫شکل ‪10-3‬‬

‫بعد از دانلود فايل شکل ‪ 10-4‬ظاهر خواهد شد که بر روي ‪ Install Reporting Services‬کلیک کنید‪.‬‬

‫شکل ‪10-4‬‬

‫در شکل ‪ 10-5‬بايد اليسنس نرمافزار را وارد و بر روي ‪ Next‬کلیک کنید و در ادامه هم بر روي ‪ Next‬و ‪ Install‬کلیک‬
‫کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪373‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬

‫شکل ‪10-5‬‬

‫‪Configure‬‬ ‫در ادامه کار و بعد از نصب شکل ‪ 10-6‬را مشاهده خواهید کرد که براي انجام تنظیمات تکمیلی بر روي‬
‫‪ Report Server‬کلیک کنید‪.‬‬

‫شکل ‪10-6‬‬

‫در شکل ‪ 10-7‬بايد نام سرور ‪ SQL‬خود را وارد و بر روي ‪ Connect‬کلیک کنید‪.‬‬

‫شکل ‪10-7‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪374‬‬


‫در شکل ‪ 10-8‬بايد تنظیمات مربوط به ‪ Reporting Service‬را انجام دهید براي شروع وارد ‪ Service Account‬شويد و‬
‫کلیک کنید تا‬ ‫‪Apply‬‬ ‫يک کاربر تحت دومین را بهمانند شکل وارد کنید‪ ،‬بعد از واردکردن کاربر مورد نظر بر روي‬
‫اطالعات ثبت شود‪.‬‬

‫شکل ‪10-8‬‬

‫را فعال کنید شما فقط‬ ‫‪Reporting‬‬ ‫که در شکل ‪ 10-9‬میتوانید سرويس تحت وب‬ ‫‪Web Service URL‬‬ ‫در قسمت‬
‫کافی است بر روي ‪ Apply‬کلیک کنید تا تنظیمات مورد نظر بر روي سرويس ‪ IIS‬انجام شود‪ ،‬همانطور که مشاهده‬
‫‪Reporting‬‬ ‫تنظیمات مورد نظر انجام شده و آدرس دسترسی به وبسرويس‬ ‫‪Apply‬‬ ‫میکنید بعد از کلیک بر روي‬
‫مشخص شده است‪.‬‬

‫شکل ‪10-9‬‬

‫‪Change‬‬ ‫در شکل ‪ 10-10‬بايد براي سرويس ‪ Reporting‬ديتابیس ايجاد کنیم براي اين کار بهمانند شکل ‪ 10-10‬بر روي‬
‫‪ Database‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪375‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬

‫شکل ‪10-10‬‬

‫‪Create a new report server‬‬ ‫در ادامه بايد يک ديتابیس جديد ايجاد کنیم براي اين کار بهمانند شکل ‪ 10-11‬گزينهي‬
‫را انتخاب کنید تا ديتابیس جديد را ايجاد کنیم‪ ،‬اگر هم از قبل ايجاد کرديد بايد گزينهي دوم را انتخاب‬ ‫‪database‬‬

‫کنید‪.‬‬

‫شکل ‪10-11‬‬

‫که قرار است بر روي آن ديتابیس را ايجاد کنیم را در قسمت اول وارد کنید‪،‬‬ ‫‪SQL‬‬ ‫در شکل ‪ 10-12‬بايد نام سرور‬
‫اگر توجه کنید ما ‪ localhost‬وارد کرديم چون در حال کار بر روي سرور ‪ SQL‬هستیم و میتوانیم ‪ locolhost‬هم وارد‬
‫کنیم و يا اينکه نام آن سرور را وارد کنید‪ ،‬در قسمت بعد بايد نوع احراز هويت را مشخص کنید و کاربر مورد نظر‬
‫خود را وارد کنید‪ ،‬میتوانید با کلیک بر روي ‪ Test Connection‬از ارتباط با سرور مطمئن شويد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪376‬‬

‫شکل ‪10-12‬‬

‫در شکل ‪ 10-13‬بايد نام ديتابیس مربوط به ‪ Report Service‬را وارد و زبان مورداستفاده آن را انتخاب کنید‪.‬‬

‫شکل ‪10-13‬‬

‫در صفحهي شکل ‪ 10-14‬بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪10-14‬‬
‫‪www.takbook.com‬‬

‫‪377‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬


‫نتیجه نهايی کار بايد مانند شکل ‪ 10-15‬باشد‪ ،‬بر روي ‪ Finish‬کلیک کنید‪.‬‬

‫شکل ‪10-15‬‬

‫‪Exit‬‬ ‫همانطور که در شکل ‪ 10-16‬مشاهده میکنید ديتابیس مورد نظر به درستی ايجاد شده است و بر روي دکمه‬
‫کلیک کنید‪.‬‬

‫شکل ‪10-16‬‬

‫اگر وارد ‪ SQL Server Engine‬شويد دو ديتابیس ايجاد شده است که ديتابیس ‪/ ReportServer‬ديتابیس اصلی است و‬
‫ديتابیس ‪ ReportServerTempDB‬براي نگهداشتن موقت اطالعات در حال اجرا‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪378‬‬

‫شکل ‪10-17‬‬

‫بعد از انجام مراحل باال اگر مرورگر خود را باز کنید و آدرس زير را اجرا کنید شکل ‪ 10-18‬را مشاهده خواهید‬
‫کرد‪.‬‬
‫‪http://sqlserver/reports/‬‬

‫در شکل ‪ 10-18‬صفحهي اصلی گزارشگیري را مشاهده میکنید که داراي گزينههاي مختلف است‪ ،‬براي اينکه بتوانیم‬
‫در ‪ SQL‬يک گزارش ايجاد و به آن نما دهیم بايد از ابزارهاي مختلفی استفاده کنیم و بهترين و در دسترسترين ابزار‪،‬‬
‫‪ Report Bulder‬است که بايد آن را بهمانند شکل ‪ 10-18‬دانلود و بر روي سرور مورد نظر نصب کنید‪ ،‬البته میتوانید‬
‫آن را در سیستمهاي ديگر هم نصب کنید‪.‬‬

‫شکل ‪10-18‬‬

‫بعد از اجرا‪ ،‬اولین صفحهاي که باز میشود مانند شکل ‪ 10-19‬است که براي شروع کار بر روي ‪ Blank Report‬کلیک‬
‫کنید‪.‬‬

‫شکل ‪10-19‬‬
‫‪www.takbook.com‬‬

‫‪379‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬


‫در شکل ‪ 10-20‬بايد طراحی خود را بر روي صفحه ايجاد کنید که اين طراحی بستگی به نظر شما هم دارد شايد‬
‫بخواهید از عکس استفاده کنید و يا چیزهاي ديگر‪ ،‬اما اصل کار اين است که بتوانیم جداول خود را وارد اين گزارشها‬
‫کنیم‪ ،‬براي اين کار بر روي ‪ Data Sources‬کلیک راست کنید و بر روي ‪ Add Data Sources‬کلیک کنید‪.‬‬

‫شکل ‪10-20‬‬

‫‪Microsoft SQL‬‬ ‫گزينهي‬ ‫‪Select Connection Type‬‬ ‫در شکل ‪ 10-21‬نام مرود نظر خود را وارد کنید و در قسمت‬
‫‪ Server‬را انتخاب کنید و بر روي ‪ Build‬کلیک کنید‪.‬‬

‫شکل ‪10-21‬‬

‫را وارد کنید‪ ،‬بعد از واردکردن نام سرور بر روي‬ ‫‪SQL‬‬ ‫بايد نام سرور‬ ‫‪Server Name‬‬ ‫در شکل ‪ 10-22‬در قسمت‬
‫‪ Refresh‬کلیک کنید‪ ،‬بعد از کلیک بر روي دکمه ‪ Refresh‬نام ديتابیسهاي مورد نظر در ‪ SQL‬در قسمت زيري نمايش‬
‫داده خواهد شد که شما بايد يکی از ديتابیسها که قرار است از آن گزارش تهیه کنید را انتخاب و بر روي ‪ OK‬کلیک‬
‫کنید تا اين ارتباط به لیست اضافه شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪380‬‬

‫شکل ‪10-22‬‬

‫در شکل ‪ 10-23‬بعد از ايجاد ‪ Data Source‬بايد يک ‪ Datasets‬ايجاد کنید تا بتوانیم اطالعات موجود در جداول را در‬
‫خروجی نمايش دهیم براي اين کار بر روي ‪ Datasets‬مورد نظر کلیک راست کنید و گزينهي ‪ Add Dataset‬را انتخاب‬
‫کنید‪.‬‬

‫شکل ‪10-23‬‬

‫در شکل ‪ 10-24‬بايد نام مورد نظر خود را وارد کنید و از قسمت ‪ Data Source‬بايد گزينهي ‪ DataSource1‬را که با‬
‫کلیک‬ ‫و براي اينکه جداول آن را در خروجی مشخص کنیم بر روي ‪Query Designer‬‬ ‫هم ايجاد کرديم را انتخاب کنید‬
‫کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪381‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬

‫شکل ‪10-24‬‬

‫در شکل ‪ 10-25‬بايد جدول مورد نظر خود را انتخاب کنید‪ ،‬بعد از انتخاب لیست آن نمايش داده خواهد شد‪.‬‬

‫شکل ‪10-25‬‬

‫در شکل ‪ 10-26‬میخواهیم يک جدول ايجاد کنیم و اطالعات مورد نظر در جدول ‪ Employees‬را در اين جدول قرار‬
‫دهیم براي اين کار بر روي صفحه مورد نظر کلیک راست کنید و از قسمت ‪ Insert‬گزينهي ‪ Table‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪382‬‬

‫شکل ‪10-26‬‬

‫در شکل ‪ 10-27‬در جدول مورد نظر اگر موس را قرار دهید آيکون مورد نظر را مشاهده خواهید کرد که بر روي آن‬
‫کلیک کنید‪.‬‬

‫شکل ‪10-27‬‬

‫در شکل ‪ 10-28‬بايد يکی از ستونهاي موجود را انتخاب کنید تا در خروجی اطالعات آن نمايش داده شود‪.‬‬

‫شکل ‪10-28‬‬

‫در شکل ‪ 10-29‬بعد از اينکه سه ستون اول را تکمیل کرديد‪ ،‬بايد چند ستون ديگر هم اضافه کنید‪ ،‬براي اين کار بر‬
‫روي ستون آخر کلیک راست کنید و از قسمت ‪ Insert Column‬گزينهي ‪ Right‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪383‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬

‫شکل ‪10-29‬‬

‫در شکل ‪ 10-30‬تمام ستونهاي مورد نظر به صفحه اضافه شده است‪ ،‬همانطور که گفتیم میتوانید بهدلخواه خود‬
‫صفحه را ويرايش و زيبا کنید‪.‬‬

‫شکل ‪10-30‬‬

‫با کلیک بر روي دکمه ترکیبی ‪ CTRL + S‬اين فرم گزارش را در جاي مناسب ذخیره کنید‪.‬‬

‫شکل ‪10-31‬‬

‫‪Run‬‬ ‫اگر بخواهید گزارش مورد نظر را در همین نرمافزار ‪ Report Builder‬اجرا کنید بايد بهمانند شکل ‪ 10-32‬بر روي‬
‫کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪384‬‬

‫شکل ‪10-32‬‬

‫همانطور که در شکل ‪ 10-33‬مشاهده میکنید نتیجه خروجی جدول مورد نظر است‪ ،‬پس شما توانستید يک فايل‬
‫گزارش از جدول ‪ SQL‬ايجاد کنی‪.‬‬

‫شکل ‪10-33‬‬

‫خوب اين يک مثال ساده از طراحی گزارش در ‪ Report Builder‬است که فقط با همان نرمافزار اجرا میشود‪ ،‬ولی اگر‬
‫بخواهیم بهصورت تحت وب آن را مشاهده کنیم چه کاري بايد انجام دهیم؟‬
‫را اجرا‬ ‫‪SQL Reporting‬‬ ‫براي اين کار بايد وارد آدرس زير شويد و سرويس تحت وب ‪ Report‬مربوط به سرويس‬
‫کنید‪.‬‬
‫‪http://center2/ReportS/browse/‬‬

‫بعد از بازکردن آدرس مورد نظر بايد بهمانند شکل ‪ 10-34‬بر روي ‪ Upload‬کلیک کنید و گزارشی را که در قسمت‬
‫قبل با نام ‪ Report1‬ذخیره کرديم را انتخاب و آپلود کنید‪.‬‬

‫شکل ‪10-34‬‬
‫‪www.takbook.com‬‬

‫‪385‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬


‫همانطور که در شکل ‪ 10-35‬مشاهده میکنید فايل ‪ Report1‬به صفحه اضافه شده است و با کلیک بر روي آن گزارش‬
‫مورد نظر باز خواهد شد‪.‬‬

‫شکل ‪10-35‬‬

‫همانطور که در شکل ‪ 10-36‬مشاهده میکنید گزارش مورد نظر تحت وب اجرا شده است‪ ،‬در اين صفحه گزينههاي‬
‫مختلفی وجود دارد‪ ،‬مثالً میتوانید از گزارش مورد نظر خروجیهاي مختلف تهیه کنید و يا اينکه آن را پرينت بگیريد‪.‬‬

‫شکل ‪10-36‬‬

‫گزارشهاي زيبا و متنوعی ايجاد کنید‪ ،‬مانند ايجاد چارتها و‬ ‫‪Report Builder‬‬ ‫شما میتوانید با استفاده از نرمافزار‬
‫نمودارهاي مختلف براي نمايش زيبا و دقیق اطالعات‪ ،‬براي اينکه کلی اين موضوع را بیان کنیم بايد بهمانند شکل‬
‫‪ 37-10‬بايد وارد ‪ Insert‬شويد و بر روي ‪ Chart‬کلیک کنید که دو گزينه را به شما نشان میدهد که اگر بخواهید سريع‬
‫يک نمودار از محصوالت خود ايجاد کنید میتوانید گزينهي ‪ Chart Wizard‬را انتخاب کنید و يا اگر بخواهید بهصورت‬
‫دستی انتخاب کنید میتوانید گزينهي ‪ Insert Chart‬را انتخاب کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪386‬‬

‫شکل ‪10-37‬‬

‫را به اتمام برسانیم و به سراغ نرمافزار قدرتمند ديگري از‬ ‫‪Report Builder‬‬ ‫خوب بهتر است تا به اينجا‪ ،‬کار با‬
‫که به جرات میتوان گفت که يکی از قدرتمندترين‬ ‫‪Power BI‬‬ ‫مايکروسافت برويم و آن هم کسی نیست جزء‬
‫نرمافزارهاي موجود در بازار است‪.‬‬
‫نصب و راهاندازي ‪Power BI‬‬
‫بعد از معرفی توسط مايکروسافت تبديل يک ابزار محبوب در هوش تجاري شده است و کاربران زيادي‬ ‫‪Power BI‬‬

‫به علت زيبايی‪ ،‬سهولت و کیفیت از اين نرمافزار استفاده میکنند‪ ،‬براي استفاده از اين نرافزار بايد اليسنس آن را‬
‫تعريف کنید‪ ،‬البته اليسنس رايگان آن در اينترنت وجود دارد اما بعضی از دوستان همین اليسنس رايگان را به قیمت‬
‫گزاف به مشتري میفروشند‪.‬‬

‫شکل ‪10-38‬‬

‫‪Power BI,‬‬ ‫مايکروسافت براي گزارشگیري پیشرفته سه ابزار را در گروه ‪ Power Platform‬قرار داده است که شامل‬
‫‪ Power APPs, Microsoft Flow‬است و هرکدام براي يک کار خاص طراحی شدهاند‪.‬‬
‫براي نصب و راهاندازي اين برنامه در ويندوز نیاز به دو نسخهي آن داريم‪:‬‬
‫که از اسم آن مشخص است که مربوط به نسخه سرور میباشد و بايد بر روي سرور‬ ‫‪Power BI Reporting Server‬‬

‫‪ SQL‬شما نصب شود‪ ،‬توجه داشته باشید که اين نسخه نیاز به اليسنس دارد که بايد تهیه کنید‪.‬‬
‫‪ Power BI Desktop‬که يک نسخهي رايگان است که براي متصل شدن به نسخهي سرور بايد آن را بر روي کالينت‬
‫خود نصب کنید‪ ،‬البته نسخهي موبايل آن هم وجود دارد که در صورت نیاز از آن هم استفاده میکنیم‪.‬‬
‫براي شروع کار بايد نسخهي سرور را بر روي سرور ‪ SQL‬نصب و تنظیمات آن را انجام دهیم‪ ،‬از طريق لینک زير‬
‫میتوانید نسخهي سرور به همراه نسخهي دسکتاپ را دانلود کنید‪.‬‬
‫‪https://www.microsoft.com/en-us/download/details.aspx?id=57270‬‬
‫‪www.takbook.com‬‬

‫‪387‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬


‫‪Install‬‬ ‫بعد از دانلود فايلهاي مورد نظر‪ ،‬نسخهي سرور آن را در سرور ‪ SQL‬اجرا کنید‪ ،‬بهمانند شکل ‪ 10-39‬بر روي‬
‫‪ Power BI Report Server‬کلیک کنید‪.‬‬

‫شکل ‪10-39‬‬

‫در شکل ‪ 10-40‬بايد اليسنس مورد نظر را وارد و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪10-40‬‬

‫در شکل ‪ 10-41‬بايد بر روي ‪ Install‬کلیک کنید تا کار نصب آغاز شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪388‬‬

‫شکل ‪10-41‬‬

‫بعد از نصب نرمافزار بايد بهمانند شکل ‪ 10-42‬بر روي ‪ Configure Report Server‬کلیک کنید تا سرويس مورد نظر‬
‫اجرا شود‪.‬‬

‫شکل ‪10-42‬‬

‫در شکل ‪ 10-43‬در قسمت ‪ Server name‬نام سرور خود را وارد و در قسمت ‪ Instance‬بايد ‪ PBIRS‬را انتخاب کنید‬
‫که بعد از نصب نرمافزار ‪ Power BI‬ايجاد شده است و بايد تنظیمات را بر روي آن انجام دهیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪389‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬

‫شکل ‪10-43‬‬

‫در شکل ‪ 10-44‬بايد نام کاربري مورد نظر را براي دسترسی به سرويس ‪ Power BI‬وارد و بر روي ‪ APPLY‬کلیک‬
‫کنید تا تغییرات مورد نظر اعمال شود‪.‬‬

‫شکل ‪10-44‬‬

‫‪Reporting‬‬ ‫در شکل ‪ 10-45‬بايد يک نام جديد در قسمت ‪ Virtual Directory‬وارد کنید تا با نام قبلی که در سرويس‬
‫تنظیم کرديم برخورد نداشته باشد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪390‬‬

‫شکل ‪10-46‬‬

‫‪Change‬‬ ‫در شکل ‪ 10-47‬بايد يک ديتابیس جديد براي سرويس ‪ Power BI‬ايجاد کنید براي انجام اين کار بر روي‬
‫‪ Database‬کلیک کنید‪.‬‬

‫شکل ‪10-47‬‬

‫در شکل ‪ 10-48‬بايد نام ديتابیس را وارد کنید‪ ،‬اگر نام را تغییر ندهید‪ ،‬اين ديتابیس با ديتابیس قبلی که براي‬
‫‪ ReportService‬ايجاد کرديم برخورد میکند و با مشکالتی روبرو میشود که بهتر است نام آن را تغییر دهیم‪ ،‬بر روي‬
‫‪ Next‬کلیک کنید تا ديتابیس مورد نظر ايجاد شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪391‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬

‫شکل ‪10-48‬‬

‫‪APPLY‬‬ ‫در شکل ‪ 10-49‬بايد يک نام جديد ايجاد کنید تا با نام قبلی مشکلی پیش نیايد‪ ،‬بعد از واردکردن نام بر روي‬
‫کلیک کنید تا تنظیمات جديد اعمال شود و در آخر بر روي ‪ Exit‬کلیک کنید تا پنجره بسته شود‪.‬‬

‫شکل ‪10-49‬‬

‫در ادامه براي اينکه سرويس ‪ POWER BI‬را تحت وب مشاهده کنید بايد از آدرس زير استفاده کنید‪.‬‬

‫‪http://sqlserver/reportsBI/browse/‬‬

‫در آدرس باال بايد بهجاي ‪ sqlserver‬بايد نام و يا ‪ IP‬سرور را وارد کنید‪ ،‬همانطور که در شکل ‪ 10-50‬مشاهده میکنید‬
‫صفحهي ‪ Reporting Power BI‬اجرا شده است و میتوانیم عملیات خود را بر روي آن آغاز کنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪392‬‬

‫شکل ‪10-50‬‬

‫در شکل ‪ 10-51‬با کلید بر روي آيکون مورد نظر میتوانید نرمافزارهايی که قرار است با اين سرور کار کنند را مشاهده‬
‫میکنید‪ ،‬براي اينکه بتوانیم بر روي ‪ Desktop‬کار کنیم نسخهي ‪ Power BI Desktop‬را راهاندازي میکنیم‪.‬‬

‫شکل ‪10-51‬‬

‫همانطور که در شکل ‪ 10-52‬مشاهده میکنید‪ ،‬نرمافزار ‪ Power BI Desktop‬اجرا شده و کارهاي مرود نظر خود را‬
‫میتوانید بر روي آن انجام دهید‪.‬‬

‫شکل ‪10-52‬‬
‫‪www.takbook.com‬‬

‫‪393‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬


‫متصل شويم و اطالعات موجود در جداول را بارگذاري کنیم بايد از‬ ‫‪SQL‬‬ ‫براي شروع کار و براي اينکه به ديتابیس‬
‫تب ‪ Home‬بر روي ‪ Get Data‬کلیک کنید و گزينهي ‪ SQL Server‬را انتخاب کنید‪.‬‬

‫شکل ‪10-53‬‬

‫در شکل ‪ 10-54‬بايد نام سرور ‪ SQL‬را به همراه نام ديتابیس آن وارد و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪10-54‬‬

‫بهمانند شکل ‪ 10-55‬بايد جدول مورد نظر خود را که در ديتابیس وجود دارد انتخاب کنید و بعد بر روي ‪ Load‬کلیک‬
‫کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪394‬‬

‫شکل ‪10-55‬‬

‫ستونهاي مورد نظر خود را کشیده و در‬ ‫‪Product‬‬ ‫بعد از اضافهکردن جدول مورد نظر‪ ،‬حاال میتوانید از قسمت‬
‫‪ Reports‬رها کنید‪ ،‬همانطور که در شکل ‪ 10-56‬مشاهده میکنید بهمحض رهاکردن فیلد مورد نظر اطالعات آن در‬
‫صفحه بهصورت آنالين نمايش داده خواهد شد‪ ،‬مثالً اگر شهر را در صفحه قرار دهید نقشه و موقعیت آن شهر‬
‫مشخص خواهد شد که اين يک قابلیت جالب خواهد بود‪.‬‬

‫شکل ‪10-56‬‬
‫‪www.takbook.com‬‬

‫‪395‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬


‫خوب اگر بخواهیم اين فرم ساده را در ‪ Reporting Service Power BI‬و تحت وب نمايش دهیم میتوانیم بهصورت‬
‫شکل ‪ 10-57‬از منوي ‪ File‬و از قسمت ‪ Save as‬گزينهي مورد نظر خود را انتخاب کنید‪ ،‬اگر بخواهید گزارش خود‬
‫را اول در سیستم خود ذخیره و بعد آن را در ‪ Reporting Service‬تحت وب آپلود کنید میتوانید گزينهي اول را انتخاب‬
‫‪Power BI Report Server‬‬ ‫کنید و يا اگر بخواهید بهصورت مستقیم آن را در سرور ‪ Reporting‬آپلود کنید بايد بر روي‬
‫کلیک کنید‪.‬‬

‫شکل ‪10-57‬‬

‫در شکل ‪ 10-58‬بايد آدرس سرور ‪ Reporting‬را که در قسمتهاي قبلی و در شکل ‪ 10-49‬وارد کرديدم را در اين‬
‫قسمت وارد و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪10-58‬‬

‫در شکل ‪ 10-59‬بايد نام گزارش خود را وارد و بر روي ‪ OK‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪396‬‬

‫شکل ‪10-59‬‬

‫در ادامه کار وارد آدرس زير شويد‪:‬‬


‫‪http://sqlserver/reportsBI/browse/‬‬

‫همانطور که در شکل ‪ 10-60‬مشاهده میکنید گزارش مورد نظر بهدرستی ايجاد و بر روي تست آن بر روي آن کلیک‬
‫کنید‪.‬‬

‫شکل ‪10-60‬‬

‫همانطور که در شکل ‪ 10-61‬مشاهده میکنید گزارش مورد نظر بهدرستی اجرا شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪397‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬

‫شکل ‪10-61‬‬

‫دو جدول بهمانند‬ ‫‪SQL‬‬ ‫آشنا شويد میخواهیم در‬ ‫‪Power BI‬‬ ‫خوب براي اينکه بهتر با نحوهي گزارشگیري توسط‬
‫جداول يک و دو ايجاد کنیم و از طريق ‪ Power BI‬از آنها خروجی تهیه کنیم‪.‬‬

‫جدول یک‪CLASS -‬‬

‫جدول دو ‪Students -‬‬

‫در دو جدول باال يک سري درس به همراه يک سري دانش آموزش تعريف شده است که قرار است اطالعات خروجی‬
‫آنها را به هم متصل کنیم‪ ،‬همانطور که در جدول زير مشاهده میکنید اطالعات دانشآموزان به همراه کالس درس‬
‫آنها وارد شده است و حاال میخواهیم از طريق نرمافزار ‪ Power BI‬از آنها خروجی تهیه کنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪398‬‬

‫طبق مراحل قبلی نرمافزار ‪ Power BI‬را بازکرده و دو جدول جديد را بهمانند شکل ‪ 10-62‬به لیست اضافه کنید‪.‬‬

‫شکل ‪10-62‬‬

‫بهمانند شکل ‪ 10-63‬وارد تب ‪ Home‬شويد و بر روي ‪ Manage Relationships‬کلیک کنید‪.‬‬

‫شکل ‪10-63‬‬

‫در شکل ‪ 10-64‬بايد يک ارتباط بین دو جدول مورد نظر ايجاد کنید که در اين دو جدول ‪ Class ID‬توانايی ارتباط‬
‫درست با هم را دارند‪ ،‬براي همین موضوع بر روي ‪ New‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪399‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬

‫شکل ‪10-64‬‬

‫در شکل ‪ 10-65‬و در قسمت اول بايد جدولی که قرار است در خروجی نمايش داده شود را انتخاب کنید که بعد از‬
‫انتخاب ستون ‪ Class ID‬که در هر دو جدول يکی است بهعنوان پل ارتباطی اين دو جدول بهصورت اتوماتیک انتخاب‬
‫میشود‪.‬‬

‫شکل ‪10-65‬‬

‫در شکل ‪ 10-66‬میتوانید از قسمت ‪ Visualization‬يک جدول را انتخاب کنید و بعد از انتخاب بايد تیک گزينههايی‬
‫که قرار است در خروجی چاپ شوند را مشخص کنید که نتیجه ان را مشاهده میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪400‬‬

‫شکل ‪10-66‬‬

‫اگر چنانچه بخواهید کمی کار را زيباتر کنید میتوانید بهمانند شکل ‪ 10-67‬ابزار فیلتر قرار دهید تا کاربر با انتخاب‬
‫هر کالس بتواند لیست دانشجويان آن را مشاهده کند‪.‬‬

‫شکل ‪10-67‬‬

‫‪Model‬‬ ‫براي اينکه ارتباط بین دو جدول را بهصورت بهتر مشاهده کنید میتوانید بهمانند شکل ‪ 10-68‬وارد قسمت‬
‫شويد و در صفحهي باز شده اگر نشانگر ماوس را بر روي فلش مورد نظر قرار دهید با رنگ مشخص شده ارتباط‬
‫بین ستونها در هر دو جدول را مشاهده خواهید کرد‪.‬‬

‫شکل ‪10-68‬‬
‫‪www.takbook.com‬‬

‫‪401‬‬ ‫‪SQL Reporting Service‬‬ ‫فصل‪/7‬‬


‫شما میتوانید ديتابیسهاي ديگر مانند ‪ Oracle, Excel‬و ‪ ...‬را هم وارد ‪ Power BI Desktop‬کنید و از آنها يک خروجی‬
‫مفید تهیه کنید‪ ،‬براي انجام اين کار بهمانند شکل ‪ 10-69‬میتوانید گزينهي ‪ Excel‬را انتخاب کنید‪.‬‬

‫شکل ‪10-69‬‬

‫همانطور که در شکل ‪ 10-70‬مشاهده میکنید فايل ‪ Excel‬مورد نظر انتخاب شده و شما میتوانید هر کدام از‬
‫‪Sheet‬هاي ان را انتخاب کنید‪.‬‬

‫شکل ‪10-70‬‬
www.takbook.com
‫‪www.takbook.com‬‬

‫فصل هشتم‬
‫‪SQL Failover Clustring‬‬
‫زمانی که صحبت از ‪ SQL Server‬است‪ ،‬يعنی اينکه دسترسی به دادههاي آن در يک لحظه هم نبايد با اختالل روبرو‬
‫شود و براي حل اين مشکل بايد يک راهکار پیادهسازي کرد تا سرويسهاي ‪ SQL‬جتی براي ثانیهاي از کار نیفتن‪ ،‬براي‬
‫را معرفی کرد که در اين سرويس چند سرور‬ ‫‪Failover Clustering‬‬ ‫حل اين مشکل مايکروسافت سرويسی با نام‬
‫در گروهی قرار دارند و چنانچه براي يکی از سرورها مشکلی ايجاد شود سرورهايی ديگري که در‬ ‫‪Node‬‬ ‫بهعنوان‬
‫آن گروه قرار دارند جايگزين آن میشوند‪.‬‬
‫براي انجام اين کار نیاز به چند سرور بهمانند شکل ‪ 11-1‬داريم‪ ،‬در اين سناريو نیاز به يک سرور ‪،Active Directory‬‬
‫که بايد نقس‬ ‫‪FAILOVER‬‬ ‫و دسترسی از طريق شبکه‪ ،‬و دو سرور‬ ‫‪ISCSI‬‬ ‫براي ايجاد ديسک‬ ‫‪ISCSI‬‬ ‫يکی سرور‬
‫‪ FAILOVER‬را بازي کنند که البته اين چند سرور اط ريق سوئیچ به هم متصل میشوند و دو سرور ‪ FAILOVER‬بايد‬
‫يک کارت شبکهي ديگر هم داشته باشند‪.‬‬
‫‪172.16.1.1‬‬

‫‪FAILOVER-1‬‬

‫‪192.168.5.15‬‬
‫‪Active‬‬
‫‪Directory‬‬
‫‪192.168.5.2‬‬

‫‪FAILOVER-2‬‬
‫‪SWITCH‬‬
‫‪192.168.5.16‬‬

‫‪ISCSI Disk‬‬
‫‪172.16.1.2‬‬
‫‪192.168.5.20‬‬

‫شکل ‪11-1‬‬

‫تنظیمات سرور ‪iSCSI‬‬

‫را آماده کنیم‪ ،‬براي ايجاد اين سرور شما میتوانید از نرمافزارهاي رايگان مانند‬ ‫‪ISCSI‬‬ ‫براي شروع کار بايد سرور‬
‫را ايجاد کنید‪ ،‬ولی در اين آموزش ما از يک‬ ‫‪ISCSI‬‬ ‫‪ FreeNAS‬و‪ ...‬استفاده کنید و ديسکهاي تحت شبکه با پروتکل‬
‫ويندوز سرور ‪ 2019‬استفاده میکنیم‪.‬‬
‫براي شروع کار و ايجاد سرور‪ ،‬پیشنهاد میشود که از سرورهاي مجازي براي اين کار استفاده کنید‪ ،‬تا نحوه ايجاد و‬
‫مديريت آن آسان باشد‪ ،‬براي همین ما از يک سرور ‪ ESXi‬استفاده کرديم و يک ماشین مجازي بهمانند شکل ‪11-2‬‬
‫‪Failover Clustring‬‬ ‫يک ماشین مجازي با نام ‪ ISCSI-Server‬ايجاد کرديم و به آن چهار هارد اضافه کرديم‪ ،‬براي کار‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪404‬‬


‫نیاز به چهار هارد ديسک از نوع ‪ ISCSI‬داريم تا بتوانیم از آن در اين سناريو و اين سرويس استفاده کنیم‪ ،‬بعد از ايجاد‬
‫ماشین مورد نظر بر روي آن ويندوز سرور ‪ 2019‬نصب میکنیم‪.‬‬

‫شکل ‪11-2‬‬

‫بعد از اجرا شدن ويندوز مورد نظر اولین کاري که انجام میدهید اين است که آدرس ‪ IP‬را بهصورت دستی وارد کنید‬
‫و در قسمت نام سرور هم يک نام براي آن وارد و آن را عضو دومین کنید‪.‬‬
‫بهمانند شکل ‪ IP 11-3‬سرور مورد نظر را وارد و بر روي ‪ OK‬کلیک کنید‪ ،‬البته میتوانستید از سرويس ‪ DHCP‬هم‬
‫براي اين کار استفاده کنید‪.‬‬

‫شکل ‪11-3‬‬

‫در شکل ‪ 11-4‬بايد نام سرور را وارد و آن را عضو دومین کنید‪.‬‬


‫‪www.takbook.com‬‬

‫‪405‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-4‬‬

‫بعد از اينکه مراحل باال را انجام داديد بايد سرويس ‪ ISCSI‬را بر روي سرور نصب کنیم‪ ،‬براي اين کار بهمانند شکل‬
‫‪ 5-11‬وارد ‪ Server Manager‬شويد و بر ري ‪ Add Roles and features‬کلیک کنید‪.‬‬

‫شکل ‪11-5‬‬

‫‪ISCSI‬‬ ‫تیک گزينهي‬ ‫‪File and ISCSI Services‬‬ ‫شويد و از زير مجموعهي‬ ‫‪Server Roles‬‬ ‫بهمانند شکل ‪ 11-6‬وارد‬
‫‪ Target Server‬را انتخاب و بر روي ‪ Next‬کلیک کنید و در ادامه بر روي ‪ Install‬کلیک کنید‪ ،‬فقط توجه داشته باشید‬
‫در قسمت آخر تیک گزينهي ‪ Restart‬را انتخاب کنید تا سرويس بعد از نصب ‪ Restart‬شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪406‬‬

‫شکل ‪11-6‬‬

‫‪To Create an iSCSI virtual‬‬ ‫بهمانند شکل ‪ 11-7‬در قسمت ‪ File and Storage Services‬وارد ‪ iSCSI‬شويد و بر روي‬
‫‪ disk‬کلیک کنید‪.‬‬

‫شکل ‪11-7‬‬

‫در شکل ‪ 11-8‬تمام هارد ديسکهاي مجازي که به ماشین مورد نظر اضافه کرديم را مشاهده میکنید که در ادامه بايد‬
‫آن را براي سرروهاي مورد نظر به اشتراک بگذاريم‪ ،‬يکی از هاردها را از لیست انتخاب کنید تا يیبر روي ‪ Next‬کلیک‬
‫کنید‪،‬؛ توجه داشته باشید که براي هر هارد بايد اين کار را انجام دهید‪.‬‬
‫‪www.takbook.com‬‬

‫‪407‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-8‬‬

‫در شکل ‪ 11-9‬بايد يک نام براي ديسک مجازي خود انتخاب کنید که در زير صفحه مسیر ذخیره شدن اين ديسک‬
‫مشخص شده است‪.‬‬

‫شکل ‪11-9‬‬

‫در شکل ‪ 11-10‬بايد حجم مورد نظر براي ايجاد ديسک مجازي را مشخص کنید‪ ،‬که در اينجا ‪ 49‬گیگ وارد شده‬
‫است که البته بستگی به نوع کار و حجم اطالعات شما دارد‪ ،‬توجه داشته باشید اگر گزينهي ‪ Fixed‬را انتخاب کند کل‬
‫فضا به اين هارد مجازي اختصاص داده خواهد شد ولی اگر گزينهي ‪ Dynamically‬را انتخاب کنید به مرور زمان اين‬
‫حجم پر خواهد شد که پیشنهاد خود مايکروسافت گزينه اول است‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪408‬‬

‫شکل ‪11-10‬‬

‫در شکل ‪ 11-11‬گزينهي ‪ New iSCSI target‬را انتخاب کنید و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪11-11‬‬

‫در شکل ‪ 11-12‬بايد يک نام براي ‪ target‬خود به دلخواه وارد و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪11-12‬‬

‫در شکل ‪ 11-13‬گزينهي ‪ Enter a value for selected type‬را انتخاب کنید و يک نام وارد کنید‪ ،‬توجه داشته باشید که‬
‫اين نام مهم بوده و در ادامه براي ارتباط با هارد ديسک مجازي از آن استفاده خواهد شد‪.‬‬
‫‪www.takbook.com‬‬

‫‪409‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-13‬‬

‫در شکل ‪ 11-14‬می توانید ارتباط خود را رمزگذاري کنید‪ ،‬تا کسی نتواند به هارد ديسک مجازي مورد نظر دست‬
‫پیدا کنید‪ ،‬در حال حاضر نیازي به اين کار نیست و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪11-14‬‬

‫در شکل ‪ 11-15‬بر روي ‪ Create‬کلیک کنید تا ‪ target‬مورد نظر به همراه هارد ديسک مجازي ايجاد شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪410‬‬

‫همانطور که در شکل ‪ 11-16‬مشاهده میکنید‪ ،‬هارد ديسک مجازي مورد نظر داخل درايو ‪ C‬با حجم ‪ 49‬گیگابايت‬
‫ايجاد شده است و در ادامه بايد ‪ 3‬هاردديسک ديگر را هم به لیست اضافه کنید که براي اينکه به طور کامل متوجه‬
‫‪New iSCSI Virtual‬‬ ‫شويد يکی از آنها را ايجاد میکنیم‪ ،‬بر روي صفحهي مورد نظر کلیک راست کنید و گزينهي‬
‫‪ Disk‬را انتخاب کنید‪.‬‬

‫شکل ‪11-16‬‬

‫را براي ايجاد هارد مجازي انتخاب کرده بوديم‪ ،‬حاال بايد درايو بعدي يعنی ‪ E‬را‬ ‫‪C‬‬ ‫در شکل ‪ 11-17‬که قبالً درايو‬
‫انتخاب و بر روي ‪ Next‬کلیک کنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪411‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-17‬‬

‫در شکل ‪ 11-18‬بايد نام ديسک را وارد کنید و در پايین صفحه محل ذخیره شدن آن را در درايو ‪ E‬مشاهده میکنید‪.‬‬

‫شکل ‪11-18‬‬

‫در شکل ‪ 11-19‬بايد حجم مورد نظر خود را وارد کنید که در ينجا ‪ 49‬گیگیابايت را وارد و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪11-19‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪412‬‬


‫در شکل ‪ 11-20‬بايد در قسمت ‪ Existing‬همان ‪ target‬که در قسمت اول ايجاد کرديم را انتخاب کنید‪ ،‬با اين کار اين‬
‫ديسک هم زير مجموعهي آن ‪ target‬خواهد شد‪.‬‬

‫شکل ‪11-20‬‬

‫در شکل ‪ 11-21‬هم بايد بر روي ‪ Create‬کلیک کنید تا هارد ديسک مورد نظر ايجاد شود‪ ،‬توجه داشته باشید که دقیقاً‬
‫همین مراحل را براي دو ديسک ديگر هم انجام دهید تا جمعاً ‪ 4‬ديسک به لیست اضافه شود‪.‬‬

‫شکل ‪11-21‬‬

‫همانطور که در شکل ‪ 11-22‬مشاهده میکنید هر چهار ديسک مورد نظر ايجاد شده است و حاال میتوانیم به آنها‬
‫متصل شويم‪.‬‬

‫شکل ‪11-22‬‬

‫تنظیمات سرور ‪Failover-1‬‬


‫شويم و اين چهار هارد را به آنها اضافه کنیم‪ ،‬بهمانند شکل ‪ 11-23‬وارد‬ ‫‪Failover‬‬ ‫در ادامه کار بايد وارد دو سرور‬
‫کنترل پنل هر کدام از سرورها شويد و بر روي ‪ Administrative Tools‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪413‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-23‬‬

‫براي متصل شدن به ديسکهاي ‪ iSCSI‬ابزاري وجود دارد با نام ‪ iSCSI Initiator‬که در تمام ويندوزهاي سرور‬
‫موجود است و حتی می توانید آن را از اينترنت دانلود کنید و بر روي ويندوز مورد نظر خود نص کنید‪ ،‬مانند شکل‬
‫‪ 24-11‬بر روي ‪ iSCSI Initiator‬دو بار کلیک کنید‪.‬‬

‫شکل‪11-24‬‬

‫در شکل ‪ 11—25‬و در تب ‪ Configuration‬بايد نام ‪ Initiator Name‬را که با نام ‪ target—server‬ايجاد کرديم را وارد‬
‫کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪414‬‬

‫شکل ‪11-25‬‬

‫در شکل ‪ 11—26‬و در تب ‪ Targets‬بايد آدرس ‪ IP‬سرور ‪iSCSI‬را وارد و بر روي ‪ Connect‬کلیک کنید‪ ،‬با اين کار‬
‫شما توانستید هارد ديسک مورد نظر را به لیست پارتیشنهاي خود اضافه کنید که با هم انها را امادهسازي میکنیم‪.‬‬

‫شکل ‪11-26‬‬

‫براي اينکه در سرور ‪ Failover-01‬که عملیات باال را در آن انجام داديم بتوانیم هاردديسکهاي ‪ iSCSI‬را مشاهده‬
‫کنیم بايد بهمانند شکل ‪ 11-27‬در ‪ RUN‬دستور ‪ diskmgmt.msc‬را اجرا کنید تا سرويس ‪ Disk Management‬اجرا‬
‫شود‪.‬‬

‫شکل ‪11-27‬‬
‫‪www.takbook.com‬‬

‫‪415‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬


‫همانطور که در شکل ‪ 11-28‬مشاهده میکنید هر چهار هارد به لیست اضافه شده است و بايد تنظیمات آنها را‬
‫انجام دهیم‪.‬‬

‫شکل ‪11-28‬‬ ‫براي اينکه اين‬


‫هارد ديسکها را تنظیم کنیم بايد بهمانند شکل ‪ 11-29‬بر روي ديسک مورد نظر کلیک راست کنید و گزينهي اول‬
‫يعنی ‪ Online‬و بعد ‪ Initialize Disk‬را انتخاب کنید‪.‬‬

‫شکل ‪11-29‬‬

‫براي هارد‬ ‫‪GPT‬‬ ‫که براي هارد ديسکهايی با حداکثر ظرفیت ‪ 2‬ترابايت است و‬ ‫‪MBR‬‬ ‫در شکل ‪ 11-30‬میتوانید‬
‫ديسکهايی بیشتر از ‪ 2‬ترابايت‪ ،‬پس گزينهي ‪ MBR‬را انتخاب و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪11-30‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪416‬‬


‫خوب کمی کارهايی که تا اين مرحله انجام داديم را بررسی کنیم‪ ،‬يک سرور ‪ iSCSI‬ايجاد کرديم و روي آن چند هارد‬
‫متصل کرديم و با سرويس ‪ iSCSI‬چهار هارد مجازي که براي ادامه کار طراحی شده است را ايجاد کرديم و در ادامه‬
‫متصل شويم و بعد در‬ ‫‪iSCSI‬‬ ‫به هاردهاي‬ ‫‪iSCSI Initiator‬‬ ‫توانستیم از طريق سرويس‬ ‫‪Failover-1‬‬ ‫از طريق سرور‬
‫سرويس ‪ Diskmgmt.msc‬هاردهاي اضافه شده را اول ‪ Online‬و بعد ‪ Initialize‬کرديم و ديگر نبايد کار انجام دهیم‪.‬‬
‫حاال بايد وارد سرور ‪ Failover-2‬شويم و هاردهاي ‪ iSCSI‬را به آن هم اضافه کنیم‪.‬‬
‫تنظیمات سرور ‪Failover-2‬‬

‫شما در اين سرور هم بايد آن چهار هارد ‪ iSCSI‬را به لیست اضافه کنید‪ ،‬اما يک مشکل اساسی وجود دارد و ان هم‬
‫متصل کنید‪ ،‬براي اين کار‬ ‫‪iSCSI‬‬ ‫اين است که شما نمیتوانید بیشتر از يک سرور را بهصورت پیشفرض به سرور‬
‫بايد يک سرويس ديگر را بر روي سرور ‪ iSCSI‬نصب کنید و آن هم سرويس ‪ Multipath I/O‬است که بهمانند شکل‬
‫‪ 31-11‬بايد وارد ‪ Server Manager‬در سرور ‪ iSCSI‬شويد و از قسمت ‪ Features‬تیک گزينهي ‪ Multipath I/O‬را انتخاب‬
‫و بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪11-31‬‬

‫در شکل ‪ 11-32‬حتماً تیک گزينهي …‪ Restart the destination‬را انتخاب و بر روي ‪ Install‬کلیک کنید‪.‬‬

‫شکل ‪11-32‬‬
‫‪www.takbook.com‬‬

‫‪417‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬


‫حتماً بايد نصب کنید و بهصورت زير‬ ‫‪iSCSI, Failover-1, Failover-2‬‬ ‫نکته مهم‪ :‬اين سرويس را در هر سه سرور‬
‫تنظیمات آن را انجام دهید‪.‬‬
‫را اجرا کنید‪ ،‬بعد از اجرا بهمانند شکل‬ ‫‪MPIO‬‬ ‫شويد و سرويس‬ ‫‪Administrative Tools‬‬ ‫بعد از نصب سرويس وارد‬
‫را انتخاب کنید و بر روي ‪ Add‬کلیک‬ ‫‪Add support‬‬ ‫شويد و تیک گزينهي‬ ‫‪Discover Multi-Paths‬‬ ‫‪ 33-11‬وارد تب‬
‫کنید‪.‬‬

‫شکل ‪11-33‬‬

‫بهمانند شکل ‪ 11-34‬وارد تب ‪ MPIO Devices‬شويد و بايد در لیست مورد نظر ‪ Device‬مورد نظر را حتماً مشاهده‬
‫کنید تا عملیات موفقیتآمیز باشد‪.‬‬

‫شکل ‪11-34‬‬

‫بعد از انجام مراحل باال بايد وارد سرور ‪ Failover-2‬شويد و بهمانند شکل ‪ iSCSI Initiator 11-35‬را اجرا کنید و دقیقاً‬
‫همان کاري که در سرور اول يعنی ‪ Failover-1‬انجام داديد در اين قسمت هم انجام دهید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪418‬‬

‫شکل ‪11-35‬‬

‫شکل ‪11-36‬‬

‫شکل ‪11-37‬‬

‫در ادامه هارد ديسک مورد نظر به لیست اضافه و کارهايی را که در سرور ‪ Failover-1‬انجام داديم در اين سرور هم‬
‫بايد انجام دهیم‪.‬‬
‫بعد از اينکه هارد ديسکهاي مجازي را در هر سرور ايجاد کرديم بايد سرويسهاي ديگري را هم فعال کنیم‪ ،‬سرويس‬
‫بوده که تا ويندوز سرور ‪ 2012‬وجود داشته ولی در‬ ‫‪Application Server‬‬ ‫ديگري که از گذشته وجود داشته با نام‬
‫ويندوز سرور ‪ 2016‬و ‪ 2019‬اين گزينه وجود ندارد ولی سرويسهاي آن بهصورت پیشفرض بر روي ويندوز فعال‬
‫است و مشکلی از اين لحاظ نخواهید داشت‪.‬‬
‫‪www.takbook.com‬‬

‫‪419‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬


‫در ادامه بايد سرويس ‪ Clustring‬را بر روي هر دو سرور ‪ Failover-1‬و ‪ Failover-2‬نصب کنید‪ ،‬به اين صوتر که مانند‬
‫شکل ‪ 11-38‬وارد ‪ Server Manager‬شويد و تیک گزينهي ‪ Failover Clustring‬را از قسمت ‪ Features‬انتخاب و نصب‬
‫کنید‪.‬‬

‫شکل ‪11-38‬‬

‫‪Restart‬‬ ‫نصب اين سرويس کمی زمان بر خواهد بود‪ ،‬توجه داشته باشید که بعد از نصب سرويس حتماً سرور بايد‬
‫شود‪.‬‬
‫در ادامه بايد کنسول مديريتی سرويس ‪ Clustring‬رات در هر دو سرور اجرا کنید و کارهاي زير را در هر دو سرور‬
‫انجام دهید‪.‬‬
‫بهمانند شکل ‪ 11-39‬وارد ‪ Server Manager‬شويید و از منوي ‪ Tools‬سرويس ‪ Clustring‬را اجرا کنید‪.‬‬

‫شکل ‪11-39‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪420‬‬


‫اولین کاري که در اين سرويس بايد انجام دهیم اين است که تست میگیريم ببینیم ارتباط و تنظیمات انجام شده در‬
‫هر دو سرور که قرار است کالستر شوند به درستی انجام شده است يا نه‪ ،‬براي اين کار بهمانند شکل ‪ 11-40‬بر روي‬
‫‪ Validate Configuartion‬کلیک کنید‪.‬‬

‫شکل ‪11-40‬‬

‫در شکل ‪ 11-41‬بايد نام سرور مورد نظر خود را وارد و بر روي ‪ Add‬کلیک کنید‪ ،‬توجه داشته باشید بايد نام هر دو‬
‫سرور را به لیست اضافه کنید‪.‬‬

‫شکل ‪11-41‬‬

‫در شکل ‪ 11-42‬بايد گزينهي ‪ Run all tests‬را انتخاب کنید تا قبل از اينکه موضوع را عملیاتی کنیم مراحل کار تست‬
‫شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪421‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-42‬‬

‫در ادامه کار و در شکل ‪ 11-43‬بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪11-43‬‬

‫همانطور که در شکل ‪ 11-44‬مشاهده می کنید عملیات با موفقیت انجام شده است‪ ،‬اما شايد براي شما با خطاهاي‬
‫مختلفی تمالم شده باشد که حتماً بايد آن خطا ها را بررسی کنیم‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪422‬‬

‫شکل ‪11-44‬‬

‫خطاهايی که معمو ًال در اين قسمت روي میدهد شامل موارد زير است‪:‬‬
‫‪ -1‬کارت شبکهي دوم تعريف نشده باشد‪.‬‬
‫‪ -2‬سیستم تحت دامین نباشد‪.‬‬
‫‪ -3‬هارد ديسک به درستی در هر دو سرور ايجاد نشده باشد‪ ،‬که اين خطا يکی از متداولترين خطاها است‪.‬‬
‫‪ -4‬سرويس ‪ MPIO‬در هر سه سرور فعال نباشد‪.‬‬

‫اگر همهي مواردهاي باال را به درستی انجام دهید ديگر با خطا مواجه نخواهید شد‪.‬‬
‫در ادامه کار و بعد از تست موفقیت آمیز کار بايد ‪ Cluster‬اصلی خود را ايجاد کنیم براي اين کار بهمانند شکل ‪-45‬‬
‫‪Create Cluster‬‬ ‫‪ 11‬بر روي‬

‫شکل ‪11-45‬‬

‫در شکل ‪ 11-46‬هر دو سرور ‪ failover‬را وارد و بر روي ‪ Next‬کلیک کنید‪.‬‬


‫‪www.takbook.com‬‬

‫‪423‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-46‬‬

‫بايد انتخاب شود‪ ،‬و زمانی که شبکهي‬ ‫‪Cluster‬‬ ‫در شکل ‪ 11-47‬بايد مشخص کنید که کدام شبکه بهعنوان شبکهي‬
‫را انتخاب میکنید بايد براي آن يک آدرس ‪IP‬مشخص در نظر بگیريد‪ ،‬که در اينجا شبکهي اصلی يعنی‬ ‫‪Cluster‬‬

‫در نظر گرفاه خواهد شد و بعد از اتمام‬ ‫‪Cluster‬‬ ‫بهعنوان شبکهي‬ ‫‪192.168.5.21‬‬ ‫انتخاب شده و آدرس‬ ‫‪192.168.5‬‬

‫کانفیگ اگر همه چیز به درستی پیش برود شما میتوانید اين ‪ IP‬را ‪ Ping‬کنید و از آن استفاده کنید‪.‬‬

‫شکل ‪11-47‬‬

‫بهمانند شکل ‪ 11-48‬بر روي ‪ Next‬کلیک کنید تا کار نصب آغاز شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪424‬‬

‫شکل ‪11-48‬‬

‫همانطور که در شکل ‪ 11-49‬مشاهده میکنید عملیات ‪ Clustring‬به درستی انجام شده است و حاال ما بر روي آدرس‬
‫‪ 192.168.5.21‬سرويس کالستر داريم و میتوانید در ادامه از آن استفاده کنیم‪.‬‬

‫شکل ‪11-49‬‬

‫توجه داشته باشید که اگر در يک سرور عملیات ايجاد ‪ Clustring‬را انجام دهید در سرور ديگر هم همین تنظیمات‬
‫انجام خواهد شد‪.‬‬
‫همانطور که در شکل ‪ 11-50‬مشاهده میکنید ‪ Cluster‬مورد نظر با موفقیت ايجاد شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪425‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-50‬‬

‫اگر بهمانند شکل ‪ 11-51‬وارد قسمت ‪ Node‬شويد دو سرور ‪ Failover-1‬و ‪ Failover-2‬را مشاهده میکنید که هر دو‬
‫در حالت روشن يعنی ‪ UP‬قرار دارند و میتوانند سرويس ارائه دهند‪.‬‬

‫شکل ‪11- 51‬‬

‫نصب کنیم‪ ،‬البته روش‬ ‫‪Failover-2‬‬ ‫و‬ ‫‪Failover-1‬‬ ‫را بر روي هر دو سرور‬ ‫‪SQL Server‬‬ ‫در ادامه کار بايد نرمافزار‬
‫نصب با قبل تفاوت خواهد داشت‪.‬‬
‫وارد يکی از سرورها مثالً ‪ Failover-2‬میشويم و نرمافزار ‪ SQL Server‬را براي نصب اجرا میکنیم‪.‬‬
‫‪New‬‬ ‫بهمانند شکل ‪ 11-52‬وارد ‪ Installation‬شويد و بر روي ‪ Installation‬کلیک کنید و در صفحهي باز شده بر روي‬
‫‪ SQL Server failover cluster‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪426‬‬

‫شکل ‪11-52‬‬

‫در در شکل ‪ 11-53‬برسیهاي اولیه انجام میشود که اگر از نظر ‪ Clustring‬مشکلی نباشد میتوانید کار را ادامه دهید‪.‬‬

‫شکل ‪11-53‬‬

‫در شکل ‪ 11-54‬تیک گزينهي ‪ Database Engine Services‬را انتخاب و بر روي ‪ Next‬کلیک کنید‪ ،‬البته اين موارد را‬
‫قبالً توضیح داديم‪.‬‬
‫‪www.takbook.com‬‬

‫‪427‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-54‬‬

‫يک نام به دلخواه خود وارد کنید‪ ،‬البته اين نام مهم‬ ‫‪SQL Server Network Name‬‬ ‫در شکل ‪ 11-55‬بايد در قسمت‬
‫است و براي دسترسی به ‪ SQL‬بايد از اين نام استفاده کنیم‪ ،‬در قسمت بعدي هم بايد نام ‪ Instance‬را وارد کنید‪.‬‬

‫شکل ‪11-55‬‬

‫در شکل زير دو سرويس موردنیاز براي فعالسازي ‪ Clustring‬در ‪ SQL‬را مشاهده میکنید‪ ،‬بر روي ‪ Next‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪428‬‬

‫شکل ‪11-56‬‬

‫در شکل ‪ 11-57‬بايد همهي ديسکهاي موجود را انتخاب کنید‪ ،‬فقط سه ديسک در لیست قرار دارد‪ ،‬اما يک ديسک‬
‫ديگر که ديسک شمارهي يک باشد در لیست براي انتخاب وجود ندارد‪ ،‬دلیل آن هم اين است که اصو ًال زمانی که‬
‫انتخاب میشود‪ ،‬اين‬ ‫‪Quorum‬‬ ‫را فعال میکنید‪ ،‬ديسک اول بهصورت پیشفرض بهعنوان ديسک‬ ‫‪Clustring‬‬ ‫سیستم‬
‫ديسک تشکیلدهندهي تنظیمات اصلی ‪ Clustring‬است و بهصورت خودکار تنظیم میشود‪ ،‬البته میتوانستیم در قسمت‬
‫ايجاد ‪ Clustring‬اين ديسک را تنظیم کنیم تا خودش يک ديک را انتخاب نکند‪ ،‬در شکل ‪ 11-57‬مشخص شده است‬
‫که کدام ديسک بهعنوان ديسک ‪ Quorum‬انتخاب شده است‪.‬‬

‫شکل ‪11-57‬‬

‫در شکل ‪ 11-58‬بايد شبکهي ‪ IPV4‬خود را انتخاب کنید و يک آدرس ‪ IP‬جديد براي ‪ SQL‬وارد کنید‪ ،‬توجه داشته‬
‫باشید اين ‪ IP‬با ‪ IP‬که در قسمت ‪ Clustring‬وارد کرديم متفاوت خواهد بود‪.‬‬
‫‪www.takbook.com‬‬

‫‪429‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-58‬‬

‫در شکل ‪ 11-59‬بايد نام کاربري که قرار است دسترسی کامل براي اجراي سرويسها را داشته باشد وارد کنید و بر‬
‫روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪11-59‬‬

‫‪Data Directories‬‬ ‫در شکل ‪ 11-60‬و در تب ‪ Server Configuration‬بر روي ‪ Current User‬کلیک کنید و بعد در تب‬
‫بايد محل ذخیره شدن ديتابیسها و اطالعات کاربران و فايل هاي پشتیبان را مشخص کنید‪ ،‬سعی کنید هر قسمت را‬
‫در يکی از هاردهاي ‪ Cluster‬که ايجاد کرديم وارد کنید و بر روي ‪ Next‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪430‬‬

‫شکل ‪11-60‬‬

‫در شکل ‪ 11-61‬بر روي ‪ Install‬کلیک کنید تا کار نصب آغاز شود‪.‬‬

‫شکل ‪11-61‬‬

‫بعد از نصب سرويس ‪ Clustring‬براي ‪ SQL‬سرور اگر وارد سرويس ‪ Failover Cluster Manager‬بهمانند شکل ‪11-62‬‬
‫مورد نظر‬ ‫‪Instance‬‬ ‫با‬ ‫‪SQL Server‬‬ ‫کلیک کنید‪ ،‬همانطور که مشاهده میکنید‬ ‫‪Roles‬‬ ‫شويد از سمت چپ بر روي‬
‫توسط سرور ‪ Failover-2‬ايجاد شده است‪.‬‬

‫شکل ‪11-62‬‬
‫‪www.takbook.com‬‬

‫‪431‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬


‫بعد از اينکه سرويس ‪ SQL‬را براي سرور ‪ Failover-2‬راهاندازي کرديم بايد حتماً در سرور ‪ Failover-1‬هم اين سرويس‬
‫را فعال کنیم تا عملیات ‪ Clustring‬بهدرستی انجام شود‪ ،‬براي اين کار بايد دوباره نرمافزار نصب ‪ SQL‬را اجرا کنید و‬
‫بهمانند شکل ‪ 11-63‬بر روي ‪ Add node to a SQL Server Failover Clustring‬کلیک کنید‪.‬‬

‫شکل ‪11-63‬‬

‫در شکل ‪ 11-64‬بررسیهاي مربوط به ‪ Clustring‬انجام شده و در صورت نبود خطا بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪11-64‬‬

‫همانطور که در شکل ‪ 11-65‬مشاهده میکنید کالستر مورد نظر که با نام شبکهي ‪ SQL-Cluster‬ايجاد کرده بوديم‬
‫بهصورت اتوماتیک پیدا شده که نشان میدهد این نام را از رسور ‪ Failover-2‬گرفته است‪ ،‬برای ادامه کار بر روی‬
‫‪ Next‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪432‬‬

‫شکل ‪11-65‬‬

‫در شکل ‪ 11-66‬هم بايد نام کاربري که قرار است سرويسهاي مورد نظر را اجرا کنید وارد کنید‪ ،‬سعی کنید همان‬
‫کاربري که در ‪ Failover-2‬وارد کرديد در اين قسمت هم وارد کنید‪.‬‬

‫شکل ‪11-66‬‬

‫در شکل ‪ 11-67‬بر روي ‪ Install‬کلیک کنید تا کار نصب آغاز شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪433‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-67‬‬

‫خوب براي تست عملکرد ‪ Clustring‬بهمانند شکل ‪ 11-68‬نرمافزار ‪ SQL Server Management Studio‬را اجرا کنید و‬
‫در قسمت ‪ Server name‬بايد همان نام شبکه که در مراحل راهاندازي ‪ SQL Clustring‬وارد کرديد در اين قسمت هم‬
‫وارد کنید‪.‬‬

‫شکل ‪11-68‬‬

‫در شکل ‪ 11-69‬بهعنوان تست يک ديتابیس در سرور ايجاد کرديم و میخواهیم ببینیم زمانی که يکی از اين سرورهاي‬
‫‪ Failover‬را از دست دهیم چه اتفاقی رخ میدهد‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪434‬‬

‫شکل ‪11-69‬‬

‫در شکل ‪ 11-70‬سرور ‪ Failover-2‬را که سرور اصلی در کالسترينگ بوده را خاموش و يا ‪ Suspend‬میکنیم‪.‬‬

‫شکل ‪11-70‬‬

‫‪Failover-2‬‬ ‫اگر بهمانند شکل ‪ 11-71‬وارد سرويس ‪ Clustring‬شويد و در قسمت ‪ Node‬مشاهده خواهید کرد سرور‬
‫ازکارافتاده‪.‬‬

‫شکل ‪11-71‬‬

‫در شکل ‪ 11-72‬وارد قسمت ‪ Roles‬شويد و همانطور که مشاهده میکنید در ستون ‪ Owner node‬سرور تغییر کرده‬
‫و ‪ Failover-1‬فعال است‪.‬‬
‫‪www.takbook.com‬‬

‫‪435‬‬ ‫‪FAILOVER Clustring‬‬ ‫فصل ‪/ 8‬‬

‫شکل ‪11-72‬‬

‫را راهاندازي کنیم و توانايی آن را‬ ‫‪Failover Clustring‬‬ ‫خوب در اين فصل توانستیم با کمک چهار سرور سرويس‬
‫مشاهده کنیم‪ ،‬اين نوع سرويسها در سازمانهايی مانند بانک که قطع شدن يکلحظه از سیستم میتواند خسارت‬
‫جبرانناپذيري وارد کند خیلی حیاتی و مهم است‪ ،‬پس شما بهعنوان يک ‪ DBA‬بايد نحوهي راهاندازي اين سرويس را‬
‫کامالً مسلط باشید‪.‬‬
www.takbook.com
‫‪www.takbook.com‬‬

‫فصل نهم‬
‫‪Business Intelligence‬‬ ‫هوش تجاري –‬

‫شما بهعنوان متخصص ‪ SQL‬و برنامهنويس يک مجموعه عظیم قادر هستید از پیچیدهترين اطالعات در داخل نرمافزارها‬
‫شويد و از اطالعات‬ ‫‪SQL‬‬ ‫با خبر شويد و مشکالت از نظر فنی نخواهید داشته باشید مثالً میتوانید وارد ديتابیس‬
‫جدول آن با خبر شويد‪ ،‬ولی اگر مدير آن سازمان بخواهد اطالعات مورد نظر را مشاهده کند‪ ،‬به علت نداشتن دانش‬
‫فنی الزم توانايی درک مسئله را نخواهد داشت که اين يک مشکل بزرگ در مجموعه خواهد بود و براي حل مشکل‬
‫بايد راهکارهايی ارائه شود تا مديران و افراد ديگر بتوانند اطالعات را بهراحتی مشاهده و تحلیل آن را بررسی کنند‪.‬‬

‫‪ 9-1‬هوش تجاري چیست‬


‫هوش تجاري به ابزارهايی گفته میشود که يک تحلیل کامل از اطالعات سازمان مورد نظر انجام میدهد و نتیجه آن‬
‫را در خروجی با اشکال مختلف نمايش میدهد و طبق آن نتايج‪ ،‬تصمیمگیريهايی براي پیشرفت سازمان گرفته خواهد‬
‫شد که البته اگر دادهها و تحلیلها اشتباه باشد سازمان ضرر سنگی خواهد کرد‪.‬‬

‫‪ 9-2‬چگونه کار را آغاز کنیم‬


‫براي شروع کار بايد يک سري موارد را آماده کنید‪.‬‬
‫‪ -1‬اولین قدم اين است که هدفهاي پیش روي خود را بشناسیم و طبق آن عمل کنیم تا بتوانیم دادههاي درست‬
‫را از آن استخراج کنیم و بعد بتوانیم از اين شاخصها براي دستیابی به هدفمان استفاده کنیم‪.‬‬
‫‪ -2‬قدم دوم اين است که با استفاده از موارد شمارهي يک بتوانیم طراحی خوبی در قسمت داشبوردهاي ‪ BI‬يا‬
‫همان ‪ Business Intelligence‬داشته باشیم‪.‬‬

‫خوب در ادامه کار میخواهیم بهطورکلی عملیات هوش تجاري را در سازمان بیان کنیم‪ ،‬اگر به شکل ‪ 9-1‬توجه کنید‪،‬‬
‫هوش تجاري در چند مرحله بههموابسته انجام میشود که آنها را با هم بررسی میکنیم‪.‬‬

‫شکل ‪ 9 -1‬هوش تجاری‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪438‬‬


‫فراخوانی دادهها از منابع‬
‫دادههاي خام از منابع اطالعاتی مختلفی جمعآوري شده و در اليه ‪ SSIS‬وارد میشوند‪ .‬منبع داده خام میتواند يک‬
‫باشد‪ .‬در اصل‪ ،‬يک پايگاهداده تحلیلی بايد امکان‬ ‫‪Excel‬‬ ‫سیستم ‪ ،ERP‬پايگاهداده يک برنامه کاربردي يا يک فايل‬
‫دسترسی و پردازش انواع منابع داده اعم از ساختيافته (مانند پايگاههاي داده)‪ ،‬نیمه ساختيافته (مانند فايلهاي‬
‫‪ )Excel‬يا غیر ساختيافته (مانند فايلهاي متنی يا صفحات اينترنتی) را داشته باشد‪.‬‬
‫انجام میشود که خود شامل دو قسمت زير است‪:‬‬ ‫‪SSIS‬‬ ‫جمعآوري اطالعات خام توسط سرويس‬
‫و‬ ‫‪Integration ,Staging‬‬ ‫که رويکرد سهاليه دارد که به ترتیب‬ ‫‪Extract-Transformation-Load‬‬ ‫مخفف‬ ‫‪ETL‬‬

‫‪ Presentation‬نام دارد‪ .‬در اين رويکرد‪ ،‬دادهها قبل از فراخوانی به پايگاهداده تحلیلی (‪ ،)Data warehouse‬ساختار مناسب‬
‫پیدا میکنند و سپس ذخیره میشوند‪.‬‬
‫که بدون توجه به روال سهاليه ‪ ،ETL‬دادهها را مستقیماً به پايگاه‬ ‫‪Extract-Load-Transformation‬‬ ‫مخفف‬ ‫‪ELT‬‬

‫دادههاي تحلیلی فراخوانی میکند و تغییر ساختار دادهها باتوجهبه نیاز انجام و در جداول جديد ذخیره میشود‪.‬‬
‫يک بانک اطالعاتی بزرگ است که از طريق آن کلیه دادههاي حال و‬ ‫‪Data warehouse‬‬ ‫پايگاهداده تحلیلی يا همان‬
‫گذشته يک سازمان جهت انجام عملیات گزارشگیري و آنالیز در دسترس مديران قرار میگیرد‪ .‬پايگاهداده تحلیلی که‬
‫برخی آن را انبار داده میخوانند‪ ،‬نقش مهمی در تصمیمگیري مديران سازمانها براي تعیین يک استراتژي موفق دارد‪.‬‬
‫پايگاهداده نقش محوري در سامانههاي هوش تجاري در سازمانها ايفا میکنند‪.‬‬
‫‪Cognos‬‬ ‫دادهها در دسترس کاربران قرار میگیرد‪ .‬نرمافزارهاي تهیه گزارش مانند‬ ‫‪Reports‬‬ ‫يا‬ ‫‪Presentation‬‬ ‫در اليه‬
‫با دسترسی به اين اليه میتوانند اطالعات موردنیاز مديران و تحلیلگران را استخراج و در‬ ‫‪,Business Object ,SAP‬‬

‫قالب گزارش يا ‪ Dashboard‬عرضه نمايند‪ ،‬البته بهترين نرمافزار در اين زمینه ‪ Power BI‬است‪.‬‬
‫در ادامه کار میخواهیم نحوهي نصب و راهاندازي آن را بررسی کنیم‪.‬‬

‫‪ 9-3‬مقدمهاي بر ‪SSIS‬‬
‫ابزاري‬ ‫میشوند‪SSIS .‬‬ ‫‪ Microsoft SQL Server Integration Services‬با نام ‪ SQL Integration Service‬يا ‪ SSIS‬شناخته‬
‫میکند‪.‬‬ ‫براي هوش تجاري است که راهحلهاي تبديل داده را براي سازمانهاي مختلف فراهم‬
‫و ‪ )Load‬است‪ .‬اين بدين معنی است که‬ ‫‪Transform ،Extract‬‬ ‫(‬ ‫‪ETL‬‬ ‫يک ابزار‬ ‫‪SQL Server Integration Services‬‬

‫میتوان از ‪ SSIS‬براي استخراج دادهها از طیف گستردهاي از منابع مانند فايلهاي اکسل‪ ،‬فايلهاي ‪ ، Flat‬پروندههاي‬
‫‪ ،XML‬پايگاههاي داده رابطهاي و غیره استفاده کرد‪ .‬عالوه بر اين‪ ،‬آنها را مطابق با نیاز خود تبديل کنید و در آخر‬
‫دادهها را در مقصد بارگیري کنید‪ IS .‬يک ابزار هوشمند تجاري است که راهحلهاي تبديل داده را براي سازمانهاي‬
‫مختلف فراهم میکند‪.‬‬

‫‪ 9-4‬نصب و راهاندازي سرويس ‪SSIS‬‬


‫براي نصب و راهاندازي سرويس ‪ SSIS‬نیاز داريم تا در نرمافزار ‪ SQL Server‬سرويس ‪ Integration Services‬را انتخاب‬
‫کنید که اين موضوع را در شکل ‪ 9-2‬مشاهده میکنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪439‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬

‫شکل ‪ 9-2‬نصب سرویس ‪Integration‬‬

‫بعد از اينکه سرويس ‪ Integration‬را بر روي سرور ‪ SQL‬نصب کرديد در ادامه بايد بهصورت زير عمل کنید‪:‬‬
‫‪Visual‬‬ ‫براي اينکه اين سرويس ‪ SSIS‬را بهصورت کامل راهاندازي کنیم نیاز به نرمافزار ‪ SQL Server Data Tools‬در‬
‫‪ studio‬استفاده داريم‪ ،‬براي دانلود و نصب آن از طريق لینک زير فايل مربوط به ‪ Visual Studio 2017‬را که براي اين‬
‫کار طراحی شده است را دانلود کنید‪.‬‬
‫‪https://go.microsoft.com/fwlink/?linkid=2161172&clcid=0x409‬‬
‫همانطور که در شکل ‪ 9-3‬مشاهده میکنید فايل نصبی اجرا شده است و براي شروع بايد بر روي ‪ Next‬کلیک کنید‪.‬‬

‫شکل ‪ 9-3‬نصب ‪SQL Server Data Tools‬‬

‫در شکل ‪ 9-4‬بايد يک ‪ Instance name‬براي اين سرويس مشخص و بر روي ‪ Install‬کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪440‬‬

‫شکل ‪ 9-4‬نصب ‪SQL Server Data Tools‬‬

‫بعد از نصب میتوانید )‪ Visual Studio 2017 (SSDT‬را اجرا کنید‪.‬‬

‫‪ 9-5‬ايجاد پروژه ‪SSIS‬‬


‫براي شروع کار نرمافزار ‪ Visual Studio 2017‬را باز کنید و بهمانند شکل ‪ 9-5‬از منوي ‪ File‬و از قسمت ‪ New‬گزينهي‬
‫‪ Project‬را انتخاب کنید‪.‬‬

‫شکل ‪ 9-5‬ایجاد پروژه‬

‫در ادامه و در شکل ‪ 9-6‬از سمت چپ گزينهي ‪ Integration Services‬را انتخاب کنید و در صفحه باز شده بر روي‬
‫را انتخاب کنید‪ ،‬در قسمت پايین شکل می توانید نام پروژه خود را مشخص و مسیر‬ ‫‪Integration Services Project‬‬

‫ذخیرهسازي آن را مشخص کنید‪.‬‬


‫‪www.takbook.com‬‬

‫‪441‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬

‫شکل ‪ 9-6‬ایجاد پروژه‬

‫همانطور که در شکل ‪ 9-7‬مشاهده میکنید نماي کلی پروژه ‪ Integration‬در ‪ Visual Studio‬باز شده است که براي‬
‫درک بهتر محیط آن شمارهگذاري کرديم و در ادامه آنها را توضیح میدهیم‪.‬‬

‫شکل ‪9-7‬‬

‫‪Solution Explorer‬‬ ‫‪-1‬‬


‫در اين قسمت ترکیبی از اطالعات پروژه‪ ،‬فايلهايی که قرار است در پروژه استفاده شوند و کانکشنهاي‬
‫مورد نظر به فايلهاي خارجی‪ ،‬مانند ارتباط با يک فايل اکسل‪.‬‬
‫‪Properties‬‬ ‫‪-2‬‬
‫در اين قسمت جزئیات اشیايی که انتخاب میکنید نمايش داده خواهد شد‪.‬‬
‫‪Output‬‬ ‫‪-3‬‬
‫در اين قسمت اطالعاتی که در زمان اجرا پروژه نیاز است نمايش داده خواهد شد‪.‬‬
‫‪Favorates‬‬ ‫‪-4‬‬
‫در اين قسمت آيتمهايی که بیشتر از آنها استفاده میکنید نمايش داده خواهد شد‪.‬‬
‫‪Toolbox‬‬ ‫‪-5‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪442‬‬


‫جعبه ابزار ‪ SSIS‬بسیاري از کارهاي داخلی‪ ،‬کانتینرها‪ ،‬تحوالت‪ ،‬منابع‪ ،‬مقصد و کارهاي اداري را براي حل‬
‫مشکالت پیچیده تجارت فراهم میکند‪ .‬با کشیدن و رهاکردن آن کارها در محیط کار‪ ،‬از اين ابزارهاي‬
‫گرافیکی ‪ SSIS‬استفاده کنید‪ .‬اين بدان معناست که براي انجام بیشتر عملیات نیازي به نوشتن يک خط کد‬
‫واحد نیست‪.‬‬
‫‪Package‬‬ ‫‪-6‬‬
‫چندين تب وجود دارد که براي طراحی پروژه کاربرد دارد و میتوانید ‪Task‬هاي مورد‬ ‫‪Package‬‬ ‫در بخش‬
‫نظر خود را بر روي آن قرار دهید و اجرا کنید‪.‬‬

‫‪ 9-5-1‬بررسی ‪ Package‬در ‪SSIS‬‬


‫‪Package.dtsx‬‬ ‫زمانی که يک پروژه جديد ايجاد میکنید بهصورت خودکار در قسمت ‪ SSIS Packages‬يک نام با عنوان‬
‫ايجاد میشود که تمام اطالعات پروژه در آن قرار میگیرد و اگر بخواهید خودتان يک ‪ Package‬جديد ايجاد کنید بايد‬
‫بهمانند شکل ‪ 9-8‬بر روي ‪ SSIS Packages‬کلیک راست کنید و گزينهي ‪ New SSIS Package‬را انتخاب کنید‪.‬‬

‫شکل ‪ 9-8‬ایجاد ‪Package‬‬

‫اگر به شکل ‪ 9-9‬توجه کنید يک ‪ Package‬جديد اضافه شده است اگر دو بار بر روي هر يک از پکیجها کلیک کنید‬
‫اطالعات مربوط به همان پکیج نمايش داده خواهد شد و هر پکیج کار مختص به خودش را انجام میدهد‪ ،‬توجه‬
‫داشته باشید که هر ‪ Package‬داراي پنج تب مختلف است‪ ،‬يک ‪ Package‬بايد حداقل شامل يک ‪ Control flow‬باشد‪.‬‬

‫شکل ‪ 9-9‬ایجاد ‪Package‬‬


‫‪www.takbook.com‬‬

‫‪443‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬


‫‪ 9-5-2‬بررسی ‪Connection Manager‬‬
‫قسمت ديگري که در پروژههاي ‪ SSIS‬وجود دارد‪ Connection Manager ،‬است‪ ،‬اين قسمت براي انتقال دادهها از منابع‬
‫خاص به داخل پروژه کاربرد دارد مثالً میتوانید يک فايل اکسل را به پروژه متصل کنید و از دادههاي آن استفاده کنید‬
‫و يا اينکه يک سرور ايمیل را تنظیم کنید تا در پروژه بتوانیم از آن استفاده کنیم‪ ،‬مثالً بعد از انجام کار يک ايمیل تأيید‬
‫براي شما ارسال کند‪.‬‬
‫‪Vonnection‬‬ ‫مطلع شويم‪ ،‬بهمانند شکل ‪ 9-10‬بر روي‬ ‫‪Connection Manager‬‬ ‫براي اينکه از گزينههاي موجود در‬
‫‪ Managers‬کلیک راست کنید و گزينهي ‪ New Connection Manager‬را انتخاب کنید‪.‬‬

‫شکل ‪ 9-10‬ایجاد ‪Connection Manager‬‬

‫همانطور که در شکل ‪ 9-11‬مشاهده میکنید چندين گزينهي مختلف وجود دارد که با استفاده از آنها میتوانید به‬
‫منابع مختلف و ارتباطات گوناگون دست پیدا کنید‪ ،‬در‬

‫شکل ‪ 9-11‬ایجاد ‪Connection Manager‬‬

‫جدول ‪ 9-1‬بررسی ‪Connection Manager‬‬

‫توضیحات‬ ‫نوع ارتباط‬


‫اين ‪ Connection Manager‬براي ارتباط با ‪ ActiveX Data Objects‬استفاده میشود ‪.‬يا میتوان‬ ‫‪ADO‬‬

‫شی ‪ ADO‬نامید‪.‬‬ ‫آن را يک‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪444‬‬


‫میشود‪.‬‬ ‫اين براي اتصال به منبع داده با استفاده از يک ارائهدهنده دات نت استفاده‬ ‫‪ADO.NET‬‬

‫دادههاي مربوط به جريان داده يا يک فايل حافظه نهان )‪ (.caw‬را میخواند و میتواند‬ ‫‪CACHE‬‬

‫دادهها را در پرونده حافظه نهان ذخیره کند‪.‬‬

‫به يک سرور ‪ Data Quality Services‬و يک پايگاهداده ‪ Data Quality Services‬در سرور‬ ‫‪DQS‬‬

‫میشود ‪.‬‬ ‫متصل‬


‫به يک فايل اکسل متصل میشود‪.‬‬ ‫‪EXCEL‬‬

‫میشود‪.‬‬ ‫به يک فايل يا پوشه متصل‬ ‫‪FILE‬‬

‫به يک فايل ‪ FLAT‬متصل میشود‪.‬‬ ‫‪FLATFILE‬‬

‫براي ارتباط با يک سرور ‪ FTP‬کاربرد دارد‪.‬‬ ‫‪FTP‬‬

‫براي ارتباط با ‪ Web Server‬طراحی شده است‪.‬‬ ‫‪HTTP‬‬

‫میشود ‪.‬‬ ‫به صف پیام متصل‬ ‫‪MSMQ‬‬

‫متصل‬ ‫‪Analysis Services‬‬ ‫يا يک پروژه‬ ‫‪SQL Server Analysis Services‬‬ ‫به نمونهاي از‬ ‫‪MSOLAP100‬‬

‫میشود ‪.‬‬

‫میشود ‪.‬‬ ‫به چندين پرونده و پوشه متصل‬ ‫‪MULTIFILE‬‬

‫میشود ‪.‬‬ ‫به چندين پرونده داده و پوشه متصل‬ ‫‪MULTIFLATFILE‬‬

‫میشود ‪.‬‬ ‫با استفاده از ارائهدهنده ‪ OLE DB‬به منبع داده متصل‬ ‫‪OLE DB‬‬

‫میشود ‪.‬‬ ‫با استفاده از ‪ ODBC‬به منبع داده متصل‬ ‫‪ODBC‬‬

‫میشود ‪.‬‬ ‫به سرور )‪ SQL Server Management Objects (SMO‬متصل‬ ‫‪SMOSERVER‬‬

‫میشود ‪.‬‬ ‫به سرور نامه ‪ SMTP‬متصل‬ ‫‪SMTP‬‬

‫میشود ‪.‬‬ ‫به يک پايگاهداده ‪ SQL Server Compact‬متصل‬ ‫‪SQL MOBILE‬‬

‫مديريت ‪Windows Management Instrumentation‬‬ ‫به يک سرور متصل میشود و دامنه‬ ‫‪WMI‬‬

‫میکند ‪.‬‬ ‫)‪(WMI‬در سرور را مشخص‬

‫تا به اينجاي کار يک پروژه جديد ايجاد کرديم و محیط و ابزارهاي آن را بررسی کرديم در ادامه میخواهیم با تعريف‬
‫مثالهاي گوناگون نحوهي کار سرويس ‪ SSIS‬را بررسی کنیم‪.‬‬

‫‪ 9-5-3‬استفاده از ‪ FTP‬در ‪SSIS‬‬


‫ارسال‬ ‫‪FTP‬‬ ‫يکی از امکاناتی که در ‪ SSIS‬وجود دارد اين است که شمامیتوانید‪ ،‬فايل مورد نظر خود را به يک سرور‬
‫کنید‪ ،‬براي اين کار به مانند شکل ‪ 9-12‬ابزار ‪ FTP Task‬را به لیست اضافه و بر روي آن دو بار کلیک کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪445‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬

‫شکل ‪9-12‬‬

‫در شکل ‪ 9-13‬و از قسمت ‪ FtpConnection‬گزينهي ‪ New Connection‬را انتخاب کنید‪.‬‬

‫شکل ‪ 9-13‬ایجاد ‪FTP Connection‬‬

‫در شکل ‪ 9-14‬و در قسمت ‪ Servername‬بايد آدرس سرور ‪ FTP‬خود را وارد کنید‪ ،‬در قسمت پورت هم اگر تغییري‬
‫و‬ ‫‪Username‬‬ ‫در سرور ايجاد نکرده باشید همان پورت ‪ 21‬را که پورت پیشفرض است را وارد کنید و در قسمت‬
‫‪ Password‬نام کاربري و رمز عبور را وارد و بر روي ‪ OK‬کلیک کنید‪ ،‬البته قبل از آن میتوانید بر روي ‪TestConnection‬‬

‫کلیک کنید و ارتباط با سرور ‪ FTP‬را تست کنید‪.‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪446‬‬

‫شکل ‪ 9-14‬تنظیمات ‪FTP‬‬

‫در شکل ‪ 9-15‬بعد از اضافه کردن ‪ Connection‬بايد نام و توضیحات دلخواه خود را وارد کنید‪.‬‬

‫شکل ‪ 9-15‬تنظیمات ‪FTP‬‬


‫‪www.takbook.com‬‬

‫کلیک کنید و يک فايل به دلخواه از سیستم خود انتخاب‬ ‫‪New‬‬ ‫بر روي‬ ‫‪LocalPath‬‬ ‫در شکل ‪ 9-16‬بايد در قسمت‬
‫کنید که در اينجا يک فايل اکسل انتخاب شده است‪.‬‬

‫شکل ‪ 9-16‬تنظیمات ‪FTP‬‬

‫در شکل ‪ 9-17‬بعد از معرفی فايل براي انتقال‪ ،‬بايد در قسمت ‪ Operation‬نوع عملیات را مشخص کنید و در قسمت‬
‫‪ RemotePath‬با قرار دادن عالمت "‪ "/‬مشخص میکنید که فايل در ريشه کپی شود‪.‬‬

‫شکل ‪ 9-17‬تنظیمات ‪FTP‬‬

‫بعد از اينکه تظیمات را در قسمت قبل به درستی انجام داديد به مانند شکل ‪ 9-17‬بر روي دکمه ‪ Start‬کلیک کنید تا‬
‫عملیات انتقال فايل از سیستم شما به سرور ‪ FTP‬از طريق ‪ SSIS‬انجام شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪448‬‬

‫شکل ‪ 9-17‬اجرای ‪FTP‬‬

‫همانطور که در شکل ‪ 9-18‬مشاهده میکنید ‪ FTP‬با موفقیت اجرا شده و در شکل ‪ 9-19‬فايل مورد نظر در ‪ FTP‬کپی‬
‫شده است‪.‬‬

‫شکل ‪ 9-18‬اجرای ‪FTP‬‬

‫شکل ‪ 9-19‬انتقال فایل ‪FTP‬‬

‫‪ 9-5-4‬کار با ‪ Integrity, Shrink, Backup, Email‬در ‪SSIS‬‬


‫در سرويس ‪ SSIS‬شما میتوانید ديتابیسهاي خودتان را از نظر سالم بودن (‪ )Integrity‬بررسی کنید‪ ،‬حجم آن را کاهش‬
‫دهید (‪ ،)Shrink‬يک پشتیبان کامل از تمام ديتابیسها تهیه کنید و در آخر اگر کار به درستی انجلم شد يک ايمیل هم‬
‫به مدير مورد نظر ارسال کنید‪ ،‬براي اين کار به مانند شکل‪ 9-20‬چهار ابزار مورد نظر را به صفحه اضافه کنید و‬
‫فلشهايی که در انتهاي آنها قرار دارد را به ترتیب به هم متصل کنید‪ ،‬با اين کار‪ ،‬کارها به ترتیب و پست سر هم اجرا‬
‫خواهد شد‪.‬‬
‫‪www.takbook.com‬‬

‫‪449‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬

‫شکل ‪ 9-20‬اجرای چهار مرحله‬

‫براي اينکه بتوانیم هر يک از ابزارها را تنظیم کنید به مانند شکل ‪ 9-21‬بر روي آنها کلیک راست و گزينهي ‪ Edit‬را‬
‫انتخاب کنید‪.‬‬

‫شکل ‪ 9-21‬تنظیم ‪Integrity‬‬

‫در شکل ‪ 9-22‬بايد بر روي ‪ New‬کلیک کنید و سروري که ‪ SQL‬بر روي آن نصب شده است را وارد کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪450‬‬

‫شکل ‪ 9-22‬ارتباط با سرور ‪SQL‬‬

‫در شکل ‪ 9-23‬بايد در قسمت ‪ Database‬گزينهي ‪ All databases‬را انتخاب کنید و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪ 9-23‬انتخاب دیتابیس‬

‫در قسمت دوم يعنی ‪ Sharink‬بايد به مانند شکل ‪ 9-24‬گزينهي ‪ All databases‬را انتخاب و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪ 9-24‬انتخاب دیتابیس‬


‫‪www.takbook.com‬‬

‫‪451‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬


‫در ادامه کار به مانند شکل ‪ 9-25‬بر روي ‪ Back up‬کلیک راست کنید و گزينهي ‪ Edit‬را انتخاب کنید‪:‬‬

‫شکل ‪ 9-25‬تنظیم ‪Back up‬‬

‫در شکل ‪ 9-26‬بايد از قسمت ‪ Backup Type‬نوع پشتیبان را ‪ Full‬انتخاب کنید و در قسمت ‪ Database‬کل ديتابیس را‬
‫انتخاب کنید و در ادامه کار وارد تب ‪ Destination‬شويد‪.‬‬

‫شکل ‪ 9-26‬تنظیم ‪Back up‬‬

‫به مانند شکل ‪ 9-27‬بايد مسیر مورد نظر براي کپی کردن فايل پشتیبان را مشخص کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪452‬‬

‫شکل ‪ 9-27‬تنظیم ‪Back up‬‬

‫شويد و از قسمت‬ ‫‪mail‬‬ ‫در مرحله آخر بايد ايمیل را تنظیم کنیم براي اين کار به مانند شکل ‪ 9-28‬وارد تب‬
‫‪ SmtpConnection‬گزينهي ‪ New connection‬را انتخاب کنید‪.‬‬

‫شکل ‪ 9-28‬تنظیم ‪Email‬‬

‫در شکل ‪ 9-29‬نام به دلخواه وارد و آدرس سرور ‪ Email‬خود را وارد کنید‪ ،‬اگر تیک گزينهي مورد نظر را انتخاب‬
‫کنید از همان نام کاربري و رمز عبور شما که وارد ويندوز شدهايد استفاده خواهد شد‪.‬‬
‫‪www.takbook.com‬‬

‫‪453‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬

‫شکل ‪ 9-29‬تنظیم ‪Email‬‬

‫در شکل ‪ 9-30‬و در قسمت ‪ From‬و ‪ To‬ايمیل مورد نظر خود را وارد کنید و در قسمت ‪ Subject‬عنوان ايمیل و در‬
‫قسمت ‪ MessageSource‬متن ايمیل را وارد و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪ 9-30‬تنظیم ایمیل‬

‫بعد از تکمیل موارد باال به مانند شکل ‪ 9-31‬بر روي دکمه ‪ Start‬کلیک کنید تا عملیات آغاز شود‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪454‬‬

‫شکل ‪ 9-31‬اجرای عمیالت‬

‫همانطور که در شکل ‪ 9-32‬مشاهده میکنید عملیات با موفقیت اجرا شده است و در شکل ‪ 9-33‬هم ايمیل تايید‬
‫ارسال شده است‪.‬‬

‫شکل ‪ 9-32‬اجرای عملیات‬


‫‪www.takbook.com‬‬

‫‪455‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬

‫شکل ‪ 9-33‬تایید ایمیل‬

‫‪ 9-5-5‬گرفتن خروجی تصادفی از جداول با ‪SSIS‬‬


‫بعضی اوقات تعداد زيادي رديف در جداول پايگاه داده داريم‪ .‬ما میخواهیم محاسبات مربوط به دادهها را انجام دهیم‪،‬‬
‫اما به تمام دادههاي جدول نیازي نداريم‪.‬‬
‫می توانید آن را مانند آزمايش خون در آزمايشگاه پزشکی درک کنید‪ .‬الزم است شما يک نمونه از خون خود را بدهید‬
‫تا آنها بتوانند آزمايش آزمايشگاهی را روي آن انجام دهند و به شما نتیجه بدهند ‪.‬فرض کنید ما رکورد فروش مشتري‬
‫داريم و شامل میلیونها رکورد است‪ ،‬شما میخواهید روي آن دادهها محاسبات مورد نظر خود را انجام دهید‪ .‬اگر‬
‫بخواهید تمام ان دادهها را استفاده کنید‪ ،‬منابع زيادي از سیستم مصرف میشود و اجراي بسته نیز زمانبر است‪ .‬ما‬
‫شود‪.‬‬ ‫مکانیزمی میخواهیم که بايد ‪ ٪20‬رکورد را از جدول دريافت کند و میتواند از آن براي کارهاي بیشتر استفاده‬
‫مثال ديگري که می توانید در نظر بگیريد سیستم قرعهکشی است‪ .‬فرض کنید می خواهید ‪ 20‬مشتري را از کل مجموعه‬
‫در ‪ SSIS‬استفاده کنیم ‪.‬‬ ‫داده ها به طور تصادفی انتخاب کنید ‪.‬ما می توانیم براي تحقق هدف خود از نمونه برداري داده‬
‫براي انجام اين کار میخواهیم يک پايگاه دادهعظیم را به ‪ SQL Server‬اضافه کنیم و از طريق ‪ SSIS‬يک خروجی به‬
‫دلخواه از آن بگیريم‪.‬‬
‫براي شروع از لینک زير پايگاه دادهي ‪ AdventureWorks2019‬را از طريق لینک زير دانلود کنید‪:‬‬
‫‪https://github.com/Microsoft/sql-server-samples/releases/download/adventureworks/AdventureWorks2019.bak‬‬
‫‪SQL Server‬‬ ‫بعد از دانلود فايل مورد نظر بايد آن را در ‪ Restore ،SQL‬کنید‪ ،‬براي اين کار به مانند شکل ‪ 9-34‬وارد‬
‫شويد و بر روي ‪ Databases‬کلیک راست کنید و گزينهي ‪ Restore Database‬را انتخاب کنید‪.‬‬

‫شکل ‪Restore Database 9-34‬‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪456‬‬


‫به مانند شکل ‪ 9-35‬بايد گزينهي ‪ Devices‬را انتخاب کنید و فايل مورد نظر را در مسیر مشخص شده انتخاب کنید و‬
‫بعد بر روي ‪ OK‬کلیک کنید تا فايل مورد نظر به ‪ SQL‬اضافه شودتا بتوانیم در ادامه از اين ديتابیس استفاده کنیم‪.‬‬

‫شکل ‪Restore Database 9-35‬‬

‫بعد از اضافه کردن ديتابیس میتوانیم از طريق دستور زير خروجی کلی از جدول ‪ Sales.Customer‬را مشاهده کنید‪.‬‬
‫‪SELECT‬‬ ‫]‪[CustomerID‬‬
‫]‪,[PersonID‬‬
‫]‪,[StoreID‬‬
‫]‪,[TerritoryID‬‬
‫]‪,[AccountNumber‬‬
‫]‪,[rowguid‬‬
‫]‪,[ModifiedDate‬‬
‫]‪FROM [AdventureWorks2019].[Sales].[Customer‬‬

‫همانطور که در شکل ‪ 9-36‬مشاهده میکنید‪ ،‬خروجی جدول ‪ Sales.Customer‬داراي ‪ 19820‬سطر هست که در ادامه‬
‫میخواهیم آن را محدودتر کنیم و در خروجی نمايش دهیم‪.‬‬

‫شکل ‪ 9-36‬خروجی جدول‬

‫براي شروع کار به مانند شکل ‪ 9-37‬وارد ‪ SSIS‬شويد و ‪ Data Flow Task‬را وارد قسمت ‪ Control Flow‬کنید و بعد‬
‫از آن بر روي آن دو بار کلیک کنید تا وارد تب ‪ Data Flow‬شويم‪.‬‬
‫‪www.takbook.com‬‬

‫‪457‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬

‫شکل ‪Data Flow 9-37‬‬

‫به مانند شکل ‪ 9-38‬ابزار ‪ OLE DB Source‬را وارد صفحه ‪ Data Flow‬کنید و بر روي آن کلیک راست کنید و گزينهي‬
‫‪ Edit‬را انتخاب کنید‪.‬‬

‫شکل ‪ 9-38‬ابزار ‪OLE DB Source‬‬

‫در شکل ‪ 9-39‬بايد بر روي ‪ New‬کلیک کنید و آدرس سرور به همراه ديتابیس مورد نظر را انتخاب کنید‪ ،‬بعد از اين‬
‫کار بايد جدول ‪ Sales.Customers‬را انتخاب کنید و بر روي ‪ OK‬کلیک کنید‪.‬‬

‫شکل ‪ 9-39‬انتخاب جدول‬

‫در ادامه کار به مانند شکل ‪ 9-40‬از ابزارهاي موجود‪ ،‬ابزار ‪ Row Sampling‬را به صفحه اضافه کنید و بر روي آن دو‬
‫بار کلیکم کنید‪.‬‬
‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪458‬‬

‫شکل ‪ 9-40‬ابزار ‪Row Sampling‬‬

‫در شکل ‪ 9-41‬بايد در قسمت اول مشخص کنید کخ چه تعداد سطر را میخواهید در خروجی نمايش دهید‪ ،‬همانطور‬
‫که در اول اين بخش گفتیم ‪ 19820‬سطر داريم که شما می توانید هر تعداد به دلخواه را در خروجی نمايش دهید که‬
‫‪Sample output name‬‬ ‫البته خروجی به صورت تصادفی میباشد‪ ،‬در اين قسمت عدد ‪ 10‬را وارد میکنیم و در قسمت‬
‫نام "خروجی اصلی" و در قسمت ‪ Unselected output name‬نام "خروجی فرعی" را وارد میکنیم‪ ،‬توجه داشته باشید‬
‫که در تب ‪ Columns‬میتوانید مشخص کنید که چه ستونهايی در خروجی نمايش داده شوند‪.‬‬

‫شکل ‪Row Sampling 9-41‬‬

‫در ادامه براي اينکه خروجی را نمايش دهیم به مانند شکل ‪ 9-42‬دو بار ابزار ‪ Multicast‬را در صفحه قرار دهید‬

‫شکل ‪ 9-42‬ابزار ‪Multicast‬‬


‫‪www.takbook.com‬‬

‫‪459‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬


‫فلش آبی رنگ را به آن متصل کنید و بعد از اضافه کردن شکل ‪ 9-43‬ظاهر‬ ‫‪Row Sampling‬‬ ‫و براي ارتباط با ابزار‬
‫میشود که داراي دو خروجی است‪ ،‬براي اين قسمت گزينهي "خروجی اصلی" را انتخاب کنید و براي گزينهي ديگر‬
‫"خروجی فرعی" را انتخاب کنید‪.‬‬

‫شکل ‪ 9-43‬ارتباط بین دو ابزار‬

‫در ادامه و بعد از مشخص کردن ارتباط به مانند شکل ‪ 9-44‬بر روي لینک ارتباطی "خروجی اصلی" کلیک راست‬
‫کنید و گزينهي ‪ Enable Data Viewer‬را انتخاب کنید‪.‬‬

‫شکل ‪ 9-44‬بررسی لینک ارتباطی‬

‫اگر به شکل ‪ 9-45‬توجه کنید‪ ،‬بعد از اينکه ابزارها را به درستی تنظیم کرديد میتوانید بر روي دکمه ‪ start‬کلیک کنید‬
‫تا خروجی را مشاهده کنیم‪.‬‬

‫شکل ‪ 9-45‬اجرای پروژه‬


‫‪www.takbook.com‬‬

‫‪SQL Server 2019‬‬ ‫آموزش‬ ‫‪460‬‬


‫همانطور که در شکل ‪ 9-46‬مشاهده میکنید‪ ،‬خروجی با موفقیت نمايش داده شده و ‪ 10‬سطر که مشخص کرده بوديم‬
‫مشخص شده است‪ ،‬براي اينکه پروژه را به اتمام برسانید بايد بر روي فلش سبزر رنگ کلیک کنید‪ ،‬به لینکهاي‬
‫ارتباطی توجه کنید که ‪ 10‬خروجی در "خروجی اصلی" قرار گرفته و ‪ 19810‬خروجی در "خروجی فرعی"‪.‬‬

‫شکل ‪ 9-46‬اجرای پروژه‬

‫همانطور که مشاهده کرديد توانستیم با استفاده از تعداد سطرها خروجی را کنترل و نمايش دهیم‪ ،‬ولی اگر بخواهیم‬
‫خروجی را به صورت درصد نمايش دهیم نحوهي کار تغییر خواهد کرد‪ ،‬براي اين کار به مانند شکل ‪ 9-47‬ابزار‬
‫‪ Precentage Sampling‬را به لیست اضافه کنید‪.‬‬

‫شکل ‪ 9-47‬ابزار ‪Precentage Sampling‬‬

‫همانطور که در شکل ‪ 9-48‬مشاهده میکنید بايد درصد مورد نظر خود را وارد کنید که در اينجا ‪ 5‬درصد وارد شده‬
‫است و ورودي اصلی و فرعی مشخص شده است‪.‬‬
‫‪www.takbook.com‬‬

‫‪461‬‬ ‫‪Business Intelligence‬‬ ‫فصل ‪/9‬‬

‫شکل ‪ 9-48‬تنظیم درصد خروجی‬

‫بعد از تکمیل کار بايد بر روي دکمه ‪ Start‬به مانند شکل ‪ 9-49‬کلیک کنید‪.‬‬

‫شکل ‪ 9-49‬اجرای پروژه‬

‫همانطور که در شکل ‪ 9-50‬مشاهده میکنید خروجی کار مشخص شده است‪.‬‬


www.takbook.com

SQL Server 2019 ‫آموزش‬ 462

‫ اجرای پروژه‬9-50 ‫شکل‬


www.takbook.com

‫منابع‬
• Pro SQL Server 2019 Administration, 2nd Edition - Peter A. Carter
• Microsoft SQL Server 2012 - William R. Stanek
• SQL Server 2012 T-SQL Recipes - Jason Brimhall - David Dye - Jonathan Gennick - Andy Roberts - Wayne Sheffield
• Microsoft SQL Server 2012 BIBLE - Patrick LeBlanc, Jose Chinchilla, Aaron Nelson, Jorge Segarra , Adam Jorgensen
• SQL Server Integration Services (SSIS) Step by Step Tutorials - Karthikeyan Anbarsan
• https://www.sqlshack.com/
• https://dba.tosinso.com - ‫مر یم حیات رمضانی‬
• http://www.hpkclasses.ir -‫هاله کسمائی‬
• https://mug.ac - ‫سایت تکنولوژ ی و برنامهنو یسی ماگ از مجموعه وب سایتهای آموزشی موسسه آموزش عالی‬
‫آزاد دانش پژوهان‬
• https://www.sqlservertutorial.net/

‫تماس با ما‬

‫ و يا‬Farshidbabajani@outlook.com ‫براي ارتباط با ما می توانید سواالت و پیشنهادات خود را به آدرس ايمیل‬


.‫ ارسال کنید‬Frshidbabajani@gmail.com
@Farshidbabajani : ‫آدرس تلگرام‬
@Ciscopress : ‫آدرس کانال تلگرامی‬

You might also like