CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

zjcxc(邹建)兄弟:如果这个东西你解决了,我真的佩服你了!

楼主czyoooo(按时)2004-08-03 15:53:48 在 MS-SQL Server / 基础类 提问

问题是这样的:在修改表的时候我希望记录下操作者的姓名,动作,时间,类似于他什么时候做什么动作,快照一样,以后我可以随时查找!  
  例如:表A(ID,NAME,AGE,SEX)  
  操作员在表OPERATOR中  
  如果ADMIN在2004-08-05  
                          修改   表A(ID     NAME       AGE     SEX)  
                                              1       CHRI     20         1     //初始值  
                        修改后           1       CHRI     28         0  
   
  我要记录下这个动作:  
  主表:  
                    编号     修改人     表名     动作     时间  
                    1001     admin       表A       修改     2004-08-05  
  明细:       编号     字段     原值     修改后值  
                  1001       age         20         28  
                  1001       sex           1           0  
   
  怎么写这个存储过程,另外如果是同时修改两张联结表,类似情况又怎么处理! 问题点数:100、回复次数:85Top

1 楼zheninchangjiang(徐若涵)回复于 2004-08-03 15:56:04 得分 0

牛人,自信。这个问题会做的人很多!!!!!!Top

2 楼yesterday2000(一笑而过)回复于 2004-08-03 15:57:59 得分 0

呵呵!!Top

3 楼pbsql(风云)回复于 2004-08-03 15:58:28 得分 0

同上Top

4 楼skyboy0720(曲终人散)回复于 2004-08-03 16:04:28 得分 0

 
   
  Top

5 楼zjcxc(邹建)回复于 2004-08-03 16:11:20 得分 0

这个记录好做,明细记录不好做,每个表都要求记录,而每个表的结构又不可能完全一样.  
   
  那明细记录应该怎么记录呢?Top

6 楼zjcxc(邹建)回复于 2004-08-03 16:12:32 得分 0

修改人,如果是你自己设计的,用你的数据库中的表去维护的用户,则这个用户还要通过前台传递到触发器中,这也是一个比较难的问题.  
   
   
  Top

7 楼zjmym(缘木)回复于 2004-08-03 16:13:28 得分 0

:)Top

8 楼yefengdn(我爱我家)回复于 2004-08-03 16:13:37 得分 0

严重关切ing......Top

9 楼zjcxc(邹建)回复于 2004-08-03 16:15:17 得分 0

而且的话,楼主要考虑有没有那么多精力来为每个表写记录的触发器.  
   
   
  我还是觉得直接用事件探察器来监控记录比较好.Top

10 楼rea1gz(冒牌realgz V0.4)回复于 2004-08-03 16:15:44 得分 0

1、用存储过程确实难,不过可以理解为触发器是特殊的存储过程。  
  2、记录操作员不安全,因为操作员密码可能被盗,记录客户端机器名,ip地址,应用程序,更有意义。  
  3、建议不要记录得太详细,否则影响速度,得不偿失。  
  Top

11 楼rea1gz(冒牌realgz V0.4)回复于 2004-08-03 16:17:26 得分 0

说完这么多,冒牌的该说的都说了,就等着正牌接受挑战了  
   
  哈哈,看热闹是冒牌最喜欢的事情之一  
  Top

12 楼czyoooo(按时)回复于 2004-08-03 16:32:16 得分 0

zjcxc(邹建)   兄弟:  
                                  我在程序界面可以传“修改人”到数据库,但是如何比较我就不知道怎么做了,触发器虽然解决了比较问题,但是参数传不进去,而且每个表都用触发器,占用资源太多,如果可以用存储过程就比较好了,不知道你是否有主意了!  
                                                      礼上Top

13 楼yefengdn(我爱我家)回复于 2004-08-03 16:37:05 得分 0

"我还是觉得直接用事件探察器来监控记录比较好.",如何实现?洗耳静听Top

