با کلیک بر روی گزینه زیر فایل گزارش کارآموزی برنامه نویسی (ویژوال بیسیک) را دانلود نمایید. همچنین در ادامه متن این گزارش کارآموزی نیز خواهد آمد.
دانلود
به نام خدا
گزارش کارآموزی برنامه نویسی
ویژوال بیسیک
«گزارش كار جلسه اول»
عنوان:
معرفي و نصب (SQL) (SQL server 2000)
شرح مطالب:
نخستين سؤال مهم اين است، «به كدام ويرايش SQL نيازمنديم؟»
ـ مايكروسافت داراي 6 ويرايش همزمان از SQL server است كه عبارتند از:
ويرايش استاندارد 1-
2- Enterprise
3- Personal
4- Developer
5- Evelution
6- Desktop
ما از نسخة Personal براي نصب استفاده ميكنيم زيرا ويرايش personal روي هر كامپيوتري از جمله ويندوز 98، NT workstation، ME، ويندوز 2000 و … در مجموع روي همة سيستمهاي عامل قابل نصب است.
در سيستم خود از هر SQL server ميتوانيم چند instance يا نمونه داشته باشيم.
Server, SQL تكنولوژي است يعني روي سيستمهائي كه به عنوان server هستند قابل نصب است.
براي نصب SQL حتماً بايد TCP/IP روي سيستم نصب باشد چگونه بوجود ميآيد؟ تا نصب يا مودم يا كارت شبكه اين پروتكل روي سيستم نصب خواهد شد.
براي شروع نصب، CD را در درايور CD ROM قرار ميدهيم تا ديالوگ اجراي خودكار بودن (outo run) نمايش داده شود. از منوي نشان داده شده Install Database server را كليك ميكنيم پس از صفحة خوشامدگوئي Next را كليك ميكنيم پس از گزينه نصب SQL بر روي يك كامپيوتر راه دور يا محلي رو به رو ميشويم پيشگزينه نصب بر روي كامپيوتر محلي را ميپذيريم و Next را كليك ميكنيم.
انتخابات پيش گزيده براي ايجاد نسخه جديد SQL را ميپذيريم و Next را كليك ميكنيم در صفحة جمعاوري اطلاعات كاربر نام و نام شركت و Next را كليك ميكنيم.
در كادر نمايش داده شده بعدي كه توافقنامة ليسانس بكارگيري SQL server 2 … است با انتخاب yes موافقت خود را يا مفاد توافقنامه اعلام ميكنيم كليك كردن Next و سپس كليد CD را در محل مربوطه وارد كرده و در كادر بعدي پيش گزيده sever and client tools را انتخاب و به همين ترتيب در ادامة كار هم كليد گزينههاي پيشفرض و در دسترس را ميپذيريم تا نصب به پايان برسد. (انتخاب گزينههاي Defalt مطلوب خواهد بود)
نصب SQL نسبتاً راحت و بدون دردسر انجام ميگيرد پس از نصب مجموعهاي از سرويسها، ابزارها و مستندات در اختيار ما قرار ميگيرد همچنين فايلها متعددي بر روي كامپيوتر ما نصب ميشود و تغييرات لازم نيز در رجيستري ويندوز انجام شده تعدادي پايگاه داده پيش گزيده مثل master، model و .. نيز بر روي سيستم نصب شده است و علاوه بر آن پيكربندي ايمني پيش گزيده نيز راهاندازي شده است.
«گزارش كار جلسه دوم»
عنوان:
ساختن يك پايگاه داده
شرح مطالب
در محيط SQL server، شما ميتوانيد جداول، نماها و ديگر اشياء مربوط به يك سري از اطلاعات درون يك پايگاه داده را ذخيره كنيد بنابراين اولين قدم در پيادهسازي يك برنامة كاربردي ـ اطلاعاتي، ساختن يك پايگاه دادة آن است.
ابتدا چند تا file درست ميكنيم و آنها را در داخل file Groop قرار ميدهيم حتماً يك file Groop به نام primery file داريم يا master Data file با پسوند MDF بقيه فايلها هر چه كه داريم Secondry است با پسوند NDF.
اولين فايلي كه ساختيم حتماً در primery قرار ميگيرد به طور اتوماتيك كه ما نميتوانيم آن را عوض كنيم بقيه فايلها يا در primery يا در secondry جاي ميگيرند.
براي يك پايگاه دادة منطقي، SQL server دو فايل ميسازد، 1ـ يكي براي اشياء 2ـ يكي براي ثبت تركنشهاي انجام شده
براي ساختن يك پايگاه دادة جديد روشهاي مختلفي وجود دارد يكي از روشها استفاده از ويزارد creat Data Base است كه ابتدا پوشه Data Base را باز كنيد SQL server ليستي از تمام پايگاه دادههاي موجود را در منطقة جزئيات نمايش ميدهد دكمة ويزارد موجود بر روي نوار ابزار Enterprise menager را كليك كنيد SQL server كادر محاورهاي select wizard را نمايش ميدهد. آيتم create Data Base wizard را از قسمت Data base انتخاب كرده و OK را كليك ميكنيم اولين صفحة ويزارد را Next كرده صفحهاي ظاهر ميشود كه نام و محل ذخيره پايگاه جديد را وارد ميكنيم براي تغيير دادن محل ذخيره فايل دكمة Browse را كليك ميكنيم و .. در صفحهاي كه وزيارد نام و اندازه اوليه فايل پايگاه داده را از شما درخواست ميكند دكمه Next را كليك ميكنيم در صفحة بعد ميتوانيد مشخص كنيد كه آيا حجم و فايل پايگاه دادة ما به طور اتوماتيك زياد شود يا خير تنظيمات پيِفرض را قبول كرده و Next را كليك ميكنيم در صفحة بعدي نام و اندازة اوليه فايل ثبت تراكنشها را ميپرسد و در صفحة بعدي تعيين ميكنيم كه آيا حجم فايل ثبت تراكنشها به طور اتوماتيك زياد نشود يا خير دكمة Next را كليك ميكنيم در صفحة نهائي ويزارد انتخابهاي ما نمايش داده ميشود دكمة Finish را كليك ميكنيم در نهايت از ما سئوال ميكند كه آيا براي اين پايگاه ساخته شدة خود ميخواهيد برنامة نگهداري تعريف كنيد؟ و اما تنظيم ويژگيهاي پايگاه داده
هنگامي كه با استفاده از ويزارد Create Data Base يك پايگاه داده ميسازيد خصوصيات يا ويژگيهاي آن پايگاه داده را مشخص ميكنيد مثل نام و محل ذخيرة فايلهاي آن. پس از اينكه پايگاه داده ساخته شد، براي تغيير دادن ويژگيهاي آن ميتوانيم از كادر محاورهاي Data base properties استفاده كنيم ابتدا پايگاه داده را در كنسول درختي انتخاب ميكنيم دكمة properties موجود روي نوار ابزار را كليك ميكنيم كادر محاورهاي موردنظر باز ميشنود روي سربرگ Data file كليك ميكنيم خصوصيات فايلهاي ذخيره اطلاعات ظاهر ميشود تغيير ويژگيهاي فايل در قسمت پائين كادر صورت ميگيرد.
رشد فايل
اضافه كردن اندازة فايل هم از طريق دادن ساير مشخص مثلاً Imag
هم از طريق افزايش درصدي مثلاً %10 فايل قبلي
هرگاه حافظه كم آورديم افزايش ميدهد. دكمة OK را كليك ميكنيم SQL ويژگيهاي جديد را تنظيم ميكند و كلمه محاورهاي را ميبندد.
ـ ايجاد جداول
مراحل ايجاد جدول در Enterprise manager به قرار زير است.
پس از وارد شدن connect شدن به SQL يكي از پوشهها (پوشه پايگاه داده) را بسط ميدهيم سپس با يك پايگاه موردنظر را بسط ميدهيم و روي پوشه tables كليك ميكنيم در سمت راست آن كليك راست ميكنيم و از منوي ظاهر شده Newtable را انتخاب ميكنيم پنجرة طراح جدول باز ميشود اطلاعات column name و Datatype و Length و All ow Nuls را براي تعداد ستونهاي موردنظرمان اضافه ميكنيم در هر مورد خواص ستونها را نيز تنظيم ميكنيم پس از خاتمه، آيكون save را براي ذخيره جدول كليك ميكنيم نام مناسب را تخصيص داده و ديالوگ را ميبنديم.
براي ذخيره اطلاعات در جداول روي جدول راست كليك كرده و opentable ميكنيم اطلاعات موردنظر را ريخته و save ميكنيم.
چند نكته
ـ نوع دادهاي car ثابت و fix است vercar متغير است. varcarكاراكتر code از ASCII (هر حرف يك بايت اشغال ميكند) به unique (هر حرف 2 بايتي است) ميرود. هزينة uniqe بيشتر است.
ـ اگر نگوئيم جدول را كجا بريزد ميريزد توي Defult اما اگر مشخص كنيم در جاي موردنظر ما ميريزد.
ـ Data fileها پسوند Ldf دارند كه هيچ گروهي ندارند.
ـ روي كليد اصلي حتماً index ميگذاريم. براي دستيابي سريع
ـ uniqe بودن ايندكس يعني تكراري نداريم.
«گزارش كار جلسة سوم»
عنوان:
Trenzaction
شرح مطالب
ACID ترنزكشن را ساپورت ميكند خواهش را هم ساپورت ميكند.
ـ چهار خاصيت ترنزكشن
تجزيهناپذير 1- Atomicity
سازگاري ـ صحت 2- Consistercy
جدائي 3- Isolation
پايداري 4- Durability
تجزيهناپذيري
مجموعه فعاليتهاي كه با هم اجرا شود يا با هم كنسل شود
سازگاري: اگر ديتابيس در شروع تزنزكشن ساختار درستي دارد ترنزكشن اين ساختار را به هم نزند.
جدائي:
ترنزكشن نبايد تأثير منفي هنگام اجراي موازي چند ترنزكشن با هم داشته باشد يعني تراكنشها در يكديگر مداخله نكنند.
پايداري
اگر تراكنش تكميل شد به هيچ عنوان اطلاعاتي كه ثبت شده است از بين نرود.
سه خاصيت Atomicity، Isolation، Durabiltiy را DBMS بايد پاسورت كند، اما Consistery را بايد user ساپورت كند يعني تراكنشي كه ما مينويسيم بايد ساختار آن به گونهاي باشد كه logic آن را به هم نزند.
ـ DBMS چگونه Atomiciy را ساپورت ميكند؟
ـ وقفه نرمافزاري
از طريق Backup يا Rule Back از طريق نرمافزاري يا تصميمات كاربر كل تراكنش را برگشت دهيم
توسط file كه luck file فايلي است كه هر كاربر راجع به تراكنش را در آن ثبت ميكنيم پس در DBMS، Atomicity توسط luck fileها انجام ميشود.
ـ مشكلات سختافزاري
crash كردن سيستم، وقتي دوباره سيستم بالا ميآيد بايد DBMS ببيند كه كدام تراكنش Rule Back يا commite ندارد يعني آن ناتمام است و در بين تراكنش دچار وقفه شده است. حل اين هم از طريق luck file است.
ـ در مورد Isolation:
چهار سطح Isolation داريم:
يعني هر چه به سطح بالاتر ميرويم تراكنشها بيشتر از هم جدا ميشوند و اجراي همزمان تراكنشها پائينتر ميآيد.
پس با پرداخت هزينه اجراي تراكنش safeتري خواهيم داشت.
ـ در مورد پايداري:
وقتي تراكنش تكميل شود ديگر قابل برگشت نخواهد بود اگر تراكنشي فرمان commite را اجرا كند انجام عمليات تثبيت خواهد شد اين هم توسط luck file انجام خواهد شد يعني با commite ديگر تراكنش كم نخواهد شد.
ممكن است قبل از ذخيره اطلاعات روي هارد و تثبيت اطلاعات crash اتفاق بيفتد (خودش بافري دارد كه به محض زدن commite اطلاعات از بافر به روي هارد تثبيت ميشود البته luck file بايد كليه اطلاعاتش ثبت شود كه يكدفعه luck file) بافر مربوط به luck file هنگام commite بايد روي هارد كپي شود.
ـ بررسي مشكلات اجراي همرونر تراكنشها:
يكي از مكانيزمها استفاده از luck فايلهاست ميخواهيم تراكنش T1 را با دو كار Read و write بنويسيم x در اول كار برابر با x0 است T2 بايد x را Read كند و سپس T1 از ادامه منصرف شود Roll Back ميكند و بعد از آن commite, T2 ميكند چه مشكلي بوجود خواهد آمد.
ما هنگام اجراي تراكنشها بايد بتوانيم بگوئيم كه كدام تراكنش اول و كدام دوم اجرا شده است يعني بايد يك ترتيب serial اجراي تراكنشها داشته باشيم در غير اينصورت يعني تراكنشها saide effect دارند.
ابتداي كار | x = x0 |
T2 | T1 |
Begin Trams | Begin Trams |
R(x) | W(x, x1) |
commit | Roll Back |
اول T2 بعد T1 | |
اول T1 بعد T2 |
اگر همزمان اجرا شود.
1ـ مشكل uncommitted read يا dirty read را داريم.
اولين مشكل را با نوشتن سطوح جداسازي به شكل committed read يا حرف Dirtyها حل كنيم يعني در T2 صبر ميكنيم تا T1 كارش تمام شود.
2ـ مشكل سطح 2 چيزي كه T1 خوانده را T2 ميتواند بنويسيد عكس امكانپذير نيست.
T2 | T1 |
Begin Trams | Begin Trams |
W(x, x1) | R(x) |
commit | R(x) |
Commit |
Select commit from student where student Id = 12;
وقتي اجرا ميكنيم ميخواند ‘e e e’ در حاليكه بنابراين كار را بكند اگر isolation را Read committed كنيم يعني قفل گذاشتهايم صبر كند تا اولي كارش تمام شود و بعد بخواند.
مشكلي كه وجود دارد در T1 مقدار خواندن xها متفاوت است.
x0 | x0 | ||||
wirte | x1 | T2 | Read | x0
x0 |
T1 |
Read | x1
x1 |
write | x1 | T2 | |
x1 | x1 | در نهايت داريم. |
پس بين Read ما نبايد write انجام شود تا مقدار read دوم عوض نشود.
يعني وقتي يك چيزي را خواندم نبايد كسي آن را بنويسد كه ما وقتي دوباره آن را ميخوانيم مقدارش عوض شود.
exclosive مال write است و share مال read است.
DBMS ما حل اين مشكل را با luck انجام ميدهد اگر Isolation بشود Repeat table read مشكل 2 را حل كردهايم.
ـ تمرين عملي
ابتدا وارد صفحة اصلي SQL ميشويم و در آنجا يك table درست ميكنيم بعد از ريختن اطلاعات در جدول و كامل كردن آن از منوي tools>query Analyzer وارد صفحة نوشتن query شده و در آنجا در دو صفحة مجزا دو تا ترنزكشن به صورت زير مينويسيم و با اجراي آنها نتيجه ميبينيم
1- Begin Tran
up Data student family set name = ‘aa’ where
student – TD= 12;
waite for delay “00:00:10”
roll back
2- set Transaction isolation level
Read uncommitted
Begin Tran
«گزارش كار جلسه چهارم»
عنوان:
قفلها و قفلهاي سلسله مراتبي
شرح مطالب
ـ سطوح جداسازي
1- uncommitted Read
پائينترين سطح است براي read اگر قفلي نگذاريم.
2- committed read
قفل را قبل از دستور بگذاريم و بلافاصله بعد از انجام كار برداريم.
3- repteable read
خواندن قابل تكرار
داريم
x = x0 | |
T2 | T1 |
Begin Trans | Begin Trans |
Read (x) | Write (x, x1) |
commit | Roll Back |
ـ در مورد uncommitted read
تراكنش 1 به اين نتيجه رسيده كه تغييرات را بايد برگرداند در حاليكه T2 مقدار x را خوانده كه اين خواندن درستي نيست.
اگر برنامه اول اجرا شود بعد دومي يا دمي اجرا شود بعد اولي در هر صورت T2 بايد مقدار x بخواند (خواندن كثيف) اين اولين مشكل است.
براي رفع مشكل 2 قفل ميگذاريم قفل (x) يا قفل write قفل نوشتن (يا قفل انحصاري) در آن واحد يك write بيشتر ميتواند اجرا شود.
قفل (S) shire قفل خواندن (قفل اشتراكي) چند تا خواندن با هم ميتوانيم انجام دهيم.
ـ سازگاري lockها
اگر برنامهاي بخواهد انحصاري از برنامهاي كه قفل اشتراكي دارد استفاده كند نميتواند و بلعكس.
1ـ در هنگام درخواست قفل را ميگذاريم.
وقتي برنامهاي commit ميشود قفل را برميداريم (commit يا Roll back) يعني تا انتهاي برنامه قفل را داريم.
2ـ قفل statement level قبل از دستور قفل را درخواست ميكند و ميدهيم بعد از اجراي دستور قفل را برميداريم.
ـ نكته
در SQL server هنگام نوشتن قفلي انحصاري بر روي منبع (ركودها) قرار داده ميشود و تا پايان تراكنش اين قفل باقي ميماند (در مورد writeها 100% اين قفل را داريم)
«جدول سازگاري قفلها»
اگر فرايندي قفل S داشته باشد و درخواست قفلي هم داشته باشيم قبول ميشود در واقع ديگر ناسازگاري داريم و درخواستها قبول نميشود.
x | s | |
x | √ | s |
x | x | x |
ـ در مورد committed read
اگر هنگام خواندن قفل خواند درخواست شود و دروصرت امكان قفل به درخواستكننده تحويل داده شود و پس از خواندن قفل باز پس گرفته شود مشكل خواندن ناصحيح را نداريم. (Dirty read را نداريم)
ـ در مورد repetable read
قبل از اجراي تراكنشها x = x0
T2 | T1 |
Begin Trans | Begin Trans |
Write (x, x1) | Read (x) |
commit | |
Read (x) | |
commit |
unrepetable
مشكل اين است كه وسط read يكي write ميكند و دوباره كه read ميكنيم براي x دو مقدار را خواندهايم يكي x تاثير منفي داريم.
در ابتدا قفل نداريم T1 قفل اشتراكي درخواست ميكند x0 را ميخواند T2 قفل قفل انحصاري درخواست ميكند آيا ميتواند اين كار را بكند؟
بله چون T1 قفلدارها كرده است x ما شد x1 و commit ميكند در ادامه T1 قفل را ميگذارد و ميخواند x1 پس دو مقدار read شده x0 و x1 يعني read قابل تكرار نداشتيم در اينگونه موارد بهتر است تا قفل انحصاري بگذاريم تا مشكل حل شود.
بايد قفل shire بگذاريم تا مطمئن شويم كسي نميآيد آن را عوض كند.
توجه
ـ در مورد write قفل را ميگيرد و تا آخر نگهداري ميكند.
ـ در مورد read اگر نتواند قفل بگذارد مشكل uncommitted read
ـ اگر قفل بگذارد و بعد رها كند committed read
ـ اگر قفل را بگذارد و تا آخر تراكنش نگهدارد repteable read
هر چه به سطح پائينتر ميآئيم احتمال انجام تراكنشها كمتر ميشود ولي امنيت بيشتر و safe تر ميشود.
اين سطوح را سطوح جداسازي يا isolation گويند.
هر جدول page از تعدادي صفحه تشكيل شده است كه ركوردها در داخل ؟؟ها قرار گرفتهاند.
pageها معمولاً مضربي از سكتور (اصطلاح سختافزاري) است.
ـ سطوح قفلها
ركورد 1
ركورد 2 صفحه 1
ركورد 3 صفحه 2 جدول
صفحه 3
ميتوانيم يك صفحه را قفل كنيم اگر يك ركورد مشكل داشت ميتوانيم يك ركورد را قفل بگذاريم نيازي نيست كه كل صفحه را قفل بگذاريم اگر تعداد قفلها از %50 ركوردها بيشتر شد بهتر است كل جداول را قفل بگذاريم تا هزينه كمتر شود.
هر 8 صفحه در كنار هم را extent گوئيم كه pageهاي هر extent در كنار هم ذخيره ميشوند.
«قفل روي دادههايها»
1ـ قفل روي يك (RID) Row Indenlifir Record Record
2ـ قفل روي يك Page page
3ـ قفل روي يك extent extent
4ـ قفل روي كل جدول table
5ـ قفل روي ديتابيس DB
توجه: قفل صفر هم داريم.
قفلي صفر يا Key قفلي است كه روي اينكس (داده) يا فهرست ميگذاريم.
انواع قفلها
ـ قفل خواندن S
ـ قفل نوشتن X
ـ قفل به هنگام كردن U
قفل اول خواندن بعد نوشتن
قفلي كه ميخوانيم بعد ميخواهيم تغيير دهيم
ـ قفل schema (طرح، طراحي)
جدول را طراحي كردهايم بعد ميخواهيم ستوني را اضافه يا كم كنيم يعني طرح جدول را عوض كنيم.
ـ قفل Intation
يك ركورد را قفل كردهايم قفل x، روي كل صفحه قفل Intation ميگذاريم.
اگر خواستيم كل را بخوانيم نميتوانيم
؟؟
انواع Intation
1ـ Ix
2ـ Ix
3ـ SIx
؟؟
كلش اشتراك است shire بخشهائي از آن را ميخواهيم عوض كنيم.
«موجود»
X | SIX | IX | U | S | IS | |
* | √ | √ | √ | √ | √ | IS |
* | * | * | √ | √ | √ | S |
* | * | * | * | √ | √ | U |
* | * | √ | * | * | √ | IX |
* | * | * | * | * | √ | SIX |
* | * | * | * | * | * | X |
توجه
Update با update مشكل دارد dead like را بوجود ميآورد.
تمرين عملي
ابتدا جدول را تشكيل ميدهيم وارد بخش Query Analyzer ميشويم.
دو تا ترنزكشن مينويسيم.
1- set Transaction isolation level
read committed
begin Transaction
select * from student where id= 1;
waite for delay ’00:00:15’
commite
2- Begin Transaction
update student set name = ‘zzz’
where id = 10
ـ وقتي اجرا ميكنيم دو مقدار متفاوت ميخواند بايد تغييري ايجاد كنيم تا مشكل ما حل شود اولي را repitable read ميكنيم وقتي اجرا ميكنيم دو تا چيز يكسان ميخواند.
«گزارش كار جلسه پنجم»
عنوان: بررسي دستورات در Transaction
شرح مطالب:
دو تا اتفاق در ترنزكشن داريم
Roll back commit ترنزكشن از آغاز به حالتي كه هنوز تراكنش انجام نشده برميكشند.
commite همة اتفاقات ترنزكشن را ثبت ميكرد.
ـ اگر يك تراكنش داشته باشيم و بخواهيم بخشي از اتفاقات را برگردانيم دستور
“save point”
ناحيه 1 → OK
SAVE TRANSACTION SAVE POINT
ناحيه 2 → *
ROOL BACK TRANSACTION SAVE POINT
ناحيه 3 → OK
اين دستور باعث ميشود
كه اتفاقات قبل از save point باقي ميماند و بعد از آن rool back ميشود.
يعني ناحيه 1 و 3 commit ميشود ناحيه 2 rool back ميشود.
ـ ارتباط بين دو جدول با يك شرط (الحاق)
join
انواع مختلف joinها
F | E | D | C | B | A | |||
NN | MM | AA | 1 | CE | BB | AA | 1 | |
PP | OO | GG | 2 | FF | EE | DD | 2 | |
MM | KK | KK | 3 | II | HH | GG | 3 |
علامت * (join متقاطع) 1- cross join
T1*T2
دستور SQL
نام جدول 2 Cross join نام جدول 1 select * from
دستورات SQL را در بخش Query Analyzer مينويسيم و ميتوانيم با اجراي آن جواب را رؤيت كنيم.
ـ نتيجه
F | E | D | C | B |
A |
|
nn | mm | aa | cc | bb | aa | 1 |
pp | oo | gg | cc | bb | aa | 2 |
nn | mm | aa | ff | ee | dd | 3 |
pp | oo | gg | ff | ee | dd | 4 |
nn | mm | aa | ii | hh | gg | 5 |
pp | oo | gg | ii | hh | gg | 6 |
دستور SQL
انتخاب سطر S (selection)
اول ضرب ميكنيم بعد selection انجام ميدهيم: انتخاب ستون (projection)
ـ نتيجة دستور SQL فوق انتخاب سطرهاي 1 و 6 از جدول فوق ميباشد.
3- INNER JOIN
دستورات
«نماد رياضي»
انجام عمليات از داخل به خارج
ـ نتيجه
F | E | C | B | A | |
nn | mm | cc | bb | aa | 1 |
pp | oo | ii | hh | gg | 6 |
يادآوري
براي مرتب كردن افزايشي يا كاهشي ركوردها استفاده ميكرديم از
افزايشي order by (ASN)
كاهشي (DESC)
كه آن را بعد از where قرار ميداديم.
4- outer join
دستور SQL
Select * from T1 left outer join T2 on T1A= T2D
سطرهائي از جدول T1 را كه در شركت كرد در T2، Null ميگذاريم.
علامت
right يا left
نتيجه
F |
E | D | C | B | A | |
nn | mm | ee | cc | bb | ee | 1 |
pp | oo | gg | ii | hh | gg | 2 |
Null | Null | Null | ff | ee | dd | 3 |
mm | ll | kk | Null | Null | Null | 4 |
براي full هر چهار سطح فوق را داريم
ـ joineهاي نتيجه هم داريم:
– semi join
از هر كدام از جداول آنهائي كه در join شركت كردهاند را برميداريم و مينويسيم
– aunty
آنهائي كه در join شركت نكردهاند را به ما ميدهد.
ـ مفهوم self join
ادغام شدن يك جدول با خودش
معمولاً در ساختارهاي سلسله مراتبي با اين مفاهيم برخورد ميكنيم به عنوان مثال رابطة كارمندي و ريش كه زيس خودش كارمند به حساب ميآيد.
mid | address | name | Id |
0 | B | A | 1 |
1 | D | C | 2 |
1 | F | E | 3 |
2 | H | G | 4 |
2 | J | I | 5 |
3 | L | K | 6 |
ـ ميخواهيم ببينيم كه يك فرد رئيش چه كسي است؟
جدول فوق را بايد با خودش ارتباط دهيم.
دستور SQL
Select *
From Employee e1, Employee, e2
Where e1. mid = e2. id
براي جواب آنهائي انتخاب ميشود كه id = mid باشد.
ـ اگر بخواهيم ببينيم رئيس كل چه كسي است؟
اضافه ميكنيم:
and e1. mid < > 0
«گزارش كار جلسه ششم»
عنوان:
ادامة lockها
شرح مطالب:
Lock hintها
1- Hoid lock
معادل Repatable است
(lock hint) نام جدول select * from: نحوة كاربرد: دستور SQL
در جلوي نام جدول با استفاده از كلمة with ميتوانيم lock hint و مدت زمان آن را بنويسيم و كاري به isolation level ندارد.
پس hoid lock يك قفل shared را تا آخر تراكنش نگه ميدارد.
2- No lock
قفل shared روي جداول قرار نميدهد (فقط روي select)
3- paglock
رشد lock را معلوم ميكند.
قفل بر روي صفحات يك جدول ميگذارد
READ Committed
معادل قفل shared را هنگام خواندن درخواست كرده و سپس آن را رها ميكند.
5- READ PAST
قفل مربوط به سطرها را ناديده ميگيرد و در مدل Read committed كار ميكند و روي دستور select قابل اعمال است.
6- READ uncommitted
معادل Nolock است يعني روي جداول قفل shard قرار نميدهيم.
7- Repeat able read
قفل را تا آخر تراكنش نگه ميدارد.
8- row lock
قفلها را در سطح سطرها قرار ميدهد.
9- serializ albe
معادل Hoid lock بعلاوة قفل روي ايندكسها.
10- Table lock
قفلها را روي جداول قرار ميدهد.
Shard lock ميگذارد. (read)
ميتوانيم قفل جدولي بگذاريم و تا آخر تراكنش هم نگه داريم.
نكته:
ميتوانيم hoid lock + tab lock را استفاده كنيم.
بعد از with هر دو قفل را با كاما، ميآوريم.
11- Tab lock *
قفل انحصاري روي جدول قرار ميدهد (write امرت)
12- UPD Lock
از قفل read قويتر و از write ضعيفتر است (هابين)
در ابتدا رفتارش مثل قفل read است بعداً (پس از تغيير و up date) رفتارش مانند قفل write ميشود.
يك قفل بهنگام سازي up date روي يك سطر جدول يا صفحه قرار ميدهد.
13- * lock
يك قفل انحصاري قرار ميدهد.
نكته: قفلهائي كه باعلامت ؟؟ مشخص شدهاند براي بيان درشتي lock هاست و بقيه قفلها ؟؟
بررسي دستورات زير روي قفلها:
Insert |
Delet | Update | |
1- Hoid lock | √ | √ | √ |
2- No lock | — | — | — |
3- PAG lock | √ | √ | √ |
4- READ committed | √ | √ | √ |
5- READ PAST | — | — | — |
6- READ uncommitted | — | — | — |
7- Repeat able read | √ | √ | √ |
8- Row lock | √ | √ | √ |
9- serizliz able | √ | √ | √ |
10- TAB lock | √ | √ | √ |
11- TAB lock * | √ | √ | √ |
12- UPD lock | √ | √ | √ |
مثال:
Set Transaction isolation level Repatable Read
Select * from student with (No lock)
تراكنش over ride يا ملغي ميشود.
With (Hoid lick, Tab lock)
ـ را اگر اجرا كنيم.
– exec sp-lock
lock ها را به ما نشان ميدهد (برميگرداند)
البته نام جدول را به ما نميدهد بلكه شناسة جدول را ميدهد كه عددي است.
(شناسة شي) select object- name ـ
از اين جا شناسه را ميدهيم جدول را به ما ميدهد.
ـ dead lock يا بنبست:
T2 | T1 |
x lock (B) | x lock (A) |
x lock (A) | x lock (B) |
B را ميخواهد چون آزاد نيست write را ميخواهد T2 را رها نميكند. چون در waite است. اينجا بنبست بوجود ميآيد بايد يكي از تراكنش roll Back كند.
ـ اولويت Dead lock priority
اگر يكي از تراكنشها Low باشد و ديگري Normal تراكنشي كه Low است از بين ميرود و در اينجا خطاي 05 را برميگرداند تراكنش با اولويت پائينتر قرباني ميشود.
Set lock time out
وقتي قرار است lock را تقاضا كنيم تا ابد نميتواند منتظر بماند و اين زماني است كه ميشود منتظر ماند.
اصلاَ منتظر نميماند. | |
به اندازة عدد صبر ميكند. | |
تا ابد منتظر ميماند. |
تمرين عملي:
جداول را ميسازيم وارد بخش queryanalyzer ميشويم:
Set Transaction isolation level repeatable read
Begin transaction
Select * from student with (table lock)
Waite for delay ’00:00:15’
commit
يك پنجره ديگر باز ميكنيم (صفحة جديد)
Exec sp-lock
با اجراي ميكنيم جدولي ميآيد كه lockها را نشان ميدهد.
Select object – name
و در پائين جدول student را ميدهد.
بررسي dead lockها
ابتدا دو تا جدول درست ميكنيم و در query analyzer مينويسيم.
1- set Transaction isolation level repeatable
begin transaction
select * from student 1 with (x lock, tab lock, hold lock)
wait for delay ’00:00:15’
select * from student 2 with (x lock, tab lock, hold lock)
commit
2- set transaction isolation level repatable
beg transaction
select * from student 2
گذاشتن يا نگذاشتن اين خط فرقي ندارد.
[wait for delay ’00:00:15’]
select * from student1
commit
اول شمارة (1) را اجرا ميكنيم بعد از اينكه 2 را اجرا كرديم error ميدهد 1205 error يعني tran در dead lock افتاده است.
تغييراتي كه روي دو تا برنامه ايجاد ميكنيم.
در tran 1 اضافه ميكنيم در خط اول:
Set dead lock- priority low
در tran 2 در خط اول آن اضافه ميكنيم:
Set dead lock- priority normal
ميبينيم كه اولي را اجرا نميكند و دومي را اجرا ميكند.
وقتي اولويتهاي هر دو low يا normal است هر كدام كه ديرتر آمده است (كمتر استفاده كرده) آنرا از بين ميبرد.
براي بررسي روي جداول روي برنامة جدول 1 مينويسيم.
Set lock time out 0
روي برنامه جدول 2 مينويسيم.
Set lock time out 2
خواهيم ديد با اجراي آنها 1222 error را خواهد داد.
(گزارش كار جلسه 7)
عنوان: joine hint
شرح مطالب:
– Nested loop
ـ Querry analyzer براي join از آن استفاده ميكند.
در اين روش همة ركوردها را روي فيلدي كه قرار است join انجام شود. روي عمل مورد نظر تست ميكنيم.
يك ركورد از يك table گرفته و براساس شرط join با همة ركوردهاي table ديگر بررسي كرده و در خروجي نشان ميدهيد.
اگر جدول دوم بزرگ باشد اين روش خيلي جالب نيست هزينة آن بالاست.
در بهينه سازي اينكه از كدام روش استفاده كنيم آنرا Query Aptimaizer مشخص ميكند و انجام ميدهد.
اگر ما خودمان مشخص كنيم انتخاب ما را انجام ميدهد يا با توجه به سطح جداسازي isolation levelها خودش انتخاب كند.
پس hintها راهنما هستند.
– Sort merg
روش sort كردن و Merg كردن
اول جداول را مرتب ميكنيم بعد آنها را ادغام ميكنيم (ادغام كردن با بررسي كردن تك تك ركوردها انجام ميگيرد.)
– hash joine
از تابع hash استفاده ميكنيم.
“Security”
ما معمولاً يك user داريم كه وصل ميشود و به سيستم logine ميكند پس يك logine, accunt loginge شدن را داريم
ما دونوع mode داريم.
1ـ mine mode اضافه بر userهاي ويندوز SQL هم ميتواند براي خودش جدا تعريف كند.
2ـ windows mode فقط loginهاي ويندوز است.
هر user هم يك سري خصوصيات password, username دارد.
يك سريي object داريم user ميتواند مستقيم به objectها دسترسي داشته باشد يا عضو يك گروهي باشد كه از طريق آن به objectها دستيابي داشته باشد.
يا اين گروه از طريق يك گروه بزرگتر به object دسترسي داشته باشد.
شكل؟؟
user يك كاربر ميتواند عضو يك يا چند گروه و هر گروه ميتواند زير مجموعة چند گروه ديگه باشد شامل چند گروه ديگر و هر گروه ميتواند access داشته باشد به objectهاي ديگر.
در SQL به گروهها نقش يا Role ميگوئيم.
براي ساده شدن مديريت گروهها را تعريف ميكنيم.
در مسائل مديريتي نقشها مطرح شده و ارتباط آن هم بيشتر با سلسله مراتبسازماني است. هر ديتا بيش يا هر server يا هر instance يك سري نقشهاي Defult داريم كه از قبل تعريف شده و وجود دارند و احتياج به نصب آن نيست پس ما يك سري systemrule داريم.
ـ نقشهائي كه در سطح كل مديريت SQL server مطرح است (نه مديريت ديتابيسها)
1- sys admin
هر فعاليتي را روي SQL ميتوانيم انجام دهيم حقوق اين نقش تمام حقوق نقشهاي ديگر را در خود دارد بالاترين حقوق را sys admin دارد.
2- server admin
وظيفة آن تنظيم يا تعيين تنظيمات server است.
3- setup admin
اين نقش قابليت تعيين و تنظيم server شده را دارد.
ـ Link server:
هر SQL ميتواند با SQLهاي ديگر تبادل (ارتباط) اطلاعات كند Link سرور يك روش ايجاد اين ارتباط است كه بتوانيم serverهاي بزرگتري را بوجود آوريم (اين مباحث مربوط به Dister buted DB يا ديتا بيسهاي توزيع شده است.)
4- security admin
logineهاي server را مديريت ميكند.
5- process admin
فرآيندهائي كه در يك instance وجود دارد مديريت ميكند.
6- db creator admin
توليد و تغيير يك پايگاه داده را به عهده دارد.
7- disk admin
مديريت فايلهاي Disk را به عهده دارد.
ميتواند فايلها را جا به جا كند و backup بگيرد.
8- bluk admin
دستور bluck را اجرا ميكند وقتي كه مقدار زيادي ركورد را بخواهيم insert كنيم.
هرگاه ديتابيس را ايجاد كنيم 9 نقش را از پيش تعيي شده در آن توليد ميشود اين نقشها عبارتند از:
1- db-owner
هر كاربردي كه عضو db-owner باشد ميتواند حق انجام هر گونه كاري را در ديتابيس داشته باشد مثلاً ايجاد اشياء جديد، تغيير تنظيمات پايگاه و …
2- db- access admin
كاربري كه عضوي اين نقش است قادر به اضافه كردن يا حذف گروهها و كاربران ميباشد.
3- db- Data reader
كاربري كه عضو اين نقش است تمام دادهها را از تمام جداول كاربران در پايگاه داده را ميتواند بخواند.
4- db- ddl admin
كاربري كه عضو اين نقش است قادر به اضافه كردن، تغيير دادن يا حذف داده از تمام جداول پايگاه در پايگاه است.
5- db- ddl admin
كاربري كه عضو اين نقش است قادر به اجراي تمام دستورات ddl (data difimition larg زبان تعريف دادهاي) مثل اضافه كردن، تغيير دادن و يا حذف اشياء ميباشد.
6- db- security admin
كاربري كه عضو اين نقش است ميتواند نقشها و اعضاي آنها را و نيز حقوق هر يك را بر دستورات و اشياء موجود در پايگاه داده مديريت نمايد.
7- db- backup operator
كاربري كه عضو اين نقش است حق پشتيبان گرفتن از دادههاي پايگاه داده را دارد.
8- db- deny data reader
كاربري كه عضو اين نقش است حق خواندن از پايگاه داده را ندارد.
9- db- deny data writer
كاربري كه عضو اين نقش است حق ايجاد تغيير در پايگاه داده را ندارد.
«نقش عمومي» publick
نقشي است كه به هر كاربري در پايگاه داده ميشود پس اگر بخواهيم حقي را به همه بدهيم يا از همه بگيريم اين نقش را به publick اعمال ميكنيم.
اعطاي حق با دستور به گروه خاص
GRANT select on نام جدول to publick
مثال: ميخواهيم حق Delet, up date, inset را به اجرا بدهيم.
GRANT Delet, up date, insert on
Student to user 1, user 2 with GRANT option
نكته 1ـ به جاي ميتوانيم قرار دهيم All يعني همة حقوق را.
2ـ اگر GRANt option را داشته باشيم يعني اين حقوقي كه به user 1, 2 دادهايم آنها ميتوانند به بقيه همه واگذار كنند.
حقي كه با GRANT داديم با اين ميگيريم. Re worke of
(گزارش كار جلسه 8)
عنوان: ايندكس index
شرح مطالب:
در DB ساختار درخت متوازن داريم يعني درختي كه از ريشه تا برگ Blance است يعني عمق درخت براي هر يك از برگها برابر است يا حداكثر يك اختلاف دارد. وقتي درخت متوازن است سرعت دستيابي بالا ميرود. مثل hipetree كه درختي متوازن است.
وقتي يك درخت binery tree در نظر ميگيريم در هر گرهاي بيش از يك عنصر وجود دارد.
در درختهاي متوازن
؟؟
هر نود دوتا اشارهگر در دو سمت خودش دارد اشارهگر چپ به يك نود ديگر اشاره ميكند.
به همين ترتيب قضيه ادامه دارد.
ـ چرا به آن Blance Tree ميگوئيم.
چون اولي نود ريشه بعدي فرزندان و در نهايت به برگها ميرسيم.
هر كدام از نودها مياني اشارهگر به نود بعدي دارند(در هر سطر به صورت زنجيرهاي) يعني در هر سطر بين نودها ميتوانيم حركت كنيم.
در نهايت هر كدام از اشارهگرها به ركورد بعدي ميرسد.
استفاده از ايندكسها سرعت افزايش در دسترسي به ركوردها را امكان پذير ميكند.
حتماً 50% از درختهاي B tree بايد پر باشد.
B* 75% بايد پر باشد.
B+ 50% بايد پر باشد.
هر چه درخت كوتاهتر يعني پرتر است و سرعت دسترسي بيشتر است.
ما دو نوع index tree داريم:
1ـ claster كدام است:
اگر كه براساس فيلدها جداول مرتب باشد و ما ايندكس را روي فيلد منظم بگذاريم كدام است.
2ـ nonclaster:
در غير صورت فوق نان كدام است.
اگر كداستر ايندكس داشته باشيم در نهايت برگهاي ما همان صفحات دادهاي جدول است. در غير اينصورت اول بايد تمام ركوردها مثلاً نامهايشان را استخراج كنيم. چون نامرتب است يعني ابتدا آنها را براساس نام مرتب ميكنيم و بعد يك اشارهگر به هر كدام افزوده يعني در واقع يك سطح اضافه كردهايم. و ايندكسها را روي كليدهاي مرتب قرار ميدهيم.
اول مرتب ميكنيم و در كنار آن يك اشارهگر به محل واقعيشان ميگذاريم يعني اين لايه اضافه شده است. (در nonclasterها)
پس nonclaster ها هزينه بيشتر دارند.
؟؟
نكته: در SQL يك c;aster omdex ميتوانيم بزنيم.
و 249 تا nonclaster index داشته باشيم.
در index چون ركوردها زياد و منظم است وقتي ميخواهيم ركوردي اضافه كنيم بايد همة ركوردها را shift دهد كه هزينه را بالا ميبرد.
وقتي ميخواهيم در claster index بگذاريم چون برگها pageهاي ما است ميتوانيم از پارامتر درصد پرشدن برگها براي آن استفاده كنيم يك تا صددرصد.
پارامتر درصد پرشدن برگها
ـ يك پارامتر به نام pad option داريم كه اگر تيك خورده باشد (چك شده باشد) آن درصدي كه براي برگها زده بوديم براي نودهاي مياني هم استفاده ميكنيم اين كار باعث ميشود كه splide نشود يعني ركوردهائي كه ميخواهيم اضافه كنيم دو تيكه نشود يعني اين تغييرات تا پدر آنها هم اعمال شود.
ـ گزينة يونيك (unique) گزينهاي است كه تكراري نميتواند باشد يعني يكتائي مقدار دارد اگر در index باشد نميتواند آن را اضافه كنيم.
ـ گزينة IGNORI DVP-key اگر اين را چك نكنيم (انتخاب نكرده باشيم) و ركورد يا كليد تكراري را insert كنيم كل تراكنش Roll Beek ميشود. ولي اگر آن را √ تيك زده باشيم كل تراكنش Roll back نميشود فقط گزينه تكراري كه انتخاب كردهايم كنسل ميشود.
روي فيلدهاي شرايط جستجو اگر ايندكس بگذاريم باعث افزايش سرعت ما ميشود.
ـ اطلاعات آماري:
به همراه هر ايندكس اطلاعات آماري وجود دارد قراردادن ايندكس بر روي آنهائي كه پراكندگي بيشتري دارند مناسبتر است.
ايندكس زدن روي توزيع يكنواخت و unique مقادير مناسب است.
لینک های مرتبط دیگر :
گزارش کارآموزی در پیش دبستانی و مهدکودک خجسته