zjcxc(邹建)兄弟:如果这个东西你解决了,我真的佩服你了!
问题是这样的:在修改表的时候我希望记录下操作者的姓名,动作,时间,类似于他什么时候做什么动作,快照一样,以后我可以随时查找!
例如:表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
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
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