14 楼rouqu(石林#黄果树)回复于 2004-08-03 16:47:26 得分 0

"我还是觉得直接用事件探察器来监控记录比较好.",如何实现?****  
  ------打开就用呗  
  Top

15 楼yelang771(牧野流星)回复于 2004-08-03 16:50:59 得分 0

up..Top

16 楼rea1gz(冒牌realgz V0.4)回复于 2004-08-03 16:51:37 得分 0

程序界面可以传“修改人”到数据库  
   
  如果不是通过程序修改的呢?我想这个日志记录如果只记录程序修改的记录,用处就不大了  
  Top

17 楼rouqu(石林#黄果树)回复于 2004-08-03 16:56:53 得分 0

楼上的很有道理哦Top

18 楼czyoooo(按时)回复于 2004-08-03 16:57:22 得分 0

本来是一个很简单的问题,应该大家在现实中都会碰到,我也就此问过SYBASE,不过哪个技术人员也答不上来,这是两年前的事情了,最近不知道哪个神经碰上了,决定彻底的解决一些遗留下来的问题,所以发了这个贴,没想到大家这么热情,在此先表示感谢了,如果大家有什么想法可以和我联系,我的MSN是pool_fish@hotmail.com,最好标明SQLSERVER,谢谢!Top

19 楼GoldShield(李柏岑)回复于 2004-08-03 17:48:25 得分 0

有意思了Top

20 楼zjcxc(邹建)回复于 2004-08-03 17:51:45 得分 0

不用触发器无法监控表中数据的变化.  
   
  Top

21 楼Alern(李小虎)回复于 2004-08-03 17:54:48 得分 0

用触发器:  
          写入一个日志表。操作的内容可这:TEXT型:Top

22 楼rea1gz(冒牌realgz V0.4)回复于 2004-08-03 18:11:55 得分 0

如果这个东西你解决了,我真的佩服你了!    
   
  看来现在是假冒佩服的  
  Top

23 楼rea1gz(冒牌realgz V0.4)回复于 2004-08-03 18:15:03 得分 0

本来想,如果不管非程序修改,所有插入、删除、更新操作都用存储过程实现,也许能做到,但是问题是你还要记录更新操作前的纪录,而且要判断哪些字段修改了,这存储过乘机户没法写  
  Top

24 楼czyoooo(按时)回复于 2004-08-03 18:31:51 得分 0

to     zjcxc(邹建):不用触发器无法监控表中数据的变化.  
    但是据我知道,触发器无法传入参数,我也就无法记录修改人的姓名!  
  to     Alern(李小虎):写入一个日志表。操作的内容可这:TEXT型:  
    同意rea1gz(冒牌realgz   V0.1)的看法,的确是这个样子.  
   
   
  评:  
        情况看似简单,做起来去颇费脑筋,现在有两条路可以走:  
  1、触发器  
        不知道是否可以传入参数  
  2、存储过程  
        在其中可以得到类似触发器的两张表deleted     inserted  
  我希望是(2)可以实现,不过这个我不是很清楚!  
  现在看来这个问题解决了,就是经典了!  
   
   
   
   
  Top

25 楼rea1gz(冒牌realgz V0.4)回复于 2004-08-03 18:47:33 得分 10

触发器不能传入参数是肯定的,但是我觉得传参数不是主要问题,因为触发器里可以检测到当前使用者的LoginId,如果你的操作员表OPERATOR存放LoginId,而且做到LoginId与操作员一一对应,甚至,不必找到操作员,只记录LoginId就可以了,这个问题就解决了。  
  触发器的主要问题是每个表都需要加触发器,而且没个触发器都不简单,用到一些动态SQL,可读性比较差,效率也不能保证。  
  Top

26 楼zjcxc(邹建)回复于 2004-08-03 20:56:35 得分 0

触发器不能传入参数是对的,但可以变相的,建一个表来传递参数的.   这是方法1  
   
  方法2,就是楼上的,用sql的用户代替你自己维护的用户.  
  Top

27 楼pengdali()回复于 2004-08-04 09:25:31 得分 0

---------删除触发器建立删除日志  
  if   exists   (select   *   from   sysobjects   where   id   =   object_id('dbo.Trigg_Test_Del')   and   sysstat   &   0xf   =   8)  
          drop   trigger   dbo.Trigg_Test_Del  
  GO  
   
  create   trigger   Trigg_Test_Del   on   Test  
  For   Delete  
  AS  
   
   
  insert   TestLogs  
  select   Id,                               --被删除记录的Id  
      opTime=GetDate(),             --删除日期时间  
      HostName=Host_Name(),     --主机名称  
      AppName=App_Name(),         --客户机使用的应用程序  
      UserName=sUser_Name()     --用户名  
  from   DELETED  
   
  GO  
   
  --不过不太准Top

28 楼zjcxc(邹建)回复于 2004-08-04 09:29:40 得分 0

大力好久不见了  
   
   
  不过楼主要求记录的不只这些,还有记录的变化情况.Top

29 楼SeekTruth(鹤舞白沙)回复于 2004-08-04 09:38:10 得分 0

 
   
      这种情况属于业务范畴,数据提交可以通过中间层进行并由中间层进行记录.Top

30 楼prcgolf(小鸟)回复于 2004-08-04 09:44:20 得分 0

upTop

31 楼guoliang_08(Good Good Study Day Day Up !)回复于 2004-08-04 09:56:51 得分 0

看不懂也要来UP一UPTop

32 楼XRS(心如水)回复于 2004-08-04 10:25:51 得分 0

楼主是中情局的吧,需要对数据监控得这么严密呀。:)Top

33 楼mophi(追球)回复于 2004-08-04 10:26:48 得分 0

做个LOGS表,在你每个对表有修改的过程中加上一句insert   into   logs吧。  
  但明细表你再用触发器,分开做好了  
  Top

34 楼czyoooo(按时)回复于 2004-08-04 13:38:51 得分 0

to   pengdali(大力   V3.0)   :  
        没想到你也出马了,但是如   zjcxc(邹建)所言,这种写法仍然没有解决本质上的问题。  
    to     zjcxc(邹建)   :  
        是不是真的遇上难题了,呵呵!Top

35 楼flyincs(▄︻┳═一O一═┳︻▄ )回复于 2004-08-04 14:16:19 得分 0

markTop

36 楼lizhengCSDNnet(工作一定努力、爱你绝不放弃。)回复于 2004-08-04 14:27:38 得分 0

upTop

37 楼zjcxc(邹建)回复于 2004-08-04 14:28:33 得分 0

写出来的思路是有的  
   
  每个表建立一个历史记录表,或者用text字段存放修改明细记录  
   
  但是效率不不好sql事件件器高,效果也没有它好.  
   
  觉得没有必要写这个.(不实用)Top

38 楼czyoooo(按时)回复于 2004-08-04 14:49:54 得分 0

to     zjcxc(邹建)   :  
          兄弟可否拿一个简单的表写一下,修改人由程序传入,和你说的SQL事件器也能记录修改人的操作,毕竟说起来容易做起来比较难!Top

39 楼mediafang2003(钱,是个好东西!)回复于 2004-08-04 14:51:57 得分 0

关注!Top

40 楼zjcxc(邹建)回复于 2004-08-04 14:57:49 得分 0

倒,我只说了   SQL事件器也能记录修改操作,没有说事件探察器可以记录你程序传入的操作人Top

41 楼gdc123(冬子)回复于 2004-08-04 15:05:03 得分 0

关注!继续讨论呀!  
  有了结果给我发一份   OK?  
  EM   gdc123485@suhu.comTop

42 楼zicxc(冒牌邹建 V0.4)回复于 2004-08-04 15:11:06 得分 0

 
  Top

43 楼czyoooo(按时)回复于 2004-08-04 15:11:16 得分 0

to   zjcxc(邹建)   :  
      那么怎么解决这个问题呢?难道这个问题没有办法解决吗?  
      看到那么多同志都关心这个问题,实在不知道以前他们对于操作监控的操作是怎么做的!Top

44 楼zgj8128123(zgj8128)回复于 2004-08-04 15:50:10 得分 0

关注:我以前有家公司也想出这样的产品,但因种种原因就放弃,这种根本就不可取,没有必要,因为可以这样想,可以让用户没有这个权限,或者来个假用户.进行删除,还有我们是这样做的,拿假用户,有权限的第一次删除都要密码Top

45 楼czyoooo(按时)回复于 2004-08-04 16:23:01 得分 0

to   zgj8128123(zgj8128)   :  
        社会发展的步骤越来越快,但是人的素质却越来越差,我们不说治安情况有多差,就一个单位里,操作者的情况也层差不齐,有的人做错了死活不承认,没有办法只好记录每个动作,虽然有点象“摄像机探头”的意思,但也是没有办法的办法,不然你是抓不到真正翻错误的人的。  
  Top

46 楼microd(重构一切)回复于 2004-08-04 20:46:42 得分 0

即使是这样,也没有没必对所有的表都这样做,我目前也遇到类似的问题,只针对部份主要的表做记录其明细变化前后的值,其它的只记录一下修改人的帐号和修改日期就可以了(多开峡两个字段),用的是触发器。Top

47 楼bzxs(笨嘴先生)回复于 2004-08-04 21:00:27 得分 0

以下纯属谣言;  
        能不能利用触发器的INSERTED和DELETE表来记录对哪些记录作了操作,然后再插入到相关日志表中呢?Top

48 楼bzxs(笨嘴先生)回复于 2004-08-04 21:07:08 得分 0

以下纯属谣言;  
        能不能利用触发器的INSERTED和DELETED表来记录对哪些记录作了操作,然后再插入到相关  
  日志表中呢?  
   
   
  不好意思,上面少个D  
  Top

49 楼wzjcntlqs(要做钱的主人)回复于 2004-08-04 21:08:04 得分 0

关注Top

50 楼Jianli2004(健力)(星是UP来的)回复于 2004-08-04 23:00:19 得分 0

use   trigger   is   a   choice   on   the   critical   table  
  1   in   a   trigger   you   can   retrieve   user   info  
  2   query   column   name   from   system   table,use   update()   to   determine   the   column   changed  
  3   value   diff   info   from   inserted   and   deleted   table.Top

51 楼outwindows(水花)回复于 2004-08-05 08:11:52 得分 0

mark..Top

52 楼zonelive(peter)回复于 2004-08-05 08:14:24 得分 0

这题好强啊Top

53 楼czyoooo(按时)回复于 2004-08-05 15:43:00 得分 0

大家继续努力呀,别这样又放弃了吧!Top

54 楼zjcxc(邹建)回复于 2004-08-05 21:23:20 得分 50

/*--记录表的新增/修改/删除  
   
  演示了如何通过触发器来记录来表的操作情况  
  并记录了数据操作的明细资料  
  操作员由前台在处理时,传递到   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   deleted  
   
  declare   @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   colid  
   
  set   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=3  
   
  go  
   
  --显示记录结果  
  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   行)  
  --*/Top

55 楼zjcxc(邹建)回复于 2004-08-05 21:24:05 得分 0

上述只供参考,我觉得实用性不大.  
   
  不知道大家有没有更好的办法.Top

56 楼czyoooo(按时)回复于 2004-08-10 17:27:39 得分 0

还有没有好的办法呀,如果真的没有看来又要失望了。Top

57 楼zhangzs8896(小二)回复于 2004-08-10 19:51:51 得分 0

老大是什么人,那简直就是神!^_^  
  既然不使用,还弄他干吗呢?Top

58 楼wozhuchuanwei(一个组件编写者,就一定是一个更优秀的Delphi开发者)回复于 2004-08-10 20:30:30 得分 0

我也曾经试图写过这样的一个通用存储过程  
  但实现起来特复杂  
  要用到两个临时表,一个用于存放修改前的值,一个用于存放修改后的值  
  然后比较这两个临时表,动态取处发生了修改操作字段的值(两个,一个是修改前,   一个是修改后的值)  
  然后把这些值放到一个单独的日志表中  
  代码就不贴了,   太长了  
  而且写好后,只是做了一个简单的测试,不敢真正用到系统中去  
  怕出错后,根本无法查询!Top

59 楼heavenchang(学习ing)回复于 2004-08-10 20:35:46 得分 0

好强呀,!!!Top

60 楼txhack(风冷月清)回复于 2004-08-11 07:55:33 得分 0

真是太牛了,要学的知识太多了Top

61 楼btut2004(养鱼炒股)回复于 2004-08-13 22:43:15 得分 0

邹建老大你不工作的吗?  
  哪有那么多时间回答问题,是不是csdn给你工资啊!  
  没有恶意,只是不解!Top

62 楼zjcxc(邹建)回复于 2004-08-13 22:47:45 得分 0

CSDN给我工资就好了,那就真的可以在家里工作,可惜不是.Top

63 楼j9868(不是j9988)回复于 2004-08-14 07:45:05 得分 0

。。这个想法好有创意。。。。我服了  
   
  这个还要解决啊,作个普通的日志表,存储谁什么时候登录了哪个模块,到时候拿个log   explorer查sql日志不更快。。。。。。虽然容易找混了,可你不是天天干这事情吧  
   
  ps:你的客户都是直接用sql操作数据库的?不是吧!那你还不如写个东西记录他按了什么按钮更快。Top

64 楼xuedaniel(daniel)回复于 2004-08-14 09:06:16 得分 0

这个问题是最简单的了Top

65 楼tomhuang(春城)回复于 2004-08-14 10:52:28 得分 0

楼上的说简单?你看清楚问题是什么了吗??连大力兄都惊动了...Top

66 楼erigido(丰田村农民)回复于 2004-08-14 11:52:02 得分 0

确实是比较难的哦,不过,我觉得这样的话是不是效率会受到影响啊?好象不值哦Top

67 楼liangx326(selina)回复于 2004-08-14 15:40:36 得分 0

还有没有人知道该怎么办啊??  
  学习ing   !!!Top

68 楼cqlyzz(学习ing)回复于 2004-08-15 19:00:08 得分 0

学习ing   !!!  
  Top

69 楼hsmserver(撒哈拉之雨的悲伤)回复于 2004-08-15 19:09:40 得分 0

就技术和人品而言  
  我更倾配邹建的人品  
  无论有什么问题他一般都能给你及时解答  
  网络需要这样的人啊  
  向邹建学习  
  Top

70 楼renaski(洛林)回复于 2004-08-15 19:50:58 得分 0

向邹建学习!!!Top

71 楼rea1gz(冒牌realgz V0.4)回复于 2004-08-15 22:42:03 得分 0

还没真的服呀  
  Top

72 楼lxysjl(流星雨)回复于 2004-08-16 01:39:49 得分 0

向邹建学习,不管人品,知识,好好学习,天天向上Top

73 楼singledj(阳光)回复于 2004-08-16 08:37:14 得分 0

学习!Top

74 楼enhydraboy(乱舞的浮尘)回复于 2004-08-16 09:16:53 得分 0

用数据库提供的触发器来可以实现insert和modify(update/delete)的记录,但是我觉得显然意义不大。更不用说会性能上的问题。  
  我认为你所说的这些问题,其实SQL   Server的日志就包括了,有意义的做法应该是分析日志文件。SQL   Server应该像oracle一样提供官方的logminner程序包,帮助分析日志。Top

75 楼wozhuchuanwei(一个组件编写者,就一定是一个更优秀的Delphi开发者)回复于 2004-08-17 15:51:51 得分 10

希望各位能帮忙解决这个问题,就是上面所说的,用一个单独的表来存储@@SPID的问题。  
  就是@@SPID怎么样才能与我可户端的操作员关联!在登陆的时候写入表,我想应该可以,但是什么时候删除该表里面已经关联了的@@SPID呀?程序退出的时候吗?具体怎么样操作呀?我的前台是delphi,  
  谢谢!  
  先贴出触发器中得到前后修改内容的SQL,希望大家帮忙看看这样做效率有什么问题没??  
  /*  
  #TMP   #TMP1   换为出发器中的   Inserted   Delted   表  
  要求修改主健   和表名称  
  */  
  --SELECT   Top   3   *   INTO   #TMP   From   Material_Measure  
  SELECT   *   FROM   #TMP  
  SELECT   *   FROM   #TMP1  
  declare   @SQL   VarChar(8000)  
  declare   @   VarCHar(8000)  
  declare   @SQL1   VarChar(8000)  
  Set   @SQL1=''  
  set   @=''  
  SET   @SQL='SELECT   '  
  Select   @SQL=@SQL+''''+name+'''='''+name+'(''+CAST(ISNULL(A.'+Name+',''NULL'')   As   VarChar(255))+'',''+CAST(ISNULL(B.'+Name+',''NULL'')   As   VarChar(255))+'')'','   FROM   syscolumns   where   id   =  
      (Select   id   FROM   sysobjects   where   name   ='Material_Measure')    
  Set   @SQL=Left(@SQL,Len(@SQL)-1)+'   From   #TMP   A,#TMP1   B   Where   A.vc_yd=B.vc_yd'  
   
  Select   @=@+CASE   WHEN   @   =''   THEN   name   ELSE   '+'',''+'   +name   End   FROM   syscolumns   where   id   =  
      (Select   id   FROM   sysobjects   where   name   ='Material_Measure')    
   
  Exec   ('Select   '+@+'   From   ('+@SQL+')   a')  
   
  结果  
  -----  
  vc_yd             vc_ph     vc_ch   vc_cph           si_fhy             dt_sj                                                                                                     di_mz                                 di_pz                                 si_mzjly         si_pzjly         bi_sc    
  ----------   ------   -----   ----------   -----------   ------------------------------------------------------   --------------------   --------------------   -----------   -----------   -----    
                        Z04672   6021     NULL               9                       2002-10-18   18:55:14.843                                                                 40.220                               11.340                               8                       8                       0  
  ZZ0089075     Z04626   3042     NULL               8                       2002-10-16   15:48:49.493                                                                 23.360                               13.520                               10                     10                     0  
  ZZ0089086     Z04661   1060     NULL               6                       2002-10-18   14:43:05.530                                                                 27.400                               10.380                               7                       7                       0  
   
  (所影响的行数为   3   行)  
   
  vc_yd             vc_ph     vc_ch   vc_cph           si_fhy             dt_sj                                                                                                     di_mz                                 di_pz                                 si_mzjly         si_pzjly         bi_sc    
  ----------   ------   -----   ----------   -----------   ------------------------------------------------------   --------------------   --------------------   -----------   -----------   -----    
                        Z04672   6021     NULL               9                       2002-10-18   18:55:14.843                                                                 40.220                               11.340                               8                       8                       0  
  ZZ0089075     Z04626   3042     NULL               8                       2002-10-16   15:48:49.493                                                                 23.360                               13.520                               10                     10                     0  
  ZZ0089086     Z04661   1060     NULL               6                       2002-10-18   14:43:05.530                                                                 27.400                               10.380                               7                       7                       0  
   
  (所影响的行数为   3   行)  
   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
  ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    
  bi_sc(0,0),di_mz(40.220,40.220),di_pz(11.340,11.340),dt_sj(10   18   2002     6:55PM,10   18   2002     6:55PM),si_fhy(9,9),si_mzjly(8,8),si_pzjly(8,8),vc_ch(6021   ,6021   ),vc_cph(NULL,NULL),vc_ph(Z04672,Z04672),vc_yd(                     ,                     )  
  bi_sc(0,0),di_mz(23.360,23.360),di_pz(13.520,13.520),dt_sj(10   16   2002     3:48PM,10   16   2002     3:48PM),si_fhy(8,8),si_mzjly(10,10),si_pzjly(10,10),vc_ch(3042   ,3042   ),vc_cph(NULL,NULL),vc_ph(Z04626,Z04626),vc_yd(ZZ0089075   ,ZZ0089075   )  
  bi_sc(0,0),di_mz(27.400,27.400),di_pz(10.380,10.380),dt_sj(10   18   2002     2:43PM,10   18   2002     2:43PM),si_fhy(6,6),si_mzjly(7,7),si_pzjly(7,7),vc_ch(1060   ,1060   ),vc_cph(NULL,NULL),vc_ph(Z04661,Z04661),vc_yd(ZZ0089086   ,ZZ0089086   )  
   
  Top

76 楼benniao2008(逆水行舟,不进则退!!!)回复于 2004-08-17 17:32:39 得分 0

学习.....UPTop

77 楼riyue80(在北京...)回复于 2004-08-17 18:06:36 得分 0

study~~~~~Top

78 楼quansui(叶子)回复于 2004-08-17 21:26:17 得分 0

学习......upTop

79 楼enxi(恩熙 @_@)回复于 2004-08-18 08:38:45 得分 0

good!Top

80 楼netcoder(朱二)回复于 2004-08-18 09:02:22 得分 20

早上一上来就看到这帖子了  
   
  最近在做一个项目,需要分析一个现有系统的数据库,就是分析  
  1、每一个表存放的是什么数据  
  2、哪些情况下表中的数据会发生变化  
   
  没有办法,写了一个存储过程,为每个表建立三个触发器,还为每个表建立一个更新表  
   
  可以供楼主参考,都在我的专栏里  
  http://blog.csdn.net/netcoderTop

81 楼brothersun0116(brothersun0116)回复于 2004-08-18 09:45:46 得分 0

厉害啊!!!Top

82 楼anteye(年级大了做什么?)回复于 2004-08-18 09:53:46 得分 0

学习  
  Top

83 楼dnvodcwan(jc.franck)回复于 2004-08-18 10:00:53 得分 0

象类似的触发器我们写都有写过,但真的不实用啊,一个占用系统资源,二个占用硬盘空间,应该考虑你的硬盘间呀,Top

84 楼jackjingsg(飞翔的精灵)回复于 2004-08-18 10:10:36 得分 0

慢慢看Top

85 楼andylist(白痴儿)回复于 2004-08-18 10:14:34 得分 10

本人认为如下(以下纯属个人意见好果不适用请原谅):  
  做两个表  
  A表:ID     NAME       AGE     SEX  
          1       CHRI     20         1      
  B表:ID     NAME       AGE     SEX   编号     修改人     表名     动作     时间  
          1       CHRI     20         1       1001     admin       表A       修改     2004-08-05  
   
  这样当程序一开始时就记录未修改前的数据  
  审核时记录修改后的数据加B表后面的东西就可以了.  
  不过这样做好像没什么必要  
  我公司曾经有过这样的要求  
  但后来还是没用了  
  要是修改量大和时间长了  
  会造成不必要的资源浪费  
  (请各大侠给点意见,让在下学习学习也好...谢谢!!)  
  Top

相关问题

  • zjcxc(邹建)兄弟的那个分页存储过程在哪里啊?
  • 邹建兄弟帮忙.
  • virus(计算机病毒)进来, 兄弟豪气干云,甚是佩服!!
  • zjcxc(邹建)领分。
  • zjcxc(邹建)接分100
  • 请 zjcxc(邹建) 接分
  • 看到有些兄弟用一些小字组成一些大字或者一付图画。佩服万分,是怎么做的。???
  • 请邹建兄弟再帮下忙,在线等...
  • zjcxc(邹建)及众高手请进
  • 請 zjcxc(邹建)進來接分

关键词

  • 修改
  • 字段
  • 存储过程
  • 解决
  • 监控
  • 数据库
  • 用户
  • 触发器
  • 记录
  • 表

得分解答快速导航

  • 帖主:czyoooo
  • rea1gz
  • zjcxc
  • wozhuchuanwei
  • netcoder
  • andylist

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo