通过触发器实现记录数据的修改日志

http://kaka99.iteye.com/blog/1059362

1、先为数据库建立一个字段试图,所有数据都是从系统表中提取,便于以后用户可以扩展系统功能。

 

Java代码   收藏代码
  1. CREATE VIEW dbo.V_SystemColumn  
  2. AS  
  3. SELECT DISTINCT   
  4.       TOP 100 PERCENT dbo.sysobjects.name AS TableName, dbo.sysobjects.id,   
  5.        dbo.sysobjects.xtype, dbo.syscolumns.name AS ColumnName,   
  6.        dbo.syscolumns.colid, dbo.syscolumns.type, dbo.syscolumns.colstat  
  7. FROM dbo.sysobjects INNER JOIN  
  8.        dbo.syscolumns ON dbo.sysobjects.id = dbo.syscolumns.id  
  9. WHERE (dbo.sysobjects.xtype = 'U')  
  10. ORDER BY dbo.sysobjects.id, dbo.syscolumns.colid  

 

 2、建立一个各个表之间关联的视图。

 

Sql代码   收藏代码
  1. CREATE VIEW dbo.V_Reference  
  2. AS  
  3. SELECT DISTINCT   
  4.       TOP 100 PERCENT o1.name AS PK_TABLE_NAME, c1.name AS PK_COLUMN_NAME,   
  5.        o2.name AS FK_TABLE_NAME, c2.name AS FK_COLUMN_NAME  
  6. FROM dbo.sysobjects o1 INNER JOIN  
  7.        dbo.sysreferences r ON o1.id = r.rkeyid INNER JOIN  
  8.        dbo.syscolumns c1 ON o1.id = c1.id AND r.rkey1 = c1.colid INNER JOIN  
  9.        dbo.sysobjects o2 ON r.fkeyid = o2.id INNER JOIN  
  10.        dbo.syscolumns c2 ON o2.id = c2.id AND r.fkey1 = c2.colid INNER JOIN  
  11.        dbo.sysindexes i ON r.rkeyid = i.id AND r.rkeyindid = i.indid  
  12. WHERE (permissions(o1.id) <> 0) AND (permissions(o2.id) <> 0)  
  13. ORDER BY FK_Table_Name  
 

 

3、创建一个存取过程,参数为:表名、列名、Insert.列名的值、返回参数

Sql代码   收藏代码
  1. CREATE Procedure GetColumnValue  
  2. @FKTableName Varchar(128),  
  3. @FKColumnName Varchar(128),  
  4. @FKValue Varchar(8000),  
  5. @ReturnValue Varchar(8000) OUTPUT  
  6. AS  
  7. declare @PkTableName Varchar(128)  
  8. declare @PkColumnName Varchar(128)  
  9. declare @PkDescriptionName Varchar(128)  
  10.   
  11. declare @SqlText Varchar(8000)  
  12. declare @ret varchar(8000)  
  13.   
  14. --获取关联主表的表名和字段名  
  15. select @PkTableName=Pk_Table_Name,@PkColumnName=Pk_Column_Name from V_Reference  
  16.   Where FK_Table_Name=@FKTableName and   
  17.          FK_Column_Name=@FKColumnName  
  18.   
  19. if(@PkTableName is null)  
  20. begin  
  21.   Select @ReturnValue=@FKValue  
  22.   return 0  
  23. end  
  24. else  
  25. begin  
  26.   Select Top 1 @PkDescriptionName=ColumnName   
  27.     from V_SystemColumn   
  28.     Where TableName=@PkTableName and ColumnName like '%Name'  
  29.   
  30.   
  31.  Create Table #temp  
  32.    (PkDescriptionName Varchar(8000) )  
  33.   
  34.   
  35.   select @SqlText='   Insert Into #temp Select  '+@PkDescriptionName   
  36.   select @SqlText=@SqlText+'    from '+@PkTableName  
  37.   select @SqlText=@SqlText+'   Where '+@PkColumnName+'='+''''+@FKValue+''''  
  38.   
  39.   execute(@SqlText)  
  40.   
  41.   select @ReturnValue=PkDescriptionName from #temp  
  42. end  
  43. GO  

 4、为系统创建记录日志的表

Sql代码   收藏代码
  1. CREATE TABLE T_SystemLog (  
  2.         TableName            varchar(128) NULL,  
  3.         KeyValue             varchar(20) NOT NULL,  
  4.         FieldName            varchar(128) NULL,  
  5.         OldValue             varchar(8000) NULL,  
  6.         NewValue             varchar(8000) NULL,  
  7.         Modifier             varchar(20) NULL,  
  8.         ModifyDate           datetime NULL DEFAULT CURRENT_TIMESTAMP  
  9. )  
  10. go  

 5、创建日志记录存取过程

Sql代码   收藏代码
  1. CREATE Procedure Logger  
  2. @TableName Varchar(128),  
  3. @ColumnName Varchar(128),  
  4. @KeyValue int,  
  5. @OldValue Varchar(8000),  
  6. @NewValue Varchar(8000),  
  7. @LastModifier Varchar(20)  
  8. AS  
  9. if(@OldValue<>@NewValue)  
  10. begin  
  11.   exec GetColumnValue @TableName,@ColumnName,@OldValue,@OldValue Output   
  12.   exec GetColumnValue @TableName,@ColumnName,@NewValue,@NewValue Output  
  13.   Insert Into T_SystemLog(TableName,KeyValue,FieldName,OldValue,NewValue,Modifier,ModifyDate)  
  14.     Values( @TableName,@KeyValue,@ColumnName,@OldValue,@NewValue,@LastModifier,getdate())  
  15. end  
  16. GO  

 6、为需要记录修改日志的表创建Insert、Update触发器

Sql代码   收藏代码
  1. CREATE trigger uti_corp on T_Corp  
  2. for Update  
  3. AS  
  4. set nocount on  
  5. declare @KeyValue int  
  6. declare @OldValue Varchar(8000)  
  7. declare @NewValue varchar(8000)  
  8. declare @LastModifier varchar(8000)  
  9.   
  10. if(update(departmentid))  
  11. begin  
  12.   select @KeyValue=corpid,@NewValue=departmentid,@LastModifier=LastModifier from inserted  
  13.   select @OldValue=departmentid from deleted  
  14.   execute Logger 'T_Corp','DepartmentID',@KeyValue,@OldValue,@NewValue,@LastModifier  
  15. end  
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值