بازیابی اطلاعات در اس کیو ال

نوشته شده توسط aliarjmandi مورخه ۱۳۸۹/۳/۸ در ساعت 15:04

یکی از مشکلات همیشه گی در تولید نرم افزارها مبحث ثبت ردپای کاربران (User Log) میباشد . اینکه ما بخواهیم تشخیص دهیم کدام کاربر چه فعالیتی را انجام داده است . بعنوان مثال چه کسی یک رکورد خاص را ایجاد ، ویرایش و حذف نموده است . برای پیدا سازی این مبحث بسته به سلیقه برنامه نویسان راههای متفاوتی وجود دارد . بعضی از برنامه نویسان جداولی برای نگهداری لاگ کاربران ایجاد میکنند  و برخی دیگر به تمامی رکوردها آی دی کاربران را اضافه میکنند . اما آیا میدانید که بانک اطلاعاتی Sql Server بصورت خودکار از تمام عملکرد کاربران لاگ گیری میکند و میتوان با استفاده از آن ردپای عملکرد کاربران را استخراج نمود .  حتماً در زمان ایجاد یک بانک اطلاعاتی جدید دقت کرده اید که هر بانک اطلاعاتی شامل دو فایل میباشد . فایل mdf که شامل اطلاعات داده ای میباشد و فایل ldf که شامل لاگهای مربوط به تراکنشهای بانک اطلاعاتی میباشد . در این مقاله سعی شده راهکاری برای استخراج لاگ از فایل ldf ارائه شود .

استخراج این اطلاعات علاوه بر اینکه راهکاری برای لاگ کردن عملکرد کاربران ارائه میکند ، به شما در بازیابی اطلاعات از دست رفته شما نیز کمک میکند . برای بازیابی لاگ فایل نرم افزارهای مختلفی ارائه شده است . از جمله این نرم افزارهای نرم افزار  Sql Log Rescue میباشد که بصورت رایگان ارائه شده است . البته محدودیت این نرم افزار مربوط به ورژن بانک اطلاعاتی آن میباشد و این برنامه فقط از Ms Sql Server 2000 حمایت میکند . اما نصب آن تجربه جالبی میباشد و شما براحتی میتوانید تمام تراکنشهای قبلی خود را مشاهده کنید . این برنامه به شما امکان میدهد داده های قبلی را بازیابی نمایید .

برنامه دیگر در این رده  ApexSQL Log میباشد . این نرم افزار بسیار قدرتمند تر از برنامه فوق میباشد و از تمامی نسخه های موجود sql server حمایت میکند ، اما این نرم افزار رایگان نمیباشد .

اما ما سعی کردیم با توجه به دو برنامه فوق یک پروژه نرم افزار Open source ایجاد کرده و از طریق پروژه خودمان به داده های لاگ دسترسی پیدا کنیم . در اجرای این پروژه چالشهای زیادی وجود داشته و دارد . چرا که دستورات مربوط به بازیابی اطلاعات لاگ کاربران بصورت UnDocument میباشد و در هیچ نقطه ای از شبکه جهانی یافت نگردید. حتی نامه نگاری ما با سازندگان sql server نیز نتیجه ای نداشت .

mail

با این وجود  با  استفاده از یک مستند نه چندان کامل کامل ما شروع شد . پروژه موجود با استفاده از Visual C# 2008 تهیه شده است . در این پروژه  با استفاده از دستورات Sql و رمزگشایی رکورد لاگ فایل اطلاعات مربوطه به عملیات Insert  و Delete از بانک اطلاعاتی استخراج میگردد . هر عملی که موجب تغییر داده ها در بانک اطلاعاتی میگردد با یک Transaction همراه است و هر Transaction دارای یک آی دی میباشد . عمده فعالیت ما برای استخراج اطلاعات مربوط به هر تراکنش میباشد و این کار با استفاده از دستور زیر انجام میشود .

