مشکل نصب SQL Server 2005

 

در بسیاری از موارد، پس از نصب این برنامه مشاهده نمودم که ابزارهای سمت کلاینت (Client Tools) از قبیل Sql Server Management Studio و Documentations و غیره نصب نشده اند.

در ابتدا تصور می کردم که هنگام نصب این برنامه بی دقتی کرده ام ولی با تکرار این موضوع متوجه شدم که اشکالی در کار وجود دارد.

جالب اینجا بود که هنگامی که DVD این برنامه را مجددا اجرا می کردم و قصد داشتم که مواردی را که نصب نشده بود نصب کنم، برنامه به من اعلام می کرد که تمامی موارد نصب شده اند! در حالی که این موضوع صحت نداشت.

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

تا اینکه سرانجام به سراغ گوگل رفتم و به جستجوی علت این موضوع پرداختم.

در ابتدای جستجو متوجه شدم که این مشکل برای عده زیادی از افراد به وجود آمده و مختص من نیست.

پس از طی چند دقیقه متوجه شدم که این مشکل معمولا برای افرادی به وجود آمده که ابتدا برنامه Visual Studio را نصب نموده اند و سپس به سراغ نصب برنامه SQL Server 2005 رفته اند.

سرانجام به نتایج زیر رسیدم.

پس از نصب برنامه Visual Studio اگر شما نصب گزینه SQLExpress را نیز انتخاب کرده باشید، این برنامه یک پوشه به نام Tools در مسیر زیر ایجاد خواهد نمود. (در این مقاله من فرض کرده ام که برنامه را در درایو C نصب نموده اید)

C:\Program Files\Microsoft SQL Server\90

سپس هنگام نصب نرم افزار SQL Server 2005 ، فایل Setup وقتی متوجه می شود که پوشه tools در این مسیر وجود دارد، فرض را بر این می گذارد که ابزارهای سمت کلاینت از قبیل Sql Server Management Studio نصب شده اند و دیگر این ابزار ها را نصب نمی کند!

البته باید ذکر کنم که شاید این مشکل مربوط به نسخه ای که من نصب می کنم باشد و در نسخه های جدید تر، این مشکل را مایکروسافت رفع نموده باشد.

لذا راه حل زیر جهت رفع این مشکل پیشنهاد می شود.

مشکل:

پس از نصب نرم افزار SQL Server 2005 متوجه شده اید که ابزارهای سمت کلاینت از قبیل Sql Server Management Studio نصب نشده اند.

راه حل :

معمولا داخل فولدر نسخه مورد نظر برنامه در DVD یا CD شما (من نسخه  SQL Server 2005 Developer Edition را استفاده می کنم) دو فولدر به نام های Servers و Tools وجود دارند.

داخل پوشه Servers فایل های مروبط به نصب برنامه وجود دارد ولی ما با پوشه Tools کار داریم.

به داخل فولدر های زیر رفته و فایل SqlRun_Tools.msi را اجرا نمایید.

Tools\Setup\

پس از جرای این فایل پس از چند لحظه با دیالوگ زیر مواجه خواهید شد.

گزینه Change Installed Components را انتخاب نموده و با خیال راحت به نصب موارد ناقض SQL Server 2005 بپردازید.

 


