PDA

نسخه کامل مشاهده نسخه کامل : گزارش دادن تاریخهای نامرتب در دیتابیس



gonbad city
07-10-2010, 01:14
اولا سلام دوستان عزیز
بنده یه دیتابیس دارم با sql server compact که این عکس یه قسمتشه
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

دیتابیسم یه جوریه که باید کنترلهای سخت امنیتی بر روی کاربر انجام بشه به همین خاطر بسیار بسیار مهمه که کاربر که تاریخ رو عقب جلو میبره برنامه منم ثبت کنه و هر رکورد که ثبت میشه تاریخش هم ثبت بشه .


میخوام برنامه تاریخ هارو چک کنه و تاریخ هایی که بینشون عقب جلو رفته رو به من گزارش کنه
مثلا در عکس بالا 3 رکورد برای 2010/10/06 ثبت شده بعد تاریخ عوض شده و بطور کاملا مرتب رفته به 07 بعد باز تاریخ یه روز رفته جلو به 08 و توی رکورد بعدی برگشته به 07 در واقع این 08 تخلفه حالا من میخوام خود برنامه تشخیص بده و برام گزارش بده آیا این ممکنه؟
خواهش میکنم اگه حتی راهی به نظرتون میرسه که کوچکترین ربطی هم به سوال من داره دریغ نکنین ضمن اینکه چه با کد و چه با الگوریتم بهم یاری برسانین به هر صورت دعاگوی شما هستم.
پیشاپیش از همه دوستانی که این تاپیک رو میخونن و کمک هم میکنن ممنونم:11:

pezhmax
07-10-2010, 10:02
اگه امنیت اطلاعات اینقدر تو این پروژه مهم هست. اول باید سرور بانک اطلاعاتی رو از بقیه کامپیوترها جدا کنی. طبیعتا کسی نباید بدون اجازه به این سرور دسترسی داشته باشه. تاریخ و ساعت سرور همیشه باید تاریخ و ساعت واقعی باشه. جاهایی که قراره ساعت رو تو دیتابیس ذخیره کنی، از ساعت سرور استفاده کن. این کار با یه تابع ساده GETDATE() تو خود SQL-Server قابل انجامه.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


ولی اگه تاریخ تو جاهای دیگه برنامه ات استفاده میشه، من توصیه میکنم تاریخ سیستمها رو با تاریخ سرور Sync کنی.(البته راه استانداردی نیست و همون روش اول امن تره و خطاهاش هم کمتره). این کار با دریافت ساعت سرور از همون تابعی که گفتم شروع میشه :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

این دستور رو با استفاده از اجرای تابع ExecuteScalar از کلاس SqlCommand میتونی به یه متغیر تاریخ نسبت بدی. بعد با استفاده از Win32 API میتونی تاریخ سیستم طرف رو تغییر بدی. این API رو باید اینجوری وارد برنامه کنی :




برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


فقط باید به جاری DateTime.Now تاریخ خودت رو جایگزین کنی.

gonbad city
07-10-2010, 15:33
دوست عزیز ممنونم از توجهتون
اما متاسفانه پروژه من سروری نداره و برنامه کاملا در دست کاربره و روی سیستم خودش نصب میشه.
به همین خاطر تنها کاری که میتونم انجام بدم اینه که تخلفاشو مخفیانه ثبت کنم جهت پیگیری های بعدی فرد متخلف

Ultimator
08-10-2010, 03:28
سلام

اگه درست متوجه شده باشم میتونین یه تریگر تعریف کنین که هر وقت یکی از سلول ها آپدیت شد تاریخ رو با تاریخ قبل از آپدیت مقایسه کنه و اگه این دو مقدار برابر نبود تو یه تیبل ثانویه مثلا با اسم updatelog ثبتش کنه !

pezhmax
08-10-2010, 09:40
انوقت داده ای که امروز (بدون تخلف) ثبت شده رو با داده ای که دیروز (بدون تخلف) ثبت شده چه جوری تشخیص میدی؟

اگه نمیتونی سرور رو جدا کنی (که باید می کردی) ، راهی که به نظر من میرسه اینه که قبل از درج داده هات تو دیتا بیس تشخیص بدی که کاربر ساعت و تاریخ سیستم رو تغییر داده یا نه. البته یه کم سخت میشه. چون باید به جای یه برنامه یه Windows Service بنویسی که بتونه مخفیانه همیشه رو سیستم در حالت اجرا باشه.
تشخیص تغییر تاریخ توسط کاربر تو NET. از طریق کلاس SystemEvents که تو فضای نام Microsoft.Win32 هست قابل انجامه. این کلاس یه Event داره به نام TimeChanged که میشه براش یه Handler ساخت و ازش استفاده کرد :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


البته خط اول رو باید تو یه رویداد برنامه اجرا کنی. مثل Constructor کلاس اجراییت یا اگه تو برنامه ویندوز فرم (که من توصیه نمیکنم) هست مثلا تو رویداد Load فرم.