PDA

View Full Version : ایده شما برای گزارش گیری از اعمال کاربران



M.YasPro
چهارشنبه 28 دی 1390, 13:09 عصر
سلام
وقت بخیر
ایده شما برای لاگ گرفتن از اعمال کاربران(درج ، حذف ، ویرایش و...) یک نرم افزار چند کاربره که چیه؟

ممنون از توجهتون

mehran_sh_t
چهارشنبه 28 دی 1390, 16:10 عصر
سلام
بستگی به خواسته تون داره، اگر می خواید بدونید اطلاعات قبلی رکورد چی بوده، باید به ازای هر جدول که دارید، یک جدول مشابه تعریف کنید، به اضافه آی دی کاربر در کنار بقیه فیلد ها
ولی اگر اطلاعات مهم نیست، می تونید تو یک جدول این کار رو بکنید.

با استفاده از Trigger برای SQL می تونید انجام بدید، اگر اشتباه نگفته باشم!

M.YasPro
شنبه 01 بهمن 1390, 15:07 عصر
ممنون از نظرتون ولی این منطقی نیست که به ازای هر جدول یه جدول متناظر برای آرشیو کردن اطلاعات داشته باشیم .

senaps
شنبه 01 بهمن 1390, 16:16 عصر
من هم اتفاقا یه همچین قصدی دارم که بتونم گزارش هایی رو بگیرم....
فعلا که کاری که کردم این بوده که برای اونها جدول هایی ساختم!!!!
مثلا برای اینکه بدونم که چه کاربری چه کتاب هایی رو گرفته یا چه کتابی توسط چه کاربرانی گرفته شده، و کلا برای گزارش های این چنینی،یه جدول دارم که برای هر عمل یه ایدی اختصاص میده و ایدی کتاب و کاربر و کاری که انجام داده رو ذخیره میکنه....

Mahmoud Zaad
شنبه 01 بهمن 1390, 17:43 عصر
سلام
در ساده ترین حالت علاوه بر جدول کاربران به یه جدول دیگه نیاز داریم که اعمال کاربران توش ثبت میشه و این جدول با جدول کاربران در ارتباطه، فیلدهای این جدول شامل این موارد هست: کد کاربر، نوع عمل(ورود، ثبت، آپدیت، حذف، خروج)، قسمتی که اعمال روش انجام شده(مثلا این رو می شه از عنوان فرم، بدست آورد)، ساعت و تاریخ. خب حالا بعد از هر عمل می تونیم یه رکورد به این جدول اضافه کنیم. ولی خب جدول سنگینی میشه!

debugger
شنبه 01 بهمن 1390, 18:43 عصر
شما می توانید هیچ رکوردی را حذف نکنید . چطوری ؟
فرض کنید 0 یعنی حذف و 1 یعنی عدم حذف
یک ایدی به اسم IdEdit در نظر بگیرید . هر وقت کاربر خواست رکوردی را حذف کنه اینو از یک به صفر تغییر بدین . صد در صد یک کلید هم برای یوزر دارین اونو هم تو اون جدول ای که قراره رکورد حذف بشه میارین مسلما

اینطوری می فهمین که کدام یوزر کدام رکورد ها را حذف کرده

معمولا اگر اطلاعات خیلی مهم باشه و حذف کردن خیلی خیلی حساس این کار را می کنن

این طوری شما در برنامه تون مثل Recycle Bin ویندوز یک سطل زباله دارین که بعد اگر خواستین می تونین اونارو برگردونین یا به کل حذف کنید

موفق باشید

ya30ien2
شنبه 01 بهمن 1390, 22:51 عصر
من میگم شما یه فیلد دیگه برای اعمال کاربران در کنار هر جدولی که لازم داری اضافه کن و مثلا برای ثبت یک اطلاعات داخل اون جدول اطلاعات کاربر رو میگیری و مثلا میگی "کاربر:1 ثبت اطلاعات"
و برای ویرایش وقتی کاربر دکمه ثبت رو زد شما تمامی اطلاعاتت رو چک میکنی میبینی که فقط نام تغییر کرده قبت میکنی که "کاربر 2 : تغییر نام از یک به دو"
و یک نظر دیگه که من دارم اینه که اطلاعات رو به دنبال هم ثبت کن یعنی جایگزین نکن مثلا کاربر 1 مشخصات یک نفر رو ثبت میکنه و کاربر 2 اون رو ویرایش میکنه همه اینها ثبت باشه

sepehr.net
یک شنبه 02 بهمن 1390, 11:32 صبح
فرض کنید 0 یعنی حذف و 1 یعنی عدم حذف
یک ایدی به اسم IdEdit در نظر بگیرید . هر وقت کاربر خواست رکوردی را حذف کنه اینو از یک به صفر تغییر بدین . صد در صد یک کلید هم برای یوزر دارین اونو هم تو اون جدول ای که قراره رکورد حذف بشه میارین مسلما
این روش پیشنهاد نمیشه ، چون در زمانی که حچم اطلاعات بالا بره سبب کندی عملیات میشه ، اگه اطلاعات مهم هست میتونین یک جدول با همان استراکچر جدول اصلی بسازید و سطری که پاک میشه با تریگر به اون جدول اضافه کنید ، با این کار قابلیت بازیابی هم دارید
برای ثبت لاگ کاربر باید بگم که بستگی داره به نوع گزارشی که میخوای از این عملیات بگیری.
ساده ترین حالت اینه که یک جدول میسازی با 3 تا فیلد (کد کاربر ، تاریخ و ساعت ، شرح عمل انجام شده) . در این جدول در هر قسمت برنامه عملیات مربوط به لاگ رو مینویسی به عنوان مثال ("کاربر 'مدیر سیستم' با نام کاربری 'admin' کتابی با کد 01 را در سیستم ثبت کرد") و این متن رو به جدول اضافه میکنی