SELECT [Begin Time],SPID as Time from::fn_dblog (null, null) where [Transaction ID] = '" + Trans + "' And Operation ='LOP_BEGIN_XACT

بعد از آن بایستی با توجه به اندازه هر ستون داده ها از هگزاد به یونیکد تبدیل نمود . عمده مشکل مربوط فیلدهای Var یا متغیر میباشد .  این فیلدها دارای سایز متغیر میباشند و استخراج آنها به سادگی سایر ستونها نمیباشد .  برای اجرای برنامه نیاز دارید تنظیمات مربوط به اتصال به بانک اطلاعاتی ، نام دیتا بیس و جدول مورد نظر را تنظیم نمایید .

GetSqlLog _GetSqlLog = new GetSqlLog(@"Data Source=NikSoft\SQLSERVER2008;Initial Catalog=Train;uid=sa;pwd=sa*123", "Train", "Person");

در تصویر زیر نمونه اجرای برنامه را مشاهده میکنید . همانطور که بوسیله رنگها مشخص شده است ما دو رکورد تغییر یافته داشته ایم . رکورد اول که حذف شده است و رکورد دوم که به جدول اضافه شده است . اما نقص کار ما مربوط به عملیات Update بوده که هنوز نتوانسته ایم آنرا استخراج نماییم .

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

Log.zip (13.42 kb)

SQLServerForensics.BlackHat.Aug07.pdf (879.97 kb)

کلمات کلیدی :, ,

تصاویر جذاب

پیاده سازی معماری چند لایه با استفاده از لینک (قسمت اول)

نوشته شده توسط aliarjmandi مورخه ۱۳۸۸/۸/۱۶ در ساعت 18:42

از آخرین پستم مدت زیادی گذشته . اگر چه مطالب زیادی برای نوشتن داشتم اما واقعاً فرصت پیدا نمیشد . امروز یه مطلب برنامه نویسی براتون دارم . امیدوارم مفید باشه . من یه چند ماهی هست که در گیر استفاده کردن از Linq to Sql بجای Ado.net شدم .
استفاده از لینک هم مزایایی داره هم معایبی . اما مزیت اصلی که به نظر من استفاده از لینک داره (البته برای برنامه های کوچک) کاهش حجم کد نویسی هست  . با کمک لینک دیگه ما درگیر نوشتن خطوط زیاد برنامه برای اتصال به بانک اطلاعاتی و استخراج داده ها نمیشیم . ولی خود این مزیت هم باعث دردسرهایی میشه . یادگیری زبان لینک چیز ساده ای نیست . نوشتن پرس و جوهای پیچیده با لینک خودش یه دردسر بزرگه . از اون بدتر بازخوانی پرس و جوها هست . من خودم گاهاً نمیتونم خروجی پرس و جویی که قبلاً نوشتم رو حدس بزنم . برای نوشتن کوئری ها لینک چندتا ابزار  کمکی وجود  داره که من تقریباً همشون رو تست کردم . اما هیچ یک به قدرت ابزار Linqer نیستند . در آینده یه آموزش مفصل در یک پست جدا برای اون اختصاص میدم . ولی همین ابزار هم در کوئری ها پیچده دچار مشکل میشه و باید خود برنامه نویس اشکالات رو برطرف کنه .

اما موضوعی که امروز میخوام در مورد اون صحبت کنم بحث Multi tier architecture for Linq to Sql  در لینک هست . موضوعی که از اول استفاده من از لینک همیشه برام مورد سوال بود . اینکه با استفاده از لینک و نوشتن دستورات اون پشت فرمها تکلیف برنامه نویسی چند لایه چی میشه .اما خوشبختانه هر سوال اینترنتی جوابش هم توی اینترنت هست و فقط باید صبور بود و جستجو کرد . این پست  نتیجه تحقیقات بنده با اندکی تغییر در متن اصلی میباشد .


Multi tier architecture for Linq to Sql

