سلام. من یک برنامه ویندوز فرمی نوشتم که در آن اطلاعات توسط چندین کاربر وارد می شود.
من جهت پایش کار این کاربران در این برنامه یک جدول Log با فیلدهای زیر ساختم.
public enum OprationKindEnum : byte
{
New = 1,
Edit = 2,
Delete = 3
}
public enum OprationTable : byte
{
Table1= 1,
Table2= 2,
Table3= 3
}
public class Log
{
[Key]
public int ID { get; set; }
public OprationTable OprationTable { get; set; }
public int IdTable { get; set; }
public OprationKindEnum OprationKind { get; set; }
public long UserID { get; set; }
public Nullable<DateTime> OprationDateTime { get; set; }
public string Message { get; set; }
public bool Result { get; set; }
}
که بعد از عملیات CRUD روی هر جدول در برنامه، برای هر رکورد (Create,Update,Delete) یک رکورد در جدول Log ایجاد می شود که مشخص می کند این رکورد، مربوط به کدام جدول (Table1 ، Table2 ، ،Table3، ......)، با چه آیدی از آن جدول، با چه عملیاتی (Create,Update,Delete)، در چه زمانی، توسط چه یوزری انجام گرفته است. در ضمن True یا False بودن عملیات یا متن خطای احتمالی که شاید رخ دهد نیز مشخص می شود.
این عمل افزودن رکورد به جدول Log پس از هر بار که عملیات New یا Update یا Delete برای هر جدول انجام می شود با فرا خوانی متد زیر در جدول Log صورت می گیرد.
public void SaveLog(OprationTable NameTable, int IdTable, OprationKindEnum oprationKind, bool OprationResult, string message)
{
try
{
Log newLog = new Log();
newLog.OprationTable = NameTable;
newLog.IdTable = IdTable;
newLog.OprationKind = oprationKind;
newLog.OprationDateTime = DateTime.Now;
newLog.UserID = AppInfo.User_id;
newLog.Message = message;
newLog.Result = OprationResult;
_context.tblLog.Add(newLog);
_context.SaveChanges();
}
catch (Exception ex)
{
FMessegeBox.FarsiMessegeBox.Show(ex.Message, "خطا", FMessegeBoxButtons.Ok);
}
}
مثلا برای ثبت یک رکورد در جدول Log زمانی که یک رکورد در جدول Table1 ایجاد می شود من با یک کویری ابتدا Id که در جدول Table1 ایجاد شده را بدست می آورم و سپس داده ها را به متد saveLog پاس میدهم تا اطلاعات در جدول Log ذخیره شود.
این کار باعث کند شدن برنامه می شود. حال من میخواهم این برنامه رو با ASP.Net Core تبدیل به یک سایت کنم. آیا برای ثبت فعالیت های کاربران باید همانند برنامه ویندوز فرم عمل کنم یا راحلی بهتر از این هست که مشکل کند شدن رفع گردد؟
شما اگر قصد دارید بدونید هر کاربری چه رکوردی رو ثبت یا ویرایش کرده چه نیازی هست که یک جدول دومی به عنوان Log داشته باشید ؟ خب تو همون جدول اصلی دو فیلد UserID و CreateDateTime رو ایجاد کنید. وقتی کاربر رکوردی رو ایجاد میکنه فیلد UserID با ID کاربر پر میشه و CreateDateTime هم تاریخ و ساعت اون لحظه رو دریافت میکنه.
برای ویرایش هم فیلد به نام ModifyDateTime بذارید که کاربر هر موقع ویرایشی روی رکورد انجام داد تاریخ و ساعت اون لحظه رو ثبت کنه.
شما می تونید فقط برای Delete اطلاعات رو توی یک جدول دیگه ثبت کنید و معمولا چون Delete کمتر رخ میده باعث کندی هم نمی شه.
ضمنا تفاوتی نداره در C# یا Asp.net Core شما این کار رو انجام می دید. بیشتر یک ساختار دیتابیسی هست این موضوع.
در مورد Log یه سری نرم افزارها مثل Serilog و ... هم هستن که می تونید استفاده کنید ولی بعضی هاشون کمی پیچیده هستن.
ممنون.
ابتد در مورد Delete عرض کنم که من یک فیلد با نام isDelete از نوع bool ساختم که هرگاه مقدار آن برابر false شد برنامه آن را به عنوان رکورد حذف شده در نظر میگیرد.
این موردی که فرمودید برای Create درست است اما برای Update میتواند فقط ویرایش آخر را ثبت کند. در صورتی که من تمام فعالیت ها را لازم دارم.
آیا این کاری که گفتم در serilog به طور کامل قابل پیاده سازی هست؟
با درود
برای نگه داری جدول آرشیو-لاگ- میتونین روی جدول اصلی یک تریگر بگذارین و بعد از عملیات update-delete-insert توی اون جدول ارشیو رکورد رو اینسرت کرده و نگهداری کنید.
برای مثال جدول یوزر رو ارشیو درست کردم براش -upre قبل از تغییر -unext بعد از تغییر و del هم حذف
ALTER TRIGGER [dbo].[trg_Z_Users] ON [dbo].[Z_Users]
FOR INSERT, UPDATE, DELETE
AS
--=============================================================================
Select * Into #Inserted_A_users From Inserted
Select * Into #Deleted_A_users From Deleted
--=============================================================================
--=============================================================================================================
Declare @InsertedFlag Bit
Declare @DeletedFlag Bit
If Exists( Select * From #Inserted_A_users )
Begin
Set @InsertedFlag = 1
End
Else
Begin
Set @InsertedFlag = 0
End
If Exists( Select * From #Deleted_A_users )
Begin
Set @DeletedFlag = 1
End
Else
Begin
Set @DeletedFlag = 0
End
If ( @DeletedFlag = 1 ) And ( @InsertedFlag = 1 )
Begin
Insert Into Z_Arch_Z_Users(UserCode, UserName, Password, UserID, DeveloperFlag, Died, ReaderAll, DetailCode, ShowReportSqlBtn, DefaultCompanyId, PersonId,
AuthenticationType, LDAP, LoginFromDate, LoginToDate, LoginFromTime, LoginToTime, CreatedBy, CreatedDate, IsExternalUser, OutboundAccess,
ChangePassword, SmsInbox, TabletSerialId, BaseRPTEditor, ActionDate, StrAppName, EditUserId, HostName, Status)
SELECT UserCode, UserName, Password, UserID, DeveloperFlag, Died, ReaderAll, DetailCode, ShowReportSqlBtn, DefaultCompanyId, PersonId,
AuthenticationType, LDAP, LoginFromDate, LoginToDate, LoginFromTime, LoginToTime, CreatedBy, CreatedDate, IsExternalUser, OutboundAccess,
ChangePassword, SmsInbox, TabletSerialId, BaseRPTEditor,GETDATE(),app_name() , @UserId,host_name(),'UPre'
FROM #Deleted_A_users
Insert Into Z_Arch_Z_Users(UserCode, UserName, Password, UserID, DeveloperFlag, Died, ReaderAll, DetailCode, ShowReportSqlBtn, DefaultCompanyId, PersonId,
AuthenticationType, LDAP, LoginFromDate, LoginToDate, LoginFromTime, LoginToTime, CreatedBy, CreatedDate, IsExternalUser, OutboundAccess,
ChangePassword, SmsInbox, TabletSerialId, BaseRPTEditor, ActionDate, StrAppName, EditUserId, HostName, Status)
SELECT UserCode, UserName, Password, UserID, DeveloperFlag, Died, ReaderAll, DetailCode, ShowReportSqlBtn, DefaultCompanyId, PersonId,
AuthenticationType, LDAP, LoginFromDate, LoginToDate, LoginFromTime, LoginToTime, CreatedBy, CreatedDate, IsExternalUser, OutboundAccess,
ChangePassword, SmsInbox, TabletSerialId, BaseRPTEditor,GETDATE(),app_name() , @UserId,host_name(),'UNext'
FROM #Inserted_A_users
End
If ( @DeletedFlag = 1 ) And ( @InsertedFlag = 0 )
Begin
Insert Into Z_Arch_Z_Users(UserCode, UserName, Password, UserID, DeveloperFlag, Died, ReaderAll, DetailCode, ShowReportSqlBtn, DefaultCompanyId, PersonId,
AuthenticationType, LDAP, LoginFromDate, LoginToDate, LoginFromTime, LoginToTime, CreatedBy, CreatedDate, IsExternalUser, OutboundAccess,
ChangePassword, SmsInbox, TabletSerialId, BaseRPTEditor, ActionDate, StrAppName, EditUserId, HostName, Status)
SELECT UserCode, UserName, Password, UserID, DeveloperFlag, Died, ReaderAll, DetailCode, ShowReportSqlBtn, DefaultCompanyId, PersonId,
AuthenticationType, LDAP, LoginFromDate, LoginToDate, LoginFromTime, LoginToTime, CreatedBy, CreatedDate, IsExternalUser, OutboundAccess,
ChangePassword, SmsInbox, TabletSerialId, BaseRPTEditor,GETDATE(),app_name() , @UserId,host_name(),'Del'
FROM #Deleted_A_users
End
ببخشید اینها رو چطور در برنامه من باید استفاده کنم؟
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
54
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
93
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1347
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|
تاریخ :
1403/07/26
- ساعت :
09:00:00 PM
- بازدید :
116
- پاسخ :
0
|
تاریخ :
1403/05/16
- ساعت :
09:57:00 AM
- بازدید :
394
- پاسخ :
2
|
تاریخ :
1403/06/25
- ساعت :
11:39:00 PM
- بازدید :
561
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
54
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
93
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1347
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|