trigger ( 积分: 50 )

  • 主题发起人 主题发起人 天涯一客
  • 开始时间 开始时间

天涯一客

Unregistered / Unconfirmed
GUEST, unregistred user!
CREATE&nbsp;&nbsp;trigger&nbsp;rso_trigger&nbsp;on&nbsp;dbo.RoomNum<br>for&nbsp;delete,insert&nbsp;,update<br>as<br><br>IF&nbsp;(COLUMNS_UPDATED()&nbsp;&amp;62&nbsp;)&nbsp;&gt;&nbsp;0<br><br>&nbsp;&nbsp;&nbsp;&nbsp;BEGIN<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSERT&nbsp;INTO&nbsp;rm_def&nbsp;(com_host,com_addr,&nbsp;flog,&nbsp;floor,&nbsp;rm_num)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;ins.com_host,ins.com_addr,ins.flog,&nbsp;ins.floor,ins.rm_num<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;inserted&nbsp;ins&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;END<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;delete&nbsp;&nbsp;serve&nbsp;&nbsp;from&nbsp;deleted&nbsp;b&nbsp;where&nbsp;&nbsp;serve.flog&nbsp;=&nbsp;b.flog&nbsp;AND&nbsp;serve.floor&nbsp;=&nbsp;b.floor&nbsp;AND&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serve.RM_Num&nbsp;=&nbsp;b.Rm_num&nbsp;and&nbsp;serve.com_addr=b.com_addr&nbsp;and&nbsp;serve.com_host=b.com_host<br><br>请问我上面有7个字段,上面的要求是2到6字段的要求,可是当我改动第个时,rm_def&nbsp;的那条记寻被删除了,请问高手怎么改
 
我的理解能力真差……
 
你的要求说的不明确,你的删除语句写法就是改动第一个字段的时候删掉那条记录但是写法有误,不知道delete语句表达的意思
 
1.&nbsp;for&nbsp;delete,insert&nbsp;,update应当改为&nbsp;for&nbsp;update,其它看不出什么语法错误<br>因为Delete时没有Inserted表,Insert时没有Deleted表,只有Update时才两表全有。出错就会回滚。<br>2.&nbsp;如果你只修改第7个字段时,只会执行删除语句。删除语句没有问题,可能是Serve表与rm_def&nbsp;表之间有级联触发?<br>3.&nbsp;建议你为Serve表增加外键,建立与RoomNum表之间的一对多或一对一关系,你那多个And实在是太影响效率了。
 
1.&nbsp;for&nbsp;delete,insert&nbsp;,update应当改为&nbsp;for&nbsp;update,其它看不出什么语法错误<br>因为Delete时没有Inserted表,Insert时没有Deleted表,只有Update时才两表全有。出错就会回滚。<br>2.&nbsp;如果你只修改第7个字段时,只会执行删除语句。删除语句没有问题,可能是Serve表与rm_def&nbsp;表之间有级联触发?<br>3.&nbsp;建议你为Serve表增加外键,建立与RoomNum表之间的一对多或一对一关系,你那多个And实在是太影响效率了。
 
to&nbsp;hegyi<br>&nbsp;&nbsp;&nbsp;你好,我上面的主要用意,ROOMNUM与Rm_DEF表的同步与统一,请问除了用外键,不能用TRIGGER实现上面的功能了吗?,我所就用了,for&nbsp;delete,insert&nbsp;,update&nbsp;&nbsp;的语句,但我又不愿意,修改期,第一个或第七个字段是,其它的表有影响
 
to&nbsp;hegyi<br>&nbsp;&nbsp;&nbsp;你好,我上面的主要用意,ROOMNUM与Rm_DEF表的同步与统一,请问除了用外键,不能用TRIGGER实现上面的功能了吗?,我所就用了,for&nbsp;delete,insert&nbsp;,update&nbsp;&nbsp;的语句,但我又不愿意,修改期,第一个或第七个字段是,其它的表有影响
 
当然可以使用触发器来实现表与表之间的同步,只要用得好。<br>你的Delete主句是不是应当修改为:<br>delete&nbsp;&nbsp;serve&nbsp;&nbsp;from&nbsp;serve&nbsp;a&nbsp;inner&nbsp;join&nbsp;deleted&nbsp;b&nbsp;on&nbsp;&nbsp;a.flog&nbsp;=&nbsp;b.flog&nbsp;AND&nbsp;a.floor&nbsp;=&nbsp;b.floor&nbsp;AND&nbsp;a.RM_Num&nbsp;=&nbsp;b.Rm_num&nbsp;and&nbsp;a.com_addr=b.com_addr&nbsp;and&nbsp;a.com_host=b.com_host<br>不要只在这个触发器找问题,分析一下你的应用逻辑,看是否有逻辑错误。
 
你不愿意&nbsp;别人怎么说阿?!<br>楼上回答的非常有道理。不过我建议业务逻辑还是不要放在后台触发器里,将来会给服务器带来很大负担,影响效率。
 
感谢上面的,各位好友的支持,问题以解决了,谢谢大的帮肋
 
多人接受答案了。
 
后退
顶部