هدف این مقاله نمایش چگونگی پیاده سازی معماری چند لایه با استفاده از ابزار لینک و همچنین استفاده از ObjectDataSource بعنوان منبع داده ها در برنامه میباشد . ویژگیهای کلیدی  این روش توجه به خواسته های موجود  از  datacontext  و کلاس های موجود مخزن است که ارائه دهنده  راه کارهای ساده  پیاده سازی عملیات اضافه کردن ، ویرایش کردن و حذف کردن داده ها  (CRUD) با استفاده از  Generic DataType ها میباشد . اگر نیاز به اطلاعات بیشتر در مورد  نوع داده ای Generic هستید از این مقاله استفاده کنید . در اصل در این مقاله ما قصد ایجاد لایه Data Access یا همان DAL را با استفاده از تکنولوژی Linq داریم .

Generic Entity Repository

هر موجودیت بانک اطلاعاتی دارای یک کلاس مرتبط مخزن داده ای است  که وظیفه انجام عملیات های مختلف CRUD را بر عهده دارد .این کلاسهای مخزن داده های از کلاس GenericRepository  ارث بری میکنند که قبلاً در آن عملیاتهای مخلتف Select , Insert , Updateو Delete پیاده سازی شده است . در سورس زیر کلاس GenericRepository  نمایش داده شده است .

[System.ComponentModel.DataObject]
public class GenericRepository<TEntity, TDataContext>

 where TDataContext : DataContext { public static List<TEntity> SelectAll() { ... } public static void Insert(TEntity entity) { ... } public static void Update(TEntity entity) { ... } public static void Delete(TEntity entity) { ... } }
حالا  نوبت به تعریف کلاسهای مخزن داده ای میرسد . این کلاسها که از کلاث فوق ارث بری میکنند نوع کلاس خود که آنها را با بانک اطلاعاتی متصل میکند بهمراه نام DataContex را بعنوان پارامتر ورودی کلاس وارد میکنند . در شکل زیر مراحل کار مشخص شده است .
//ProductRepository class
public class ProductRepository : GenericRepository<
    Product, NorthwindDataContext>
{
}

در کد فوق کلاس Product و نام DataContext بعوان پارامترهای ورودی ارسال شده اند . توجه کنید این دو ورودی بصورت اتوماتیک توسط خود Visual Studio بصورت کاملاً ویزاردی تولید میشوند و شما کار اضافی انجام نمیدهید .


اما کلاس ما یعنی کلاس ProductStaticRepository با استفاده از یک الگو یا T4 Template  ایجاد میشود . این کلاس حاوی عملیاتهای استاندارد CRUD  است .

حال در زمان صدا زدن این کلاس در لایه های بالا تر کافیست خطوط زیر را وارد نماییم .

   
   var productRepository = new ProductRepository();
    products = productRepository.SelectAll();
   
اما کدهای مربوط به عملیات SelectAll , Insert , ... قبلاً در یک لایه واسط تعریف شده اند . این لایه واسط  GenericDataLayer میباشد .  اگر قبلاً با Ado.net کار کرده باشید حتماً واسط SqlHelper رو بخاطر دارید که روالهای مانند ExecuteDataTable رو در اختیار برنامه نویس قرار میدادند . برای دسترسی این واسط بایستی از این آدرس استفاده کنید که آدرس مرجع اصلی این مقاله هم میباشد . در این تصویر لایه مورد نظر نمایش داده شده است .
استفاده از Generic به این معناست که من نیاز به نوشتن هیچ کدی در کلاس ProductRepository  خودم برای انجام عملیات استاندارد  CRUD ندارم  و این ایمن ترین روش میباشد . 
کلاس  ProductRepository  من امکان بهینه شدن را نیز دارد . این بدان معناست که من میتوانم در این کلاس روالهای اضافی مورد نیازم رو وارد کنم . مثلاً در مثال  زیر ما یک Product رو براساس ID جستجو میکنیم .  این کار با استفاده از کلمه کلیدی Partial  امکان پذیر هست که به ما این امکان رو میده که به سادگی یک کلاس را به ماژولهای مختلف بشکنیم و در زمان کامپایل یک کلاس واحد داشته باشیم .

                                                                                        
namespace DataLayer{
    public partial class ProductStaticRepository
    {
        
         
        public static IList GetByCategory(int id)
        {
            IQueryable res = SelectAll().Where(p => p.CategoryID == id);
            return res.ToList();
        }

