-
-
[原创]解决一个问题,开心中..
-
发表于:
2005-8-11 23:52
5178
-
晚上回来发现程序放在公司内网家里不好取.倒.想加班都不行了.哈哈..
那么干什么呢? 啊哟,想起了昨天遇到个奇怪问题:
----------------------------------------------
一个文章系统 A
两个数据库 DB_1 和 DB_2
现在需要把原来 A 操作的 DB_1 换成操作 DB_2
在添加新文章时问题出现了.
A 操作 DB_1 一切正常.成功插入.查如下:
823 女F4成员 网易 据台湾媒体报道.. 2005-08-09 0 30 女F4 1 22 NULL NULL NULL NULL NULL
但是换成操作 DB_2 后却发现添加出了差错.查如下:
824 NULL NULL NULL NULL 0 NULL NULL 0 NULL NULL NULL NULL NULL NULL
这个.这个.。o0 怎么回事呢??
第一反映是这两个数据库肯定不一致啦..
一个好的一个坏的.倒.查查表结构先.
查呀查呀.奇怪了.表结构一模一样呀.
@#$%$%$^ 我无语.
不管.查查源程序先.哈哈..
找了1个小时没有发现源代码.这个系统是我来公司前的一个前同事做的.源代码早百年就没有了.
%*&^*#$&$(%)&^)*&(& 再次无语.然我们想想办法.
看了看数据库.发现 DB_1 库表没有触发器而 DB_2 库表有触发器. 但看了看触发器什么异常的地方也没有.
----------------------------------------------
头大中.一点头绪也没有..
----------------------------------------------
看来得殿出事件探测器分析一下先.
再操作一遍添加新文章.看到探测器有如下两记录.
insert into article (Time,Name,Flag) values (0,'',0) SELECT @@IDENTITY AS [id]
update article set title='aa',auth='aa',orig='aa',Date='2005-8-9',type=0,key='aa',Flag=1 where id=109932
倒.原来是..小样的你原来躲在这里...
首先插入一条记录.然后更新它.通过这两步来完成一篇新文章的添加.
发现这个id的值出现了异常所以导致了上面的奇怪的现象.若是id=804那么它就更新成功了.现在由于id异常.竟然出现了109932奇怪数字.
----------------------------------------------
嘿嘿.事情有了进展.现在查查帮助看看.这个@@IDENTITY函数是干什么的先.
看到如下解释:@@IDENTITY返回最后插入的标识值,如果此语句激发一个或多个执行产生标识值的插入操作的触发器,
则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值.
啊.原来是这样.由于插入 DB_2 的 ariticle 表触发了他上面的插入触发器.而这个触发器操作了另外一个表返回了 109932 这个标识值
嘿嘿,现在问题全部查明了.都是这个@@IDENTITY东西惹的祸.
最直接的想法就是把 SELECT @@IDENTITY AS [id] 改成 select max(id) from article 即可.
----------------------------------------------
但是现在没有源程序呀.怎么办呢??
嗯,不要着急.我们还有dll文件.
用 Hex WorkShop 编辑一下dll文件 把 SELECT @@IDENTITY AS [id] 改成 select max(id) from article 保存替换原来的dll试一试
哈哈.现在一切恢复了正常.在 DB_2 上也可以添加新文章了:)
----------------------------------------------
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课