SQL Server中的触发器的使用产生的问题(50分)

  • 主题发起人 主题发起人 liaotw
  • 开始时间 开始时间
L

liaotw

Unregistered / Unconfirmed
GUEST, unregistred user!
在SQL_SERVER中,有很大的可能是在数据库中写入触发器,在触发器中又有可能进行一些
数据的插入、删除等动作。比如我有一个触发器,代码如下:
Create Tirgger on Materials
For Insert
AS
BEGIN
INSERT INTO NoticeCode(物料代码) SELECT 物料代码 FROM inserted
WHERE inserted.性质='产成品'
END
/*----------------------------------------------------------------------*/
在此触发器中,要实现的目的是,如果在Materials表中进行添加记录,则如果记录的“性
质”字段的值为“产成品”,那么将此记录的物料代码字段值添加到NoticeCode表中。
因为在触发器进行触发时,产生了inserted表。而在触发器中,又使用了INSERT语句。此语
句又会产生一个inserted表。我在SQL_SERVER的企业控制台上进行手动的添加Materials记
录,系统不会发生错误。但是,如果我在程序中,无论使用VB、VC++、DELPHI,进行记录
的添加。程序都会发生一个错误,提示:您最后读取的记录已经发生了更改。
这是为什么?
为什么?????????
 
inserted不是表。
一般这种情况是因为更改了刚插入的记录所至,不是其他原因,特别是记录键值被修改了
 
具体问题不是很清楚,可是我实现过这样的操作。
这样试试。(尽量简化程序)
if exists(select top 1 * from inserted WHERE 性质='产成品')
INSERT INTO NoticeCode(物料代码)
SELECT 物料代码 FROM inserted WHERE 性质='产成品'
 
不是Trigger的问题。
应该是你用的TTable吧?
换TQuery + TUpdateSQL
 
上面三位的答案是错误的。不成立。请给出正确的答案
小弟在此多谢了。
 
手动的添加Materials记录,系统不会发生错误。那说明整个流程是对的

程序中错误,我推测应该是跟事务有关,试着改变你的lock type试试
 
当然有问题啦。
BEGIN
set nocount on
INSERT INTO NoticeCode(物料代码) SELECT 物料代码 FROM inserted
WHERE inserted.性质='产成品'
set nocount off
END
才50块,少了点。我最近已经花了900大元了。穷哪:(
 
zhanggeye的答案应该是没错的
但我总觉得你这样做的triger总有点别扭,其实你自己一早就知自己写的是错的,会引发
循环调用,是不是想想别的更合理的办法?
 
不同意sonie的意见。
liaotw所说的引发循环调用是错误的。
因为他并不是将记录insert到当前的表中。
 
多人接受答案了。
 
后退
顶部