可以做个函数,记录用户的操作类型,时间等,把这些内容插入到一个表里在所有的菜单里,加上这个函数,把菜单名传个那个函数

解决方案 »

  1.   

    为每一个表写触发器. 记录insert/update/delete操作./*--记录表的新增/修改/删除

    演示了如何通过触发器来记录来表的操作情况
    并记录了数据操作的明细资料
    操作员由前台在处理时,传递到 operator 表中
    触发器通过取该表数据得到当前操作的操作员
    演示了如何得到修改触发器中,如果取得被修改字段的字段名

    如果在每个工作站,只会有一个客户端软件打开
    则可以只在登录客户端软件时,注册当前用户
    而不需要每次操作时,都在 operato 中登记操作员--邹建 2004.08--*/--示例--操作记录主表
    create table Log_main(
    编号 int identity(1,1),
    修改人 varchar(10),
    表名 sysname,
    动作 char(4),
    时间 datetime default getdate()
    )--操作记录明细表
    create table Log_record(
    编号 int,
    字段 sysname,
    修改前值 sql_variant, --记录新增或修改前的值
    修改后值 sql_variant --记录删除或修改后的值
    )--为传递操作员而设置的辅助表
    create table operator(
    操作员 varchar(10),
    时间 datetime default getdate(),
    工作站号 char(8) default host_id(),
    登录名 sysname default suser_sname()
    )
    go--处理示例表
    create table 表A(ID int,NAME varchar(10),AGE int,SEX bit)
    go--记录的触发器
    --记录新增操作
    create trigger tr_表A_reinsert on 表A
    for insert
    as
    set rowcount 1
    insert Log_main(修改人,表名,动作)
    select 操作员,'表A','新增' from operator
    where 工作站号=host_id() and 登录名=suser_sname()
    order by 时间 desc
    set rowcount 0
    insert Log_record(编号,字段,修改前值)
    select scope_identity(),'ID',cast(id as sql_variant) from inserted
    union all
    select scope_identity(),'NAME',cast(NAME as sql_variant) from inserted
    union all
    select scope_identity(),'AGE',cast(AGE as sql_variant) from inserted
    union all
    select scope_identity(),'SEX',cast(SEX as sql_variant) from inserted
    go--记录删除操作
    create trigger tr_表A_redelete on 表A
    for delete
    as
    set rowcount 1
    insert Log_main(修改人,表名,动作)
    select 操作员,'表A','删除' from operator
    where 工作站号=host_id() and 登录名=suser_sname()
    order by 时间 desc
    set rowcount 0
    insert Log_record(编号,字段,修改后值)
    select scope_identity(),'ID',cast(id as sql_variant) from deleted
    union all
    select scope_identity(),'NAME',cast(NAME as sql_variant) from deleted
    union all
    select scope_identity(),'AGE',cast(AGE as sql_variant) from deleted
    union all
    select scope_identity(),'SEX',cast(SEX as sql_variant) from deleted
    go--记录修改操作
    create trigger tr_表A_reupdate on 表A
    for update
    as
    select mid=identity(int,1,1),* into #i from inserted
    if @@rowcount=0 return
    select mid=identity(int,1,1),* into #d from deleteddeclare @id int,@s nvarchar(4000)declare #tb cursor local for
    select 'insert Log_record(编号,字段,修改前值,修改后值)
    select @id,'''+name
    +''',cast(d.['+replace(name,']',']]')+'] as sql_variant)'
    +',cast(i.['+replace(name,']',']]')+'] as sql_variant)
    from #d d,#i i where i.mid=d.mid'
    from syscolumns 
    where id=object_id('表A')
    and (substring(columns_updated(),(colid-1)/8+1,1)
    &power(2,(colid-1)%8))=power(2,(colid-1)%8)
    order by colidset rowcount 1
    insert Log_main(修改人,表名,动作)
    select 操作员,'表A','修改' from operator
    where 工作站号=host_id() and 登录名=suser_sname()
    order by 时间 desc
    set rowcount 0
    set @id=scope_identity()open #tb
    fetch #tb into @s
    while @@fetch_status=0
    begin
    exec sp_executesql @s,N'@id int',@id
    fetch #tb into @s
    end
    close #tb
    deallocate #tb
    go--插入记录
    --插入前,先传递操作员给触发器
    insert operator(操作员) values('admin')
    insert 表A select  1,'CHRI',21,1
    insert 表A select  2,'AAAA',22,0
    union  all select  3,'BBBB',23,1
    go--修改记录
    --修改前,先传递操作员给触发器
    insert operator(操作员) values('admin')
    update 表A set AGE=28,SEX=0
    where id=2
    go--删除记录
    --修改前,先传递操作员给触发器
    insert operator(操作员) values('我')
    delete from 表A where id=3go--显示记录结果
    select * from Log_main
    select * from Log_record
    go--删除测试
    drop table 表A,Log_main,Log_record,operator/*--测试结果编号     修改人      表名  动作   时间                    
    -------- ---------- ----- ----- ------------------------
    1        admin      表A   新增   2004-08-05 21:17:50.257
    2        admin      表A   新增   2004-08-05 21:17:50.277
    3        admin      表A   修改   2004-08-05 21:17:51.410
    4        我         表A   删除   2004-08-05 21:17:51.490(所影响的行数为 4 行)编号         字段   修改前值     修改后值     
    ----------- ------ ------------ ------------
    1           ID     1            NULL
    1           NAME   CHRI         NULL
    1           AGE    21           NULL
    1           SEX    1            NULL
    2           ID     2            NULL
    2           ID     3            NULL
    2           NAME   AAAA         NULL
    2           NAME   BBBB         NULL
    2           AGE    22           NULL
    2           AGE    23           NULL
    2           SEX    0            NULL
    2           SEX    1            NULL
    3           AGE    22           28
    3           SEX    0            0
    4           ID     NULL         3
    4           NAME   NULL         BBBB
    4           AGE    NULL         23
    4           SEX    NULL         1(所影响的行数为 18 行)
    --*/