‫انتقال دیتابیس bugnet به MS SQL 2008

bugnet (نرم‌افزار issue tracking دات‌نتی) را در جایی نصب کرده بوده و دیتابیسش را در SQL Server 2005 Express قرار داده بودم. به دلایلی تصمیم گرفتم دیتابیس را به نسخه‌ای از MS SQL 2008 منتقل کنم. یک دیتابیس خام با استفاده از installer باگ‌نت درست کردم و سعی کردم دیتا را از SQL 2005 Express به آن export کنم اما به خطاهایی برخورد کردم و موفق نشدم. به همین دلایل از روال دیگری برای انتقال دیتا استفاده کردم:

۱- یک دیتابیس خالی ساختم و دیتای قبلی را با استفاده از امکان Export به آن کپی کردم.
۲- روال Export قدرت تشخیص viewها را نداشت. در صفحه انتخاب جداول باید تیک viewها برداشته شود.
۳- باگ‌نت را به دیتابیس جدید وصل کردم. اولین خطایی که دیده می‌شد خطای Could not find stored procedure ‘BugNet_HostSetting_GetHostSettings’. بود.
۴- یک دیتابیس خام و خالی را با کمک installer باگ‌نت ساختم.
۵- با استفاده از گزینه Tasks – Generate Scripts دیتابیس مرحله قبلی را انتخاب کرده و گزینه‌های Stored Procedures و Views را انتخاب کنید.
۶- اسکریپت حاصله را در دیتابیس مرحله اول که همان دیتابیس اصلی است اجرا کردم. اصلاح use database نباید فراموش شود.
۷- یک بار خطای Item has already been added. Key in dictionary: ‘AdminNotificationUsername’ Key being added: ‘AdminNotificationUsername’ را دیدم. علت آن installer بود. که رکوردهای جدول HostSettings را duplicate کرده بود. رکوردهای تکراری این جدول باید پاک می‌شدند.
۸- اگر مقدار InstallationDate در AppSettings وجود نداشته باشد رکوردهای تکراری مجدداً اضافه می‌شود.
۹- همه مراحل اینجا را می‌شد یک جور دیگر هم انجام داد. ایجاد دیتابیس آماده توسط باگ‌نت، پاک کردن فقط جداول آن، export داده از دیتابیس حاوی داده‌ها.
۱۰- از اینجا به بعد مشکل login کردن وجود دارد. bugnet از ASP.NET Membership استفاده می‌کند. پس با کمی شناخت از مدل ASP.NET به راحتی می‌توان مشکلات login و کاربری را حل کرد.

مشکل دیتابیس در سرورهای اشتراکی

در سرورهای اشتراکی، از همان‌هایی که در ایران خیلی رایج هستند و قیمتی زیر ۱۰۰ هزار تومان در سال دارند، همیشه محدودیت در دیتابیس وجود دارد. بیشتر سرویس‌ها اجازه بیش از یکی دو تا دیتابیس MS SQL Server را نمی‌دهند، آن یکی دو تا هم گاهاً نسخه‌های قدیمی MS SQL Server هستند. علاوه بر اینها محدودیت‌های شدید حجمی هم برای دیتابیس وجود دارد. با این که MySQL رایگان است ولی مشابه همین محدودیت‌ها در رابطه با MySQL هم وجود دارد.

در ادامه چند راه جایگزین را بررسی می‌کنیم:

۱- استفاده از دیتابیس‌‌های Embed مثل Sqlite
۲- استفاده از فایل Access با کمک ODBC
۳- استفاده از MS SQL Server Express در صورت وجود در Web Server
۴- خرید VPS و نصب دیتابیس MS SQL Server Express به طور قانونی و MS SQL Server غیر Express به طور غیر قانونی
۵- تبدیل کامپیوتر منزل یا شرکت به یک سرور کوچک با اجاره ماهیانه IP Static از ISPها و نصب MS SQL Server مشابه مورد قبل
۶- خرید MS SQL Host از شرکت‌های خارجی
۷- استفاده از MS SQL Hostهای مجانی

همه این راه حل‌ها یک محدودیت مشترک دارند. آن هم ناسازگاری برنامه‌های مختلف با دیتابیس‌های مختلف و محدودیت‌های فنی در تکنولوژی‌های دسترسی به دیتابیس است. مثلاً برنامه BugNET نمی‌تواند با Access کار کند. برنامه ‌BlogEngine.NET هم نمی‌تواند با Sqlite کار کند. در مورد محدودیت‌های فنی می‌توان به عدم امکان استفاده از دیتابیس‌های غیر MS SQL Server با Entity Framework اشاره کرد. در مورد استفاده از VPS یا IP Static هم باید دقت کرد که این سرویس‌ها باید uptime واقعاً بالا داشته و از پهنای باندی خوبی استفاده کنند. در مورد نسخه‌های غیر قانونی هم نمی‌توان خیلی مطمئن بود. چون ممکن است سرور مورد نظر به خاطر عدم رعایت Copyright بسته شود. در مورد خرید Host از شرکت‌های خارجی می‌توان خوشحال بود که قیمت تمام شده آنها خیلی پایین‌تر از قیمت شرکت‌های داخلی است. از Hostهای مجانی هم می‌شود استفاده کرد ولی هم مشکل عدم اطمینان وجود دارد و هم مشکل کمبود امکانات فنی مثل نبود امکان ‌Backup/Restore.