اگه میخوای دقیق تر لاگ اطلاعات رو نگه داری ، میتونی از Agent در Sql کمک بگیری یا از Reporting Service . البته از این روش ها بیشتر برای کشف دیتا ماینینگ ها استفاده میشه برای برنامه های تجاری بزرگ

debugger
یک شنبه 02 بهمن 1390, 12:18 عصر
سپهر جان اینطوری که شما گفتین اطلاعات حذف شده را نمیشه برگردوند . اینطوری فقط میشه فهمید حذف شده نشده ویرایش شده نشده . دیگه نمیشه فهمید چی ویرایش شده چه اطلاعاتی حذف شده

zarrinnegar
یک شنبه 02 بهمن 1390, 14:39 عصر
من برای این کار از یک جدول که به جدول User ها متصل هست استفاده میکنم با چند تا فیلد که شامل

[AutoCodeHistory] [int] IDENTITY(1,1) NOT NULL,
[ApplicationId] [uniqueidentifier] NULL,
[UserId] [uniqueidentifier] NULL,
[FormId] [int] NULL,
[EventTypeId] [int] NULL,
[EventDate] [char](10) NULL,
[EventTime] [nvarchar](50) NULL,
[Description] [nvarchar](max) NULL,
[IpAddress] [nvarchar](max) NULL,
[ComputerName] [nvarchar](max) NULL,
[IsLogin] [bit] NULL,
[CommandText] nvarchar(max)


اولین فیلد که اتوماتیک تولید میشه
دومی کد نرم افزاره ( آخه ممکنه من بایک برنامه 2 یا 3 یا بیشتر نرم افزار رو اجرا کنم )
سومی کد کاربره
چهارمی کد فرمی هست که کاربر باهاش داره کار میکنه
پنجمی نوع عملیاتی هست که کاربر انجام میده ( ایجاد ، حذف ، ویرایش و ...)
ششمی تاریخ انجام عملیات هست
هفتمی ساعت و روز انجام کار هست ( یکشنبه و دوشنبه و ...)
هشتمی توضیحات هست مثلا (کد 1100 مربوط به چک شماره 9080828 آقای .... ایجاد شد)
نهمی Ip سیستمی هست که عملیات رو انجام داده
دهم اسم کامپیوتری هست که عملیات رو انجام داده
یازدهم نشون میده که عملیات ورود و یا خروج کاربر بوده و ایجاد و حذف و ... نبوده (البته با همون قسمتهای دیگه هم میشه این کار رو انجام داد ولی من اینطوری نوشتم ، آخه کار دیگه ای هم انجام میدم .... )
دوازدهم هم دستور Sql ی هست که اون کار رو انجام داده مثلا (update mytable set name='hassan' , family = 'nadedri' where code = 100)

این دوازدهمی برای من مهمه چون که اگه بخوام اطلاعاتی رو بفرستم جای دیگه (Replicate data ) من لازم نیست جدول هامو چک کنم ببینم که چی اضافه شده و چی کم شده و نگران این باشم که چی تغییر کرده و چر حذف شده
با این کد و اجرا در مقصد میتونم عینا همین دیتا رو داشته باشم
البته این قسمتش یکمی هم کنترل لازم داره که اینجا جاش نیست

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

sepehr.net
یک شنبه 02 بهمن 1390, 20:06 عصر
سپهر جان اینطوری که شما گفتین اطلاعات حذف شده را نمیشه برگردوند . اینطوری فقط میشه فهمید حذف شده نشده ویرایش شده نشده . دیگه نمیشه فهمید چی ویرایش شده چه اطلاعاتی حذف شده

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

به نظر من گذاشتن قسمتی در برنامه که هر کاربری هر عملی انجام میده بشه اون رو ریکاوری کنی یک اشتباه بزرگه (مخصوصا اگه دیتایی که درون دیتابیس هست حجیم باشه) ، چون الکی حجم دیتابیس رو بالا میبریم و این موضوع تاثیر خیلی زیادی روی سرعت عملیات ما بر روی دیتابیس میذاره

وقتی خود اس کیو ال امکاناتی خوبی به ما میده جهت تهیه پشتیبان و بازیابی اون ، به نظر من دیگه احتیاجی به این قضیه نداریم.


چند وقت پیش روی یک دیتا بیس داشتم کار میکردم ، تعداد سطر های جدول لاگ اون 200 میلیون رکورد بود ، که 90 درصد حجم دیتابیس رو گرفته بود ، حالا فکر کن که همچین امکاناتی هم روش بذاریم!!!

ولی باز اگه اصرار به این کار هست ، بهترین روشش همون موردی هست که گفتم ، از جدول ها مهم دو تا ساخته بشه ، سطری که از این پاک میشه به اون اضافه بشه ، هنگام ریکاوری از اون پاک بشه دوباره به جدول اصلی اضافه بشه