Tracking changes in a SQL server 2005 database

前端 未结 8 1543
既然无缘
既然无缘 2020-12-29 00:05

I have been tasked with developing a solution that tracks changes to a database.

For updates I need to capture:

  • date of update
  • old value
8条回答
  •  遥遥无期
    2020-12-29 00:42

    I would suggest you to use 2 column's in every table. names rowhistory and IsDeleted and the data type will be xml and bit. Never delete the rows, always use flag IsDeleted Now go with update triggers. I will give you example for the same I have this one table called Page

        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]
    

    Now after creating the table all you need to do is copy paste the below code and your task is done for Page table. It will start recording the history of the row in the same row which is updated along with old and new values.

                    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,'&','&')
            set @old_Name = Replace(@old_Name,'>','>')  
            set @old_Name = Replace(@old_Name,'<','<')     
            set @old_Name = Replace(@old_Name,'"','"')
            set @old_Name = Replace(@old_Name,'''',''')          
    
            set @new_Name = Replace(@new_Name,'&','&')      
            set @new_Name = Replace(@new_Name,'>','>')  
            set @new_Name = Replace(@new_Name,'<','<')     
            set @new_Name = Replace(@new_Name,'"','"')
            set @new_Name = Replace(@new_Name,'''',''') 
    
            set @old_Description = Replace(@old_Description,'&','&')
            set @old_Description = Replace(@old_Description,'>','>')  
            set @old_Description = Replace(@old_Description,'<','<')     
            set @old_Description = Replace(@old_Description,'"','"')
            set @old_Description = Replace(@old_Description,'''',''')          
    
            set @new_Description = Replace(@new_Description,'&','&')      
            set @new_Description = Replace(@new_Description,'>','>')  
            set @new_Description = Replace(@new_Description,'<','<')     
            set @new_Description = Replace(@new_Description,'"','"')
            set @new_Description = Replace(@new_Description,'''',''')   
    
            set @xml = ''     
    
            BEGIN      
    
            -- for Name  
            If ltrim(rtrim(IsNull(@new_Name,''))) != ltrim(rtrim(IsNull(@old_Name,'')))    
            set @xml = @xml + ''    
    
            -- for Description  
            If ltrim(rtrim(IsNull(@new_Description,''))) != ltrim(rtrim(IsNull(@old_Description,'')))    
            set @xml = @xml + ''    
    
            -- CreatedDate     
            If IsNull(@new_CreatedDate,'') != IsNull(@old_CreatedDate,'')  
            set @xml = @xml + ''    
    
            -- 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 + ''    
    
            -- UpdatedDate       
            If IsNull(@new_UpdatedDate,'') != IsNull(@old_UpdatedDate,'')    
            set @xml = @xml + ''    
    
            -- 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 + ''    
    
            -- IsDeleted  
            If cast(IsNull(@new_IsDeleted,'') as varchar(10)) != cast(IsNull(@old_IsDeleted,'') as varchar(10))    
            set @xml = @xml + ''    
    
            END    
    
            Set @xml = '' + @xml + ''    
            Select @ishistoryexists = RowHistory From DELETED     
    
            --print @ishistoryexists  
    
    
            If @ishistoryexists is null    
            Begin     
            Set @xml = '' + @xml + ''      
            Update te_Page    
            Set    
            RowHistory = @xml    
            Where     
            Id = @FormLineAttributeValueId    
    
            End    
    
            Else    
            Begin     
            set @xml = REPLACE(@currentxml, '', '' + @xml)  
            Update te_Page  
            Set  
            RowHistory = @xml  
            Where   
            Id = @FormLineAttributeValueId     
            End  
    
    
            FETCH NEXT FROM curFormId INTO @fmId  
            END   
    
    
            CLOSE curFormId  
            DEALLOCATE curFormId  
    

    Now whenever you will perform any update your data will be stored in rowhistory column

提交回复
热议问题