문제

내가가 부여된 개발 솔루션을 추적하는 데이터베이스에 대한 변경 내용.

를 위한 업데이트가 필요하 캡쳐:

  • 날짜 업데이트
  • 오래된 가치
  • 새로운 값
  • 영향 분야
  • 사람을 변화
  • 레코드 id
  • 테이블 레코

에 대한 삭제:

  • 일의 삭제
  • 하는 사람 삭제
  • 제목/기술/id 의 기록을 삭제합니다.테이블 나 추적 변화에 모든 제목이 있거나 설명 필드입니다.고 싶을 캡처하기 전에 이 기록은 삭제됩니다.
  • 테이블 레코드에서

를 위한 삽입:

  • 날짜의 삽입
  • 사람을 변화
  • 레코드 id
  • 테이블 레코

나는 생각의 몇 가지 방법이 이렇게하려면:

  • 나는에 대해 저장 프로시저를 사용하면 어떤 업데이트/삭제/삽입합니다.을 만들 것이 일반적인""추적 테이블.그것이 충분한 분야를 캡처하는 모든 데이터입니다.나는 다음을 추가 또 다른 라인에 저장된 각 proc 의 효과에"삽입하는 기록으로 추적 테이블".
    • 단점:모든 업데이트/삭제/삽입하는 모든이 뒤죽박죽에서 동일한 테이블
    • 많은 널링 필드
    • 나는 어떻게 추적하는 일괄 업데이트/삭제/삽입?<----이 되지 않을 수도 있습니다 문제입니다.나는 하지 않고 어떤 것 같이 이용합니다.
    • 어떻게 캡처하는 사용자 업데이트합니다.데이터베이스를 본다면 하나의 계정에 적용됩니다.
    • 편집 많은 기존의 코드를 편집할 수 있습니다.
  • 마지막으로,내가 만들 수 있는 트리거라고 후 업데이트/삭제/삽입합니다.많은 동일한 단점으로 첫 번째 솔루션을 제외하고:하는 편집으로 많은 코드입니다.나는 확실하지 않다는 것과 방법을 추적 업데이트됩니다.그것처럼 보이지 않는 방법이 있 트리거를 사용하시는 최근 업데이트 레코드입니다.

내가 사용하고 asp.net C#,sql server2005,lls6 에,windows2003.내가 예산이 없다 그래서 슬프게도 나는 살 수 없는 것도 도움이.

감사에 대한 답변!

도움이 되었습니까?

해결책

방아쇠에는 여러 가지 이유에 필요한 모든 정보가 없지만 사용자 ID는 클린 처가 아닙니다.

나는 당신이 변화가있을 때마다 삽입하기 위해 일반적인 SP로 올바른 길을 가고 있다고 말하고 싶습니다. 인터페이스를 위해 SP를 표준화하는 경우 게임보다 앞서 있습니다. 추적되지 않은 변경 사항에 몰래 빠져 나가기가 어려울 것입니다.

이를 회계 응용 프로그램에서 감사 트레일과 동등한 것으로보십시오. 이것은 저널입니다. 모든 거래가 기록 된 단일 테이블입니다. 그들은 예금, 인출, 조정 등에 대한 별도의 저널을 구현하지 않을 것이며 이것은 같은 원칙입니다.

다른 팁

나는 문제를 심지는 것을 싫어하고 예산이 없다는 것을 알고 있지만 가장 간단한 솔루션은 SQL Server 2008로 업그레이드하는 것입니다.이 기능이 있습니다. 내장. 나는 당신이 그것을 스스로 사용할 수 없더라도이 질문을 발견하는 다른 사람에게는 적어도 언급되어야한다고 생각했습니다.

(SQL 2008의 배포 가능한 판 중이 기능은 Enterprise에서만 사용할 수 있습니다.)

모든 테이블에 2 개의 열을 사용하는 것이 좋습니다. 이름 rowhistory 그리고 isdeleted 데이터 유형은 XML 및 비트입니다.행을 삭제하지 마십시오. 항상 깃발을 사용하십시오이제 업데이트 트리거로 가십시오. 나는 당신에게 동일하게 예를 들여 줄 것입니다.

    CREATE TABLE te_Page([Id] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](200) NOT NULL, [Description] [varchar](200) NULL,[CreatedBy] [uniqueidentifier] NULL, [CreatedDate] [datetime] NOT NULL, [UpdatedBy] [uniqueidentifier] NULL, [UpdatedDate] [datetime] NULL, [IsDeleted] [bit] NULL, [RowHistory] [xml] NULL, CONSTRAINT [PK_tm_Page] PRIMARY KEY CLUSTERED ([Id] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY]

