1

現在、ASP.Net MVC 4 アプリケーションに取り組んでいます。アプリケーションでのユーザーによるすべての変更をログに記録するように求められました。その何もないAudit Trail

これが私のコントローラーコードです

 public ActionResult SaveBasicInfo(PatientBasicInfoViewModel basicInfoViewModel)
    {

        if (ModelState.IsValid)
        {
            var loggedInUserPersonId = ((User)Session["CurrentUser"]).PersonId;
            long tenantId = TenantContext.TenantId;
            var patient = Mapper.Map<PatientBasicInfoViewModel,
                                    Patient>(basicInfoViewModel);
            patient.TenantId = tenantId;

            if (patient.PatientId > 0)
            {
                patient.UpdatedBy = loggedInUserPersonId;
                patient.UpdatedDateTime = DateTime.Now;
                patientService.UpdatePatientDetails(patient);                  
                //Here need to do Audit Log 
                //Current User modified this fields values from `xx` to `yy` on               
            }
            else
            {
                patient.AddedBy = loggedInUserPersonId;
                patientService.AddPatient(patient);
               // Here need to Log, This user created this patient record on Date
            }


          return RedirectToAction("Details", new { id = patient.PatientId });
        }

        return RedirectToAction("Details");
    }

すべての組み合わせに対して柔軟なテーブル構造を設計するのを手伝ってくれる人がいますか。

また、古い値と新しい値の両方をログに記録するにはどうすればよいですか?

監査証跡を取得するためのデータベース設計に関するアイデアも参照しましたが、取得できませんでした:(

代替ソリューション:監査が必要なテーブルごとにシャドウ/履歴テーブルを作成し、データベース トリガーを使用します。ここで説明します。

これに関する問題は、この列の値がこのユーザーによってこの値から別の値に変更されたことをどのように知ることができますか? ユーザーごとに、また記録のためにすべての履歴を表示する必要があります

注: Entity Framework は使用していません。単純なストアド プロシージャと ADO.Net を使用し、POCO クラスを使用しています。

ここで参照されている以下から最適なものを選択するのを手伝ってください

  1. 監査対象のテーブルごとに個別の「履歴」テーブル

  2. 変更が追跡されているすべてのテーブルの統合された「履歴」テーブル

4

2 に答える 2

1

Ado.NET で

DataTable を使用してデータを取得できます。

次を使用して、データテーブルで変更された行の完全な変更セットを取得できます。

 DataTable ChangedDataTable= yourdataTable.GetChanges(DataRowState.Modified);

次に、DataRowVersion を使用して、変更された各行の元のバージョンと現在のバージョンを取得できます。

DataRowObject[0, DataRowVersion.Original] //by Column index
DataRowObject["ColumnName", DataRowVersion.Original] //by column name 
于 2013-10-10T15:38:10.680 に答える