مروری بر مفاهیم بانک اطلاعاتی

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

integrity – جامعیت
صحت داده‌ها، مثلاً موجودی حساب بانکی منفی نباشد

Domain Integrity – جامعیت دامنه‌ای
یعنی تمام صفات در تمام رابطه‌ها از نوع دامنه خود باشند. مثلاً تعداد فرزندان یک شخص نباید اعشاری باشد.

Intra-relation Integrity – جامعیت درون رابطه‌ای
یعنی هر رابطه‌ای به تنهایی صحیح باشد. مثلاً همه کلیدهایش درست باشد.

Referential Integrity – جامعیت ارجاع
یعنی کلید خارجی درست تعریف شده باشد. مثلاً کلید خارجی یک رابطه حتماً در رابطه دیگر کلید باشد.

consistency – هم خوانی
اطلاعات مختلف سیستم با هم در تضاد نباشد. مثلاً نام شخص در جاهای مختلف سیستم یکی باشد.

impedance mismatch – ناهمگونی مانع
همان تفاوتی که بین زبان SQL و C#‎ وجود دارد و ORMها مدعی حل آن هستند.

Super Key – ابرکلید
هر ترکیبی از صفت‌ها که خاصیت کلید داشته باشد. این کلید کمینه نیست. یعنی زیر مجموعه‌ای از آن هم می‌تواند کلید باشد. مثل «شماره دانشجویی» و «شمار دانشجویی و نام دانشجو»

Candidate Key – کلید کاندید
هر ترکیبی از صفت‌ها که کلید کمینه باشد. یک رابطه ممکن است چند کلید کاندید داشته باشد.

Primary Key – کلید اصلی
یکی از کلیدهای کاندید است که توسط مدیر بانک اطلاعات انتخاب شده.

Alternative Key, Secondary Key – کلید فرعی
یکی دیگر از کلیدهای کاندید است که برای برخی کاربردها انتخاب می‌شود.

Foreign Key – کلید خارجی
صفتی است در یک رابطه که در رابطه‌ی دیگری کلید اصلی (یا فرعی) است و برای برقراری ارتباط بین دو رابطه استفاده می‌شود.

Projection پرتو
انتخاب تعداد محدودی از ستون‌ها نه همه آنها

Having
اعمال شرط روی دستورات Group By

Normalization – نرمال سازی
از بین بردن افزونگی داده‌ها (Data Redundancy) با استفاده از فرم‌های نرمال‌سازی 1NF، 2NF و 3NF و گاهی اوقت BCNF

ضرب دکارتی
select * from city, country

join و inner join
هر دو یکی هستند. به معنی پیوند دو جدول با لحاظ شرط مربوطه

left join و left outer join
هر دو یکی بوده و مثل inner join عمل می‌کند منتها سمت چپ رابطه را همیشه می‌آورد حتی اگر به ازای آن چیزی وجود نداشته باشد.

right join و right outer join
برعکس right join

full outer join
ترکیب left join و right join

منابع:

‫نگهداری داده‌های حجیم در MS SQL

در خانواده MS SQL نسخه‌های ۲۰۰۰، ۲۰۰۵ و ۲۰۰۸ تعدادی فیلد خاص برای کار با داده‌های حجیمی مثل عکس یا متون خیلی طولانی وجود دارد. هر کدام از اینها شرایط خاص خودشان را دارند که در ادامه بررسی خواهند شد.

char و varchar: حداکثر ۸۰۰۰ کاراکتر

varchar(max)‎: حداکثر ۲ میلیارد کاراکتر – این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

nchar و nvarchar: حداکثر ۴۰۰۰ کاراکتر (به طور کلی ظرفیت انواع یونیکد نصف انواع غیر یونیکد است)

nvarchar(max)‎: حداکثر ۱ میلیارد کاراکتر – این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

binary و varbinary: برای داده‌های غیر متنی و حداکثر ۸۰۰۰ بایت

varbinray(max)‎: برای داده غیر متنی و حداکثر ۲ گیگا بایت.

text: حداکثر ۲ میلیارد کاراکتر – این نوع داده قرار است به زودی حذف شود.

ntext: حداکثر ۱ میلیارد کاراکتر – این نوع داده قرار است به زودی حذف شود.

image: حداکثر ۲ گیگا بایت – این نوع داده قرار است به زودی حذف شود.

FileStream: نوعی ارتباط بین MS SQL و سیستم فایل ویندوز یعنی NTFS – این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

Xml: نگهداری اطلاعات به صورت Xml – این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

توصیه خود مایکروسافت برای نگهداری داده‌های حجیم استفاده از سه نوع varchar(max)‎ و nvarchar(max)‎ و varbinary(max)‎ است. زیرا انواع text و ntext و image دیگر پشیبانی نشده و در نسخ آتی MS SQL برداشته خواهند شد. جهت کسب اطلاعات بیشتر به اینجا و اینجا مراجعه کنید.