이제 테이블을 작성한 후 아래 코드를 붙여 넣기 만하면 페이지 테이블에 대한 작업이 수행됩니다. 기존 값과 새로운 값과 함께 업데이트되는 동일한 행에 행의 기록을 기록하기 시작합니다.

                ALTER Trigger [dbo].[Trg_Te_Page]    
        On [dbo].[te_Page]                
        After Update                
        As                 
        --If @@rowcount = 0 Or Update(RowHistory)    
        --Return    

        Declare @xml NVARCHAR(MAX)     
        Declare @currentxml NVARCHAR(MAX)   
        Declare @node NVARCHAR(MAX)    
        Declare @ishistoryexists XML    

        Declare @FormLineAttributeValueId int  

        -- new Values  
        Declare @new_Name varchar(200)  
        Declare @new_Description varchar(200)  

        Declare @new_CreatedBy UNIQUEIDENTIFIER    
        Declare @new_CreatedDate DATETIME    
        Declare @new_UpdatedBy UNIQUEIDENTIFIER    
        Declare @new_UpdatedDate DATETIME    
        Declare @new_IsDeleted BIT  

        --old values  
        Declare @old_Name varchar(200)  
        Declare @old_Description varchar(200)  

        Declare @old_CreatedBy UNIQUEIDENTIFIER    
        Declare @old_CreatedDate DATETIME    
        Declare @old_UpdatedBy UNIQUEIDENTIFIER    
        Declare @old_UpdatedDate DATETIME    
        Declare @old_IsDeleted BIT  


        -- declare temp fmId  
        Declare @fmId int  
        -- declare cursor  
        DECLARE curFormId cursor   
        FOR select Id from INSERTED   
        -- open cursor       
        OPEN curFormId  
        -- fetch row  
        FETCH NEXT FROM curFormId INTO @fmId  

        WHILE @@FETCH_STATUS  = 0   
        BEGIN   

        Select   
        @FormLineAttributeValueId = Id,   
        @old_Name = Name,  
        @old_Description = [Description],  

        @old_CreatedBy = CreatedBy,    
        @old_CreatedDate =CreatedDate,  
        @old_UpdatedBy =UpdatedBy,    
        @old_UpdatedDate =UpdatedDate,  
        @old_IsDeleted  = IsDeleted,  
        @currentxml = cast(RowHistory as NVARCHAR(MAX))  
        From DELETED where Id=@fmId  



        Select      
        @new_Name = Name,  
        @new_Description = [Description],  

        @new_CreatedBy = CreatedBy,    
        @new_CreatedDate =CreatedDate,  
        @new_UpdatedBy =UpdatedBy,    
        @new_UpdatedDate =UpdatedDate,  
        @new_IsDeleted  = IsDeleted  
        From INSERTED where Id=@fmId  

        set @old_Name = Replace(@old_Name,'&','&amp;')
        set @old_Name = Replace(@old_Name,'>','&gt;')  
        set @old_Name = Replace(@old_Name,'<','&lt;')     
        set @old_Name = Replace(@old_Name,'"','&quot;')
        set @old_Name = Replace(@old_Name,'''','&apos;')          

        set @new_Name = Replace(@new_Name,'&','&amp;')      
        set @new_Name = Replace(@new_Name,'>','&gt;')  
        set @new_Name = Replace(@new_Name,'<','&lt;')     
        set @new_Name = Replace(@new_Name,'"','&quot;')
        set @new_Name = Replace(@new_Name,'''','&apos;') 

        set @old_Description = Replace(@old_Description,'&','&amp;')
        set @old_Description = Replace(@old_Description,'>','&gt;')  
        set @old_Description = Replace(@old_Description,'<','&lt;')     
        set @old_Description = Replace(@old_Description,'"','&quot;')
        set @old_Description = Replace(@old_Description,'''','&apos;')          

        set @new_Description = Replace(@new_Description,'&','&amp;')      
        set @new_Description = Replace(@new_Description,'>','&gt;')  
        set @new_Description = Replace(@new_Description,'<','&lt;')     
        set @new_Description = Replace(@new_Description,'"','&quot;')
        set @new_Description = Replace(@new_Description,'''','&apos;')   

        set @xml = ''     

        BEGIN      

        -- for Name  
        If ltrim(rtrim(IsNull(@new_Name,''))) != ltrim(rtrim(IsNull(@old_Name,'')))    
        set @xml = @xml + '<ColumnInfo ColumnName="Name" OldValue="'+ @old_Name + '" NewValue="' + @new_Name + '"/>'    

        -- for Description  
        If ltrim(rtrim(IsNull(@new_Description,''))) != ltrim(rtrim(IsNull(@old_Description,'')))    
        set @xml = @xml + '<ColumnInfo ColumnName="Description" OldValue="'+ @old_Description + '" NewValue="' + @new_Description + '"/>'    

        -- CreatedDate     
        If IsNull(@new_CreatedDate,'') != IsNull(@old_CreatedDate,'')  
        set @xml = @xml + '<ColumnInfo ColumnName="CreatedDate" OldValue="'+ cast(isnull(@old_CreatedDate,'') as varchar(100)) + '" NewValue="' + cast(isnull(@new_CreatedDate,'') as varchar(100)) + '"/>'    

        -- CreatedBy     
        If cast(IsNull(@new_CreatedBy,'00000000-0000-0000-0000-000000000000')as varchar (36)) != cast(IsNull(@old_CreatedBy,'00000000-0000-0000-0000-000000000000')as varchar(36))    
        set @xml = @xml + '<ColumnInfo ColumnName="CreatedBy" OldValue="'+ cast(IsNull(@old_CreatedBy,'00000000-0000-0000-0000-000000000000') as varchar(36)) + '" NewValue="' + cast(isnull(@new_CreatedBy,'00000000-0000-0000-0000-000000000000') as varchar(36))+
        '"/>'    

        -- UpdatedDate       
        If IsNull(@new_UpdatedDate,'') != IsNull(@old_UpdatedDate,'')    
        set @xml = @xml + '<ColumnInfo ColumnName="UpdatedDate" OldValue="'+ cast(IsNull(@old_UpdatedDate,'') as varchar(100)) + '" NewValue="' + cast(IsNull(@new_UpdatedDate,'') as varchar(100)) + '"/>'    

        -- UpdatedBy     
        If cast(IsNull(@new_UpdatedBy,'00000000-0000-0000-0000-000000000000') as varchar(36)) != cast(IsNull(@old_UpdatedBy,'00000000-0000-0000-0000-000000000000') as varchar(36))    
        set @xml = @xml + '<ColumnInfo ColumnName="UpdatedBy" OldValue="'+ cast(IsNull(@old_UpdatedBy,'00000000-0000-0000-0000-000000000000') as varchar(36)) + '" NewValue="' + cast(IsNull(@new_UpdatedBy,'00000000-0000-0000-0000-000000000000') as varchar(36))+
        '"/>'    

        -- IsDeleted  
        If cast(IsNull(@new_IsDeleted,'') as varchar(10)) != cast(IsNull(@old_IsDeleted,'') as varchar(10))    
        set @xml = @xml + '<ColumnInfo ColumnName="IsDeleted" OldValue="'+ cast(IsNull(@old_IsDeleted,'') as varchar(10)) + '" NewValue="' + cast(IsNull(@new_IsDeleted,'') as varchar(10)) + '" />'    

        END    

        Set @xml = '<RowInfo TableName="te_Page" UpdatedBy="' + cast(IsNull(@new_UpdatedBy,'00000000-0000-0000-0000-000000000000') as varchar(50)) +  '" UpdatedDate="' + Convert(Varchar(20),GetDate()) + '">' + @xml + '</RowInfo>'    
        Select @ishistoryexists = RowHistory From DELETED     

        --print @ishistoryexists  


        If @ishistoryexists is null    
        Begin     
        Set @xml = '<History>' + @xml + '</History>'      
        Update te_Page    
        Set    
        RowHistory = @xml    
        Where     
        Id = @FormLineAttributeValueId    

        End    

        Else    
        Begin     
        set @xml = REPLACE(@currentxml, '<History>', '<History>' + @xml)  
        Update te_Page  
        Set  
        RowHistory = @xml  
        Where   
        Id = @FormLineAttributeValueId     
        End  


        FETCH NEXT FROM curFormId INTO @fmId  
        END   


        CLOSE curFormId  
        DEALLOCATE curFormId  

이제 업데이트를 수행 할 때마다 데이터가 저장됩니다. rowhistory

방법 중 하나는 본 적이 처리(though I wouldn't recommend it,정직하게)은 그것을 처리를 통해 저장된 절차에 통과하는 사용자 id/사용자 이름/무엇을 매개 변수로 사용할 수 있습니다.저장 프로시저를 호출하는 것은 로깅하는 절차를 썼 관련 정보를 중앙에 로그 테이블.

여기에는 조금액 하지만...

삽입/업데이트 관련 행(s)었다 테이블에 저장된 XML 데이터를 삽입 업데이트/했다가 성공적으로 완료되었습니다.에 대한 삭제 행 저장된 이전 삭제를 실행하는(비록 사실적으로,그들이 갖고 있을 수 있습니다 그것에서 삭제 문의 출력--적어도 SQL Server2005).

제가 기억하기로는 테이블 단 몇 열:UserID,날짜/시간은 로깅,거래 유형(I/U/D),XML 데이터를 포함하는 관련 행 테이블의 이름 및 주요 핵심 가치(주로 사용되는 빠른 검색을 위해 무엇을 기록 그들이 원하).

많은 방법은 피부는 고양이,하지만...

내가 조언을 유지하는 것은 간단합니다.장 그것은 나중에 알고 보면/때 해야 합니다.

할 수 있는 기능이 있는 경우를 이렇게 자물쇠로 사용할 수만 있을 수행하는 실행 가능한 문 테이블에 저장 프로시저를 통해 다음을 처리하는 로깅(그러나 당신이 원하는)습니다.

우리는 자체적으로 구축했으며 사용자와 PC가 각 추가/업데이트 저장 절차에 전달되었습니다. 그런 다음 원래 레코드 ADN이 변수를 채우고 변수를 전달한 변수와 비교하고 데이터를 테이블에 로그인하는 문제입니다. 삭제의 경우 원산지 테이블 + 타임 스탬프 필드의 사본 만 있으므로 레코드가 실제로 삭제되지 않으며 필요할 때 언제든지 복원 할 수 있습니다 (분명히 FK 관계에 대한 일상적인 검사 삭제).

추가/업데이트 로그 테이블은 dateTime, table_name, column_name, record_id, old_value, new_value, user_id, 컴퓨터처럼 보입니다.

널을 삽입하지 않으므로 빈 문자열로 변환하면 새 항목에는 Old_Value 열에 '{new entry}'가 표시됩니다. Record_id는 해당 단일 레코드 (Field1 + '.' + Field2 + ...)를 고유하게 식별하기 위해 많은 키 열로 구성됩니다.

먼저, 모든 테이블에서 최소한이 열이 데이터 열에 데이터를 연결하고, 사용자 크리팅, DateModified, usermodified에 추가해야합니다. 아마도 "상태"또는 "lastAction"열을 추가하여 실제로 삭제/삽입/업데이트 된 상태로 설정하는 행을 실제로 삭제하지 않도록 할 수 있습니다. 다음으로 첫 번째 테이블의 정확한 사본 인 "히스토리 테이블"을 만들 수 있습니다. 그런 다음 업데이트 또는 삭제에서 트리거 복사에서 삭제 된 테이블 항목을 기록 테이블에 동시에 변경하고, usermodified 및 상태 필드를 변경합니다.

나는 설정에서 SQL 서버는 우리가 사용하는 것망 액세스하는 데이터는 것입 핸들 삽입 업데이트 및 삭제와 함께 대신 트리거합니다.

예를 들어:인 대신 삭제 에서 트리거 뷰 마크를 레코드 기본 테이블에 삭제된 것으로,아기자기하고 필터링을 표시하지 않는 삭제된 레코드.

에서 모든 트리거,업데이트하고 수정 날짜와 사용자 이름입니다.문제는 그는 로그 데이터베이스는 사용자 이름과 동일하지 않은 궁극적으로 응용 프로그램의 사용자 이름입니다.

보기해야키 바인딩에 대한 이해 작동합니다.

DB를 변경하는 사용자 로깅에 대해 : DB에 필요한만큼 많은 SQL 사용자를 만들 수 있으며 프로그램/스크립트에 세션 및 제한/등록 액세스를 사용하는 경우 해당 정보를 사용하여 다른 DB 연결 설정 (IE 사용자 이름)을 시작할 수 있습니다. , DB에서 작업하기 전에.

적어도 PHP-Wise 스크립트에는 가능해야하지만 ASP.NET에는 잘못되었을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top