数据库ABC 里的所有用户表(不包括后面说的TMPDB表)如果发生了记录的变化,如:插入,更新,删除时,就向表TMPDB插入对应的数据,TMPDB表字段如下:
 TblName(表名),States(标识,0=插入,1=更新,2=删除) ,Indate(日期,自动的getdate)

解决方案 »

  1.   

    -- 如果在数据库中实现, 则需要为每个要记录的用户表写触发器:create trigger tr_record on 表名
    for insert,update,delete
    as
    if @@rowcount = 0 
    return
    declare @States int
    if exists(select * from inserted)
    if exists(select * from deleted)
    set @States=1
    else
    set @States=0
    else
    set @States = 2
    insert tempdb(TblName, States)
    values('表名', @States)
    go
      

  2.   

    你通过一个循环+动态SQL语句, 
    从而对每个用户表分别写inset, delete, update触发器吧
    但是这样看起来不是很好, 如果有N张表,就会生成3*N个触发器了。我建议,你还是再看看,你的需求是否合理吧。
    或是用审计吧
      

  3.   

    -- 所有表上创建触发器
    declare hcforeach cursor global
    for
    select cast(N'
    create trigger '
    +cast(quotename('tr_record_'+name) as varchar(8000))
    +' on '+cast(quotename(user_name(uid)) as varchar(8000))
    +'.'+cast(quotename(name) as varchar(8000))+'
    for insert,update,delete
    as
    if @@rowcount = 0 
    return
    declare @States int
    if exists(select * from inserted)
    if exists(select * from deleted)
    set @States=1
    else
    set @States=0
    else
    set @States = 2
    insert tempdb(TblName, States)
    values('+cast(quotename(name,'''') as varchar(8000))+', @States)
    ' as varchar(8000))
    from dbo.sysobjects
    where objectproperty(id, 'isusertable')=1
    and name<>'tempdb'
    exec sp_msforeach_worker '?'
      

  4.   

    -- 删除所有的触发器.
    declare hcforeach cursor global
    for
    select N'
    drop trigger '
    +cast(quotename('tr_record_'+name) as varchar(8000))
    from dbo.sysobjects
    where objectproperty(id, 'isusertable')=1
    and name<>'tempdb'
    exec sp_msforeach_worker '?'