`
kaka99
  • 浏览: 51985 次
  • 性别: Icon_minigender_1
  • 来自: AC
社区版块
存档分类
最新评论

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

Go 
阅读更多

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

 

CREATE VIEW dbo.V_SystemColumn
AS
SELECT DISTINCT 
      TOP 100 PERCENT dbo.sysobjects.name AS TableName, dbo.sysobjects.id, 
       dbo.sysobjects.xtype, dbo.syscolumns.name AS ColumnName, 
       dbo.syscolumns.colid, dbo.syscolumns.type, dbo.syscolumns.colstat
FROM dbo.sysobjects INNER JOIN
       dbo.syscolumns ON dbo.sysobjects.id = dbo.syscolumns.id
WHERE (dbo.sysobjects.xtype = 'U')
ORDER BY dbo.sysobjects.id, dbo.syscolumns.colid

 

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

 

CREATE VIEW dbo.V_Reference
AS
SELECT DISTINCT 
      TOP 100 PERCENT o1.name AS PK_TABLE_NAME, c1.name AS PK_COLUMN_NAME, 
       o2.name AS FK_TABLE_NAME, c2.name AS FK_COLUMN_NAME
FROM dbo.sysobjects o1 INNER JOIN
       dbo.sysreferences r ON o1.id = r.rkeyid INNER JOIN
       dbo.syscolumns c1 ON o1.id = c1.id AND r.rkey1 = c1.colid INNER JOIN
       dbo.sysobjects o2 ON r.fkeyid = o2.id INNER JOIN
       dbo.syscolumns c2 ON o2.id = c2.id AND r.fkey1 = c2.colid INNER JOIN
       dbo.sysindexes i ON r.rkeyid = i.id AND r.rkeyindid = i.indid
WHERE (permissions(o1.id) <> 0) AND (permissions(o2.id) <> 0)
ORDER BY FK_Table_Name
 

 

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

CREATE Procedure GetColumnValue
@FKTableName Varchar(128),
@FKColumnName Varchar(128),
@FKValue Varchar(8000),
@ReturnValue Varchar(8000) OUTPUT
AS
declare @PkTableName Varchar(128)
declare @PkColumnName Varchar(128)
declare @PkDescriptionName Varchar(128)

declare @SqlText Varchar(8000)
declare @ret varchar(8000)

--获取关联主表的表名和字段名
select @PkTableName=Pk_Table_Name,@PkColumnName=Pk_Column_Name from V_Reference
  Where FK_Table_Name=@FKTableName and 
         FK_Column_Name=@FKColumnName

if(@PkTableName is null)
begin
  Select @ReturnValue=@FKValue
  return 0
end
else
begin
  Select Top 1 @PkDescriptionName=ColumnName 
    from V_SystemColumn 
    Where TableName=@PkTableName and ColumnName like '%Name'


 Create Table #temp
   (PkDescriptionName Varchar(8000) )


  select @SqlText='   Insert Into #temp Select  '+@PkDescriptionName 
  select @SqlText=@SqlText+'    from '+@PkTableName
  select @SqlText=@SqlText+'   Where '+@PkColumnName+'='+''''+@FKValue+''''

  execute(@SqlText)

  select @ReturnValue=PkDescriptionName from #temp
end
GO

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

CREATE TABLE T_SystemLog (
        TableName            varchar(128) NULL,
        KeyValue             varchar(20) NOT NULL,
        FieldName            varchar(128) NULL,
        OldValue             varchar(8000) NULL,
        NewValue             varchar(8000) NULL,
        Modifier             varchar(20) NULL,
        ModifyDate           datetime NULL DEFAULT CURRENT_TIMESTAMP
)
go

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

CREATE Procedure Logger
@TableName Varchar(128),
@ColumnName Varchar(128),
@KeyValue int,
@OldValue Varchar(8000),
@NewValue Varchar(8000),
@LastModifier Varchar(20)
AS
if(@OldValue<>@NewValue)
begin
  exec GetColumnValue @TableName,@ColumnName,@OldValue,@OldValue Output 
  exec GetColumnValue @TableName,@ColumnName,@NewValue,@NewValue Output
  Insert Into T_SystemLog(TableName,KeyValue,FieldName,OldValue,NewValue,Modifier,ModifyDate)
    Values( @TableName,@KeyValue,@ColumnName,@OldValue,@NewValue,@LastModifier,getdate())
end
GO

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

CREATE trigger uti_corp on T_Corp
for Update
AS
set nocount on
declare @KeyValue int
declare @OldValue Varchar(8000)
declare @NewValue varchar(8000)
declare @LastModifier varchar(8000)

if(update(departmentid))
begin
  select @KeyValue=corpid,@NewValue=departmentid,@LastModifier=LastModifier from inserted
  select @OldValue=departmentid from deleted
  execute Logger 'T_Corp','DepartmentID',@KeyValue,@OldValue,@NewValue,@LastModifier
end
 
分享到:
评论

相关推荐

    触发器实现sql记录

    在很多应用场景中,为了确保数据完整性及可追溯性,我们往往需要记录数据表中的历史变更信息,以便于日后审计或数据分析。例如,在银行系统中,对账户余额的任何更改都需要被记录下来,以便追踪资金流动情况;在电商...

    触发器生成数据库表操作日志

    【触发器生成数据库表操作日志】是一种技术手段,用于记录数据库中特定数据表的DML(数据操作语言)变化,如INSERT、DELETE和UPDATE操作。这种做法在数据库管理中非常常见,尤其对于审计和追踪数据变更历史至关重要...

    用触发器生成数据库表的数据操作日志

    通过触发器,可以记录每次对表的操作详情,包括操作类型、受影响的表名、改动的时间以及具体更改的数据。这有助于跟踪和审计数据库的变化,对于故障排查和数据分析非常有用。 4. SQL Server的sysmessages表: 这...

    sql 在更新某字段后写入日志触发器

    本篇文章将详细介绍如何在SQL Server中创建一个触发器,当某个表中的特定字段被更新时,记录相关信息到另一个表中,以实现类似日志记录的功能。 #### 触发器概述 触发器是SQL Server提供的一种机制,可以在表或视图...

    触发器实现数据同步-毕业设计

    日志法依赖于记录数据库的所有更改来同步数据,API法则允许开发者自定义同步逻辑。冲突检测和避免是同步过程中的关键,包括数据冲突的识别、解决策略(如两阶段提交)以及并发控制机制(如时间戳方法)。 接下来,...

    oracle触发器实现审计功能

    在Oracle 8i/9i版本中,由于内置的审计功能仅能记录谁执行了操作,但无法详细展示数据的变化情况,因此触发器成为了实现细粒度审计的关键手段。 触发器的创建主要涉及以下步骤和类型: 1. DDL(Data Definition ...

    利用SQLServer触发器实现表跟踪.pdf

    触发器是SQL Server数据库管理系统中的一个重要概念,它是一种特殊类型的存储过程,主要用于在数据库中发生数据修改事件(如INSERT、UPDATE、DELETE)时自动执行预定义的SQL语句。触发器可以用来维护数据的完整性和...

    利用 Oracle 系统触发器防止误删除表操作

    为了应对这类问题,可以通过创建Oracle系统触发器来实现对`DROP TABLE`和`TRUNCATE TABLE`命令的监控与阻止。以下详细介绍两种不同的Oracle版本(10g和8i)下如何创建相应的系统触发器。 ### Oracle 10g环境下的...

    利用SQL Server触发器实现表的历史修改痕迹记录

    这种业务需求,我们可以通过数据库的触发器来轻松实现历史记录功能。 本文以SQL Server 2005数据库中的触发器为例(因为手中的项目用的就是这个数据库) 先简单描述一下SQL Server触发器。 SQL Server触发器的...

    基于Oracle存储过程与触发器的三维空间数据日志管理方法.pdf

    总结起来,基于Oracle存储过程与触发器的三维空间数据日志管理方法是一种实用的技术手段,它结合了数据库的内建功能,实现了高效、安全的数据日志管理,特别适合于需要精确记录和监控操作的三维空间数据应用场景。...

    利用高级复制功能和触发器实现数据复制.pdf

    在数据复制场景中,触发器可以用来捕获这些变更,并将它们记录到一个称为重做日志(Redo Log)的结构中。重做日志是复制的关键组件,因为它包含了数据库变更的完整历史,可以用于将变更传播到其他复制站点。 **4. ...

    Oracle触发器在日志管理开发中的应用.pdf

    触发器特别适用于确保数据一致性,例如在多表之间进行复杂的业务逻辑联动更新,或者在数据修改前后执行特定的审计操作。 在日志管理中,触发器可以在数据操作执行前后自动记录相关信息,如操作时间、操作用户、操作...

    数据库触发器学习资料

    数据库触发器是数据库管理系统中的一种重要机制,它允许在数据修改(INSERT、UPDATE或DELETE)时执行特定的SQL代码或存储过程。SQL触发器的概念源自关系数据库理论,用于实现复杂的数据完整性约束,或者在数据发生...

    触发器关键在于几个系统表的应用

    - `sys.fn_dblog` 函数可用于查看事务日志,这在创建审计触发器时尤其重要,可以追踪到每一个数据修改的详细信息。 - `sys.fn_get_audit_file` 可以获取审计文件内容,帮助分析和报告触发器的活动。 5. **触发器...

    三种触发器的执行流程

    - **审计跟踪**:使用触发器记录数据更改的时间戳、用户等信息,以便进行审计跟踪。 - **级联操作**:在执行某些操作时自动执行相关的其他操作,如更新相关表中的记录。 总之,触发器作为一种强大的工具,在确保...

    关于oracle触发器before和after的应用问题

    例如,After UPDATE触发器可以用于更新关联表中的统计数据,或记录数据更改的历史记录。 #### DML触发器与替代触发器 - **DML触发器**:这类触发器可在数据操纵语言(DML)操作前或后触发,适用于单个行或整个语句...

    C#中Update触发器在系统日志中的应用

    总结来说,C#中利用Update触发器记录系统日志,可以帮助我们更好地监控数据变动,同时提供了一种在数据库层面进行数据审计的方法。结合C#代码和数据库触发器,可以实现一个完整的日志管理系统,提高应用程序的稳定性...

Global site tag (gtag.js) - Google Analytics