مقایسه دستورات DELETE و TRUNCATE

 

  • دستور TRUNCATE بر خلاف دستور DELETE نمی تواند دارای شرط باشد. به عبارت دیگر شما نمی توانید عبارت WHERE را همراه این دستور بکار ببرید.
  • دستور TRUNCATE به صورت کمینه (Minimally) لاگ می شود در حالیکه دستور DELETE به صورت کامل لاگ می شود. بنابراین دستور TRUNCATE بسیار سریع تر از دستور DELETE عمل می کند. به طوریکه اگر جدول مورد نظر شامل میلیون ها رکورد باشد، با استفاده از دستور TRUNCATE ظرف چند ثانیه کل داده ها حذف می شوند در صورتی که با استفاده از دستور DELETE این عمل می تواند دقیقه ها و حتی ساعت ها طول بکشد.
  • اگر جدول ما حاوی فیلدی از نوع Identity باشد، پس از اجرای دستور TRUNCATE مقدار این فیلد Reset شده و به مقدار اولیه خود برمی گردد، در حالی که در مورد دستور DELETE چنین نیست.
  • اگر جدولی که قصد داریم داده های آن را حذف کنیم، توسط جداول دیگر ارجاع گرفته شده باشد یعنی فیلد کلید اصلی این جدول در جداول دیگری به عنوان کلید خارجی مورد استفاده قرار گرفته باشد، دیگر نمی توان از دستور TRUNCATE جهت حذف داده های این جدول استفاده نمود. حتی اگر جداول دیگر خالی بوده باشند و یا حتی اگر کلید های خارجی را غیر فعال (Disable) کنیم، باز هم نمی توانیم از دستور TRUNCATE استفاده کنیم و حتما باید روابط (Relations) را حذف کنیم تا بتوانیم از این دستور استفاده بکنیم. به طور مثال اگر جداول Order و OrderDetais را در نظر بگیریم، تا زمانی که بین این دو جدول رابطه وجود دارد، نمی توان دستور TRUNCATE رو روی جدول Order اجرا نمود.
  •  


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

     

    دستور زیر این امکان رو میسر می کنه :


    SELECT sum (sysindexes.Rows)
    FROM
        sysobjects
        INNER JOIN sysindexes
        ON sysobjects.id = sysindexes.id
    WHERE
        type = 'U'
        AND sysindexes.IndId < 2

     

     


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

     

    دستور زیر می تونه نام تمام جدولهای دیتابیس رو نمایش بده :

    SELECT table_name FROM INFORMATION_SCHEMA.TABLES

    در ضمن این دستور ثابته و هیچ چیزش رو نباید تغییر بدین

     


    كاربرد xp_cmdshell در sqlserver

     

    فرض كنید شما یك بانك اطلاعاتی بسیار مهم بر روی یك سرور دارید. اولین روشی كه معمولا برای حفاظت از اطلاعات بانك به ذهن می رسد backup  گیری از database می باشد. خب شما معمولا می روید و عملیات backup را در یك job تعریف می كنید و sql server هم بر اساس زمان بندی job شما از database عملیات backup گیری را انجام می دهد. تا اینجا مشكلی نیست اما اگر بروید و در مسیری كه فایل  backup را نگهداری می كنید مشاهده می كنید كه شما فقط یك فایل backup  دارید و در حقیقت sql server  همه backup ها را در همان فایل نگهداری می كند. خب شما اگر فقط به همین یك فایل اكتفا كنید چه پیش خواهد آمد
    اگر از backup گیری full استفاده می كنید پس از مدتی حجم این فایل بسیار بزرگ شده و شما مجبور هستید برای كاهش حجم این فایل  را جدا كرده و تغییر نام دهید یا فایل را ازآن مسیر برداشته و در جای دیگر كپی كنید. اگر فقط از BACKUP گیری نوع TRANSACTION LOG استفاده می كنید شما مجبور هستید همیشه فایل اولیه را نگه داشته و هرچه زمان طولانی تر شود نگهداری آن هم سخت تر خواهد شد (در بانك های اطلاعاتی بزرگ)
    حال فرض كنیم بیاییم و هر backup را در یك فایل كه اسم آن حاوی تاریخ و ساعت زمان backup  گیری است ذخیره كنیم با این كار به راحتی می توانیم آنها را مدیریت كرده و آنها را طبقه بندی كنیم . به این مثال توجه كنید
    فرض كنید یك بانك با نام db_test داریم دستور backup را به این شكل می نویسیم

    BACKUP DATABASE db_test TO DISK = 'G:\bkTEST\backup.bak'

    خب حالا می خواهیم این فایل را تغییر نام دهیم كه در ویندوز با دستور RENAME می باشد اما چون در SQL همچین دستوری نداریم. جهت این كار از  xp_cmdshell  در SQL SERVER استفاده می كنیم.
    نكته مهم : این تابع در نسخه 2000 به صورت پیش فرض فعال می باشد اما در نسخه های بعدی جهت بالا بردن امنیت غیر فعال می باشد كه با دستور زیر می توانید آن را فعال كنید

    EXEC sp_configure 'xp_cmdshell', 1
    RECONFIGURE
    GO
     جهت غیرفعال كردن مجدد به جای عدد 1 عدد 0 را قرار دهید
    خب حالا نوبت به نوشتن دستورات اصلی می باشد برای گرفتن تاریخ و ساعت سیستم از دستور GETDATE استفاده می كنیم و پس از درست كردن دستور در متغیر دستورات را اجرا می كنیم

    declare @rename varchar(255)
    select @rename ='ren "G:\bkTEST\Backup.BAK" ' + 'Backup'+ 
    replace(ltrim(rtrim(convert(char(15),getDate(),2))),'.','')+'_'+
    replace(ltrim(rtrim(convert(char(12),getDate(),8))),':','')+'.bak'
    WAITFOR DELAY '00:00:05'
    exec master..xp_cmdshell @rename
    REVERT

    فرمت خروجی فایلی شبیه به صورت زیر خواهد بود

    Backup100822_050018.bak

    یعنی این فایل در تاریخ 2010/08/22 ودر ساعت 05:00:18 ساخته شده است.

    به همین شكل  BACKUP های شما از حالت تك فایلی خارج شده و می توانید مدیریت بهتری را اعمال نمایید.

     


    ذخیره تصاویر در SQL Server

     

    از کلاس HtmlInputFile  برای ساختن کنترل آپلود فایل استفاده می کنیم. مثال زیر یک فایل ASPX کامل است که به کاربر این امکان را می دهد که یک تصویر و توضیح آن را آپلود و به بانک اطلاعاتی اضافه کند . متد OnUpload تصویر و توضیح آن را در یک جدول بانک اطلاعاتی SQL Server به نام Pictures در دیتابیس MyData اضافه می کند.

    // سورس کد ذخیره تصویر در بانک اطلاعاتی

    public void OnUpload(Object sender, EventArgs e)
    {
        //
    ساختن یک byte[] از فایل ورودی
        int len = Upload.PostedFile.ContentLength;
        byte[] pic = new byte[len];
        Upload.PostedFile.InputStream.Read (pic, 0, len);

        //
    افزودن تصویر و توضیح تصویر به بانک اطلاعاتی
        SqlConnection connection = new
          SqlConnection (@"server=127.0.0.1;database=MyData;uid=sa;pwd=yourpass");
        try
        {
            connection.Open ();
            SqlCommand cmd = new SqlCommand ("insert into Image "
              + "(Picture, Comment) values (@pic, @text)", connection);
            cmd.Parameters.Add ("@pic", pic);
            cmd.Parameters.Add ("@text", Comment.Text);
            cmd.ExecuteNonQuery ();
        }
        finally
        {
            connection.Close ();
        }
    }

     

    چگونه می توانم یک تصویر را از دیتابیس خوانده و در صفحه وب نمایش دهم؟

    اینجا من از یک صفحه وب برای نمایش تصویر استفاده کرده ام، کد زیر برای نمایش تصویر در صفحه وب استفاده می شود

    private void Page_Load(object sender, System.EventArgs e)
    {
        MemoryStream stream = new MemoryStream ();
        SqlConnection connection = new
          SqlConnection (@"server=127.0.0.1;database=MyData;uid=sa;pwd=yourpass");
        try
        {
            connection.Open ();
            SqlCommand command = new
              SqlCommand ("select Picture from Image", connection);
            byte[] image = (byte[]) command.ExecuteScalar ();  
            stream.Write (image, 0, image.Length);
            Bitmap bitmap = new Bitmap (stream);
            Response.ContentType = "image/gif";
            bitmap.Save (Response.OutputStream, ImageFormat.Gif);
        }
        finally
        {
            connection.Close ();
            stream.Close ();
        }
    }

    توابع GDI+ ویژگی های پیشرفته زیادی برای مدیریت و دستکاری داده های تصویری پیشنهاد می کنند. مثال این مقاله نگاه سریعی به کارهایی که از طریق فضا نام های System.Drawing.Imaging  و  System.Drawing  می توانید انجام دهید دارد. به عنوان مثال شما می توانید برنامه را برای ذخیره و مدیریت تصاویر بر روی وب گسترش دهید یا می توانید یک برنامه ساده بنویسید که به کاربر امکان ویرایش و دستکاری تصاویر را می دهد.

    چگونه از این کدها استفاده کنیم؟

     ابتدا یک دایرکتوری مجازی بسازید و فایل های پروژه را در آن قرار بدهید ، سپس رشته اتصال به بانک اطلاعاتی را تغییر دهید ( بر اساس سرور و نام کاربری و کلمه عبور و نام دیتابیس خودتان آن را ست کنید ) حالا می توانید از این پروژه استفاده کنید

     


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

     

    private void func_ShowSQLServerInstances()
            {
                SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
                System.Data.DataTable table = instance.GetDataSources();
                dataGridView1.DataSource = (table);
            }

     


    دستوری برای بک آپ گیری از SQL

     

    BACKUP DATABASE Database Name TO DISK = '" + strFileName + "'";

    به همین سادگی و خوشمزگی

     


    نحوه انتقال دیتابیس به اینترنت

     

    چند روز پیش سوال شده بود كه چگونه می توان دیتابیس MS SQL Server خود را بدون مشكلات احتمالی و به راحت ترين روش ممكن به سرور دیگری انتقال داد؟ برای درك بهتر سوال یك سناریو مطرح می كنم: شما WinCMS.Net Pro را داونلوئد كرده اید و بر روی localhost نصب می باشد؛ حال یا بصورت پیش فرض از دیتابیس فایلی SQL Server 2005 Express استفاده می كنید و یا با اجرای اسكریپت همراه فایل از سرور لوكال SQL Server 2005 بهره می برید. پس از آماده سازی سایت خود و ورود اطلاعات به آن در حالت لوكال، قصد آپلوئد آن به هاست خود در اینترنت و راه اندازی سایت خود را دارید بر روی هاست امكان استفاده از مد Express نمی باشد؛ حال چه كنیم؟


    جواب: كاركنان مایكروسافت برنامه كوچك و بسیار مفیدی جهت انتشار دیتابیس به سرور های دیگر بصورت اسكریپت ارائه داده اند. این برنامه می تواند هم ساختار و هم اطلاعات درون پایگاه داده شما را یكجا اسكریپت كرده و با حل مشكل اجازه دسترسی اشیاء با نبست دادن تمام آن ها به كاربر سطح db_owner مشكل شما را حل كند. پس از داونلوئد Microsoft SQL Server Database Publishing Wizard 1.1 و نصب آن به دو حالت می توان دیتابیس خود را اسكریپت كرد:


    1- از طریق اجرای این برنامه مشخصات سرور خود را داده و دیتابیس مورد نظر را اسكریپت كنید. بنابراین این برنامه به شما ایده جالبی می دهد: می توانید توسط آن از دیتابیس های خود در اینتر نت یا هر شبكه دیگری پشتیبان (backup) تهیه كنید!
    2- نصب این برنامه گزینه ای به محیط Visual Studio اضافه می كند كه با باز كردن پروژه و راست كلیك بر روی نام دیتابیس در Server Explorer و انتخاب Publish To Provider، همان كار بالا را انجام دهید.


    حال كافیست فایل ها را به هاست خود در اینترنت منتقل كرده و با ایجاد یك دیتابیس در سرور سایت (مثلاً از طریق كنترل پانل Plesk) و ایجاد كاربر SQL برای آن و تغییر مشخصات اتصال به سرور داده در بخش Connection String موجود در Web.Config، اسكریپت آماده خود را پس از اتصال به سرور در محیط اجرای query در SQL Server Management Studio مانند آنچه كه با Query Analyzer انجام می دادیم، run كنید!

     


    اسکریپت بک آپ از دیتابیس

     

    Sypex Dumper یک نرم افزار تحت وب متن باز هست که کار پشتیبان گیری بلادرنگ یا خودکار از دیتابیس های MySQL رو انجام می ده، با زبان PHP نوشته شده و واسط کاربری اون هم از Ajax استفاده می کنه، همچنین قابلیت بازیابی اطلاعات دیتابیس رو هم داره.
    این نرم افزار به دلیل این که محدودیت زمانی اجرای دستورات PHP رو bypass می کنه می تونه با دیتابیس های با حجم زیاد هم کار کنه.
    Sypex Dumper قابلیت این رو هم داره که جداول یک دیتابیس روچک کنه و در صورت وجود اشکال تعمیر کنه. همچنین می تونه اون ها رو optimize کنه و برای این که شما فضای زیادی رو هنگام پشتیبان گیری از دست ندین این امکان رو هم داره که فایل های قدیمی پشتیبان روبه صورت خودکار حذف کنه.
    در ضمن از فشرده سازی فایل ها و چند زبانه بودن هم پشتیبانی می کنه.
    وب سایت مربوطه