2009-06-24 6 views
0

이전 값과 새 값을 나타내는 양식에서 필드가 변경 될 때마다 데이터베이스에 항목을 추가해야합니다.특정 양식 필드의 변경 사항을 감사하는 가장 좋은 방법은 무엇입니까?

어떻게 하시겠습니까 ??

당신은 ...

  1. 모든 필드에 숨겨진 필드를 추가 한 후 제출이 켜지지 경우 감사 항목을 추가에 새로운 값과 비교겠습니까?

  2. 게시물에 삽입 할 데이터를 선택한 다음 각 속성을 비교하고 감사 항목을 삽입하십시오.

  3. 다른 아이디어?

건배.

+0

당신은 이것을 ASP-Classic, PHP 및 ASP.NET으로 태그 지정했습니다. 어떤거야? –

+0

또한 Javascript 태그가 붙어 있습니다. 정말 나쁜 생각입니다. 이런 일에 클라이언트 측을 사용하지 마십시오. –

+0

고전 ASP에서 서버 측 javascript. – Schotime

답변

0

처음에는 양식을 문자열로 serialize하여 을 작성하고 최신 문자열 인 과 비교하여 변경 사항이 있는지 확인하십시오. 2 개의 문자열이 당신과 아무 관계가 없다면. 당신이 사용하는 경우

FORM_NAME [ 'FIRST_NAME'] ... FORM_NAME [ 'LAST_NAME'] ...

:

나는 []에 의해 명명 양식의 모든 요소가 같은 것을 가정 PHP는 array_diff_assoc을 사용하여 어떤 변화가 있는지 확인할 수 있습니다.

당신이 필요로하는 모든 것은 db 형식의 최신 폼 배열을 저장할 때마다 직렬화 된 문자열로 저장됩니다.

0

데이터베이스에서 업데이트 트리거를 사용하여 비교 및 ​​감사를 수행 할 수 있습니다. (나는 편리한 코드 샘플을 가지고 있지 않다 - 미안).

+0

예 .... 우리는 일례로 그렇게 하긴하지만이 경우에는 적용 할 수 없습니다. – Schotime

+0

다른 제한 사항이 있습니까? 저장 프로 시저를 사용할 수 있습니까? 만약 당신이 내가 옵션 2, 귀하의 애플 리케이션을 유지할 것이라고 저장 프로 시저 (내부)와 함께 갈 수있다 – Antony

+0

당신의 SP 수 있지만 값을 변경 한 사용자를 알 필요가있다. – Schotime

0

사용중인 데이터베이스를 말하지 마십시오. 현재 값을 가져 와서 데이터베이스에 저장하는 프로 시저를 작성할 수 있습니다. 내가 생각하기에 이것을 제안합니다. 이것은 프론트 엔드가 아닌 데이터베이스 측에서 수행되는 비교 작업입니다.

편집 : 안녕하세요, 오라클을 사용하는 경우 절차를 작성하는 것이 쉽습니다. :)

0

당신은 포스트 그레스 또는 테이블에 UPDATE 지점 1의

를 수행 될 때마다 트리거 될 수 있습니다 당신은 쉽게 그 동안 그 작업을 수행하는 함수를 작성할 수있는 기능이있는 다른 데이터베이스를 사용하는 경우, 누군가 자신의 POST 문을 쉽게 만들 수 있으므로 양식에 '숨겨진 필드'를 포함시키는 것은 좋은 생각이 아닙니다.

포인트 2에 대해, 이것은 충분히 쉽게 작동하고 함수를 작성할 수 없으면 사용할 것입니다.

당신은 싶어 것 같은 것을 할 :

  1. 유효성 검사를 그들이 제출하는 것은 비 갱신 된 행
  2. 스토어에서 유효
  3. 선택 정보가 들어있는 폼 데이터와 DB 데이터를 모두 두 가지 예를 $db_data에 대한 배열, $form_data
  4. 에서 함수 array_diff_assoc

    를 사용하여 차이를 가져옵니다

    $ differences = array_diff_assoc ($ db_data, $ form_data);

양식과 db 배열 모두 동일한 키가 있어야합니다.

1

이것을 앱 계층에 보관하려는 경우 로깅을 수행 할 필드 당 속성이있는 모델 레이어를 사용하는 것이 좋습니다. 그러면 모든 데이터 액세스가이 데이터 모델을 거쳐 기능을 추가 할 수 있습니다.

activerecord 기반 예 (VBScript를이) :

class cSomeEntity 
     public db ' link to a db wrapper 
     private id, dirty, loaded ' varous flags 

     private sub class_initialize 
     dirty = false 
     loaded = false 
     end sub 

     private sub class_terminate 
     if dirty then 
      db.execute("update some_table set some_field=? where id=?", array(p_some_field, id)) 
     end if 
     end sub 

     public sub load_by_id(value) 
     dim rs 
     set rs = db.fetch_rs("select id, some_field from some_table where id=?", array(id)) 
     id = rs("id") 
     p_some_field = rs("some_field")   
     loaded = true 
     end sub 

     private p_some_field 
     public property get some_field 
     some_field = p_some_field 
     end property 

     public property let some_field(value) 
     if not loaded then err.raise 1, , "Entity not yet initialized, call .load_by_id() first!" 
     if value <> p_some_field then 
      dirty = true 
      make_log_entry("some_value", p_some_field, value)   
      p_some_field = value  
     end if 
     end property 

     private sub make_log_entry(field, old_value, new_value) 
     db.execute("insert into audit_log (table, field, old_value, new_value) values (?, ?, ?, ?)", _ 
      array("some_table", field, old_value, new_value))  
     end sub 
    end class 

이 약간 부풀어 보일 수도 있지만, 트리거 기반의 접근 방식보다 더 유연하다. 예를 들어 범위 검사 등을 쉽게 구현할 수 있습니다.

둘째, 여러 엔터티 클래스를 작성해야 할 경우 많은 기능을 대리자 클래스에 푸시하고 코드 템플릿을 사용하여 getter & setter 속성을 작성할 수 있습니다.

관련 문제