2016-07-04 6 views
1

SQL Server 데이터베이스의 일부 테이블에서 CRUD 작업을 실행하는 웹 응용 프로그램에서 작업하고 있습니다. 이러한 작업을 실행하는 응용 프로그램에 로그인 한 사용자가 있습니다. 감사 테이블에 대한 트리거 삭제

이 (그건 그렇고, 내가 엔티티 프레임 워크를 사용하고 있습니다)

는의 테이블이는 lastmodifieddate

  • SomeColumn
  • 을 LastModifiedUserId MyTableId

    을 MyTable입니다 가정 해 봅시다

그리고 a는

MyTableHistory

  • 같은 감사 테이블이
  • 이 MyTableId MyTableHistoryId이
  • SomeColumn
  • ActionType --ins/UPD/델
  • 액션 사용자
  • ActioDate

그리고 감사 테이블에 데이터를 삽입하는 트리거를 사용하고 있습니다.

삽입 및 업데이트 된 테이블을 참조하여 레코드를 수정 한 사용자 아이디를 쉽게 찾아서 삽입 및 업데이트 할 수 있습니다.

하지만 삭제는 어떻게해야합니까? 내가 어떻게 그 정보를 얻을 수 있는지 어떤 생각?

+0

에서,'INSERTED' 의사 테이블이 있지만 아닌'UPDATED' 하나 아래 하나가 SaveChanges 방법을 재정 의하여이 작업을 수행하는 방법의 예입니다. 'DELETED' 의사 테이블도 있습니다 – Lamak

+0

하지만 DELETED는 레코드를 삭제 한 사람이 아닌 레코드를 마지막으로 업데이트 한 LastModifiedUserId를 갖습니다. 그게 내가 원하는거야 – DJPB

+0

'suser_sname()'은 쿼리를 실행 한 계정 이름이다. –

답변

0

updated 테이블과 같은 것이 없습니다. DML 트리거에서 사용할 수있는 두 개의 의사 테이블은 inserteddeleted입니다. insert 테이블의 경우 deleted이 비어 있고 delete 테이블의 경우 inserted이 비어있는 경우 update의 경우 두 테이블이 채워집니다.
각 작업에 대해 세 개의 별도 트리거를 만들거나 (ActionType을 구별하기 위해) 하나의 트리거를 모두 조합하려고 할 수 있습니다.
참고 :은 여러 행 동작을 고려합니다.

0

EF를 사용하여 레코드를 업데이트하는 사용자에 대한 정보를 추가한다고 가정하면 삭제하려는 데이터에 대해 EF가 2 단계 프로세스 (UPDATE, DELETE)를 수행하도록하는 것이 가장 쉽습니다. 그런 다음 동일한 조작의 일부로 두 감사 행을 해석해야합니다.

"할 수있는"해결책이 있지만 테스트하지는 않았습니다. 탐구하고 싶다면 아래에 더 많은 정보가 있습니다.Blog describing the solution

  • Stack Overflow post of someone trying it
  • 또 다른 옵션은 모두 (이 매우 이유로 문제가) 트리거 감사를 포기하고 대신 엔티티 프레임 워크를 사용하는 것입니다

    • . 당신이 말한대로

      public virtual IEnumerable<System.Data.Entity.Infrastructure.DbEntityEntry> ChangedEntries() 
      { 
          return ChangeTracker.Entries().Where(x => 
           x.State == EntityState.Added || 
           x.State == EntityState.Deleted || 
           x.State == EntityState.Modified); 
      } 
      
      public virtual int SaveChanges(string userName) 
      { 
          var changes = ChangedEntries(); 
      
          foreach (var entry in changes) 
          { 
           var eventType = entry.State == EntityState.Added ? "A" : entry.State == EntityState.Deleted ? "D" : "U"; 
           var entityType = ObjectContext.GetObjectType(entry.Entity.GetType()).Name; 
      
           var oldValues = entry.State == EntityState.Added ? null : JsonConvert.SerializeObject(entry.OriginalValues.ToObject()); 
           var newValues = entry.State == EntityState.Deleted ? null : JsonConvert.SerializeObject(entry.CurrentValues.ToObject()); 
      
           oldValues = oldValues?.Substring(0, Math.Min(oldValues.Length, 4000)); 
           newValues = newValues?.Substring(0, Math.Min(newValues.Length, 4000)); 
      
           AuditItems.Add(
            new AuditItem 
            { 
             EventTime = DateTime.Now, 
             UserName = userName, 
             EntityType = entityType, 
             EventType = eventType, 
             OldValues = oldValues, 
             NewValues = newValues 
            } 
           ); 
          } 
      
          return base.SaveChanges(); 
      }