        public static void InsertBlank()
        {
            Product p = new Product { CategoryID = 1,

 ProductName = "test", SupplierID = 1 }; Insert(p); } } }
یکی از امکانات لینک امکان کنترل خطاها در این سطح میباشد . این خطاها بصورت رخدادهایی هستند که لینک به شما امکان پیاده سازی آنها را میدهد . البته من شخصاً سعی میکنم کاربر اطلاعات غلط وارد فرم اطلاعات نکند اما این امکان به نوعی مهم کاری محسوب میشود . کد زیر نمونه پیاده سازی رخداد OnProductNameChanging میباشد .  بازهم گزینه partial امکان اتصال کلاسها رو بهم فراهم میکنه . بدین ترتیب میشه سایر رخدادها رو پیاده سازی کرد .
                                                                                        
using System;

namespace DataLayer
{
    public partial class Product
    {
        partial void OnProductNameChanging(string value)
        {
            if (value == "")
                throw new Exception("Product name cannot be empty");
        }
        
    }
}

T4 Template

همانطور که قبلاً گفتم برای ایجاد کلاسهای مورد نیاز از یک الگو استفاده میکنیم . برای این کار نیاز به دو فایل DataClasses.tt و L2ST4.ttinclude داریم . روش کار بصورت زیر میباشد :

  • ایجاد یک پروژه از نوع Class Library برای لایه داده ها

  • ایجاد یک مخزن داده لینک (DataContext) به پروژه و تغییر نام آن به DataClasses.dbml . (باید نام این فایل با نام فایل الگو یکسان باشد ) . بعد از آن اضافه کردن جداول بانک اطلاعاتی مورد نظر به لینک .

  • اضافه کردن دو فایل الگو به پروژه . در این لحظه باید پیام اخطار زیر بروی صفحه ظاهر شود  که مربوط به تولید خودکار کد توسط فایل الگو میباشد .
  •   با زدن دکمه OK فایل مورد نظر تولید میشود .

  • در این مرحله باید کتابخانه GenericDataLayer به پروژه اضافه شود و فایل DataClasses.generated.cs که توسط MSLinqToSQLGenerator تولید شده  و در کنار فایل DataClasses.dbml.layout در زیر DataClasses.dbml حذف شود تا فایلی که توسط T4 Template ایجاد شده جانشین آن شود .  اکنون میتوانید پروژه را کامپایل نمایید .

  • ادامه مطالب در پست بعدی

کلمات کلیدی :, ,

تصاویر جذاب

با مثال UML آموزش

نوشته شده توسط aliarjmandi مورخه ۱۳۸۸/۷/۶ در ساعت 04:14

دیباچه
تولید نرم افزار بر خلاف آن چیزی که در اکثر نقاط کشورمان (البته غیر از برخی شرکتهای پر قدرت) جریان دارد نه یک کار آموتور بلکه یک کار کاملاً حرفه ای می باشد . عدم توجه به اصول تولید نرم افزار تولیدات نرم افزاری را به سمت محصولاتی با طراحی و تحلیل ضعیف سوق داده است . عدم توجه به متدولوژیها ، تولید مستندات تولید ، وابسته به نفر بودن ، عدم استفاده از استاندارهای تولید و ... از مشکلات موجود محصولات نرم افزاری میباشد . نبود این مستندات امکان ممیزی و رتبه بندی محصولات نرم افزاری و در نیتجه درجه بندی آنها توسط مراجع مربوطه غیر ممکن می کند . در نتیجه نبود این درجه بندیها مشتریان نیز دچار سردرگمی بوده و در نتیجه هیچ مبنایی برای انتخاب یک نرم افزار ندارند . اما تولید این مستندات نیز برای شرکتها بار هزینه ای فراوانی به همراه می آورد . این هزینه ها شامل هزینه های زمانی و ریالی میباشد . اما به نظر می رسد مسئله کمبود و عدم وجود نیروهای متخصص تحلیلگر و آشنا با ابزارهای تحلیل و طراحی بیش از همه مشکلات راه شرکتها را برای استفاده از اصول سد می کند . به نظر می رسد بر خلاف تصور اکثریت یادگیری ابزارها و زبانهای تحلیل و طراحی بسیار مهمتر از آشنایی با زبانهای برنامه سازی میباشد . زبان UML یکی از ابزارهای طراحی و تحلیل سیستمها میباشد . من سعی کردم در این پست نکاتی رو به علاقمندان آموزش بدهم . امیدوارم این مطالب برای خوانندگان مفید واقع بشود .

بعد از جستجوهای فراوان در میان منابع این مقاله رو از این سایت پیدا کردم که بنظرم کاملترین مثالی بود که تا حالا دیدم . حسن این مثال اینکه فقط صرفاً به تعریف محض نمودارها نپرداخته و سعی کرده یک مساله رو از اول تا به انتها با نمودارهای مورد نیاز مدل بکنه .
0 . مقدمه

هدف این مقاله نمایش چگونگی استفاده از واقعی از UML در فرآیند توسعه نرم افزار میباشد

1 . مشکل آسانسور

محصول مورد نظر یک سیستم برای کنترل دستگاه آسانسوری است که در یک ساختمان با n طبقه نصب شده است . مشکل نگرانی های منطقی مورد نیاز برای حرکت بین دستگاه آسانسور طبقه با توجه به محدودیت های زیر می باشد :

  • هر آسانسور دارای یک مجموعه دکمه میباشد ، هر طبقه یک دکمه . این دکمه ها وقتی فشار داده شوند روشن می شوند و موجب میشوند که آسانسور به طبقه مورد نظر هدایت شود . روشنهایی دکمه وقتی آسانسور به طبقه مورد نظر میرسد خاموش میشود .
  • بجز طبقات اولی و آخری ، سایر طبقات دارای دو دکمه میباشند . یکی برای آسانسور بالا رونده و دیگری برای آسانسور پایین رونده . این دکمه ها نیز وقتی فشار داده شوند روشن میشوند . پس از اینکه آسانسور به طبقه می رسد و سپس به سمت جهت مورد نظر حرکت می کند چراغ خاموش میشود .
  • زمانیکه تقاضایی برای استفاده از آسانسور وجود ندارد ، آسانسور در طبقه جاری با درب بسته می ماند .
2 . زبان متحد مدلسازی

UML یک زبان مدل سازی میباشد که با نماد ها مشخص میشود اما هیچ پردازشی را انجام نمیدهد . ما تصمیم داریم این مساله را با نمودارهای زیر به ترتیب مدل کنیم .

  • Use Case Diagram - نمودار مورد کاربری
  • Class Diagram - نمودار کلاس
  • Sequence Diagram - نمودار توالی
  • Collabration Diagram - نمودار همکاری
  • State Diagram - نمودار حالت

 

3 . تحلیل
3.1 . نمودار مورد کاربری

توصیف ویژگیهای نمودار

  • توضیحات کلی در مورد اینکه چگونه از سیستم استفاده خواهد شد
  • مروری بر عملکرد خواسته شده از سیستم فراهم می آورد
  • قابل فهم شدن موضوع توسط یک شخص آماتور همانند یک شخص حرفه ای

نمودار مورد کاربری :

برای دیاگرام مورد کاربری بهتر است یک سناریو تهیه شود . در ایجاد سناریو باید به هر مرحله یک شماره اختصاص داده شود . با توجه به نمودار فوق می توان سناریو زیر را ایجاد کرد :

  • Passenger pressed floor button
  • Elevator system detects floor button pressed
  • Elevator moves to the floor
  • Elevator doors open
  • Passenger gets in and presses elevator button
  • Elevator doors closes
  • Elevator moves to required floor
  • Elevator doors open
  • Passenger gets out
  • Elevator doors closes

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

نمودار کلاس نمایش دهنده ساختار ایستای اشیاء بهمراه ساختار داخلی کلاس و روابط بین کلاسها میباشد .

نمودار کلاس :

 

3.3 نمودار ترتیب

نمودار حالت ترتیب حالتهای یک شی را در طول چرخه حیات شی در پاسخ به محرک ها بهمراه عملکرد و پاسخهای شی نمایش می دهد .

4 . طراحی

در مرحله طراحی بایستی جزئیات نمودارهای کلاس ، نمودارهای همکاری ، نمودارهای توالی ، نمودارهای حالت و نمودارهای فعالیت تولید شود . اگرچه رسم نمودار فعالیت برای مسائله آسانسور بسیار ساده میباشد اما ما برای مسائله آسانسور از نمودار فعالیت استفاده نمی کنیم .

4.1 . نمودار توالی

اگرچه نمودار توالی و نمودار همکاری هر دو یک بار معانی را دارند اما در دو شیوه مختلف مفهوم را بیان میکنند . نمودار توالی بصورت صریح ترتیب پیامها را بیان می کند و برای مدل سازی سیستم های بلادرنگ مناسب می باشد ، با این وجود نمودار همکاری ارتباط بین اشیاء را نمایش میدهد .

نمودار توالی :


نمودار توالی برای مدل سازی دکمه آسانسور


نمودار توالی برای مدل سازی دکمه طبقه

4.2 . نمودار همکاری

توصیف ویژگیهای نمودار

  • مجموعه از فعل و انفعالات بین کلاسها و نوع ها را توصیف میکند
  • روابط بین اشیاء را نمایش می دهد

نمودار همکاری


نمودار همکاری برای مدل سازی دکمه آسانسور


نمودار همکاری برای مدل سازی دکمه طبقه

5 . طراحی جزئیات
5.1 . جزئیات نمودار کلاس

 

5.2 . جزئیات روالها
Module Name Elevator_Control::Elevator_control_loop
Module Type Method
Input Argument None
Output Argument None
Error Message None
File Access None
File Change None
Method Invoke button::illuminate, button::cancel_illumination,door::open, door::close, elevator::move, elevator::stop
5.3 . Pseudo-Code
 
void elevator_control (void)
{
while a button has been pressed
if button not on
{
button::illuminate;
update request list;
}
else if elevator is moving up
{
if there is no request to stop at floor f
Elevator::move one floor up;
else


}

امیدوارم این مطلب براتون کاربرد داشته باشه . در پست بعدی سعی میکنم یه سری کتاب و مثال مربوط به بحث طراحی رو توی سایت قرار بدم . همچنین طریقه نصب نمودار توالی رو در VS2010 خواهیم دید .

کلمات کلیدی :,

تصاویر جذاب

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

درباره نویسنده

من علی ارجمندی هستم . کارشناس رایانه . توی این وبلاگ سعی کردم تجربیات خودم رو با دیگران به اشتراک بگذارم . امیدوارم از مطالب این سایت استفاده کنید . لطفاً من رو از نظراتتون مطلع کنید

aliarjmandi@yahoo.com

سایر صفحات

Calendar

<<  May 2012  >>
MoTuWeThFrSaSu
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

View posts in large calendar
Locations of visitors to this page