触发器问题,越来越糊涂了!紧急!

rainbow326 2003-11-24 05:35:29
1,触发器和应用程序有关吗?
2,数据库现有受订单表tf_pos,部分字段:os_no(受订单号),qty(受定数量),qty_ps(已经销货数量)
销货单表tf_pss,部分字段:os_no(受订单号),qty(本次销货数量)
销货单表mf_pss,部分字段:os_no(受订单号),
应用程序把受订单保存在tf_pos中,把销货部分保存在表tf_pss和mf_pss中,三个表靠os_no连接

一程序要做销货单,现在要用触发器实现(1)如果mf_pss.os_no是空,那么不能保存此笔数据,(2)如果tf_pss.qty>tf_pos.qty-tf_pos.qty_ps,那么这笔数据也不能保存。

急需帮助,我写的触发器(在这里不贴出来了)我实在是不知道哪里不对了,请大虾们看看怎么改!我很着急,可否用即时通讯的方式来帮助我,我的msn:rainbow0326@hotmail.com 谢谢谢谢!
...全文
48 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainbow326 2003-11-24
  • 打赏
  • 举报
回复
http://album3.chinaren.com/album_index.php?aname=alu.2817034545009172595&suuid=2817034545009172595&aid=53604899#
这个地址是出错的截图,依次1,2,3,大家帮帮忙啊!
rainbow326 2003-11-24
  • 打赏
  • 举报
回复
(1)CREATE TRIGGER ch1_insert
ON MF_PSS
FOR INSERT
AS
If Exists(Select 1 from inserted where os_no is null)
BEGIN
ROLLBACK TRAN
RAISERROR('os_no can not be null',16,10)
END
GO

(2)CREATE TRIGGER ch_insert
ON tf_pss
FOR INSERT
AS

IF exists(SELECT 1 FROM inserted i join tf_pos t ON i.os_no=t.os_no where i.qty>t.qty-t.qty_ps)
BEGIN
ROLLBACK TRAN
RAISERROR('Do not premise to save',16,10)
END
GO
这就是我写的两个了,可是真的是不可以,到底哪里不对啊?急死我了!
rainbow326 2003-11-24
  • 打赏
  • 举报
回复
对于这两个说句老实话,大力给出的触发器也不行,没有因为我原来就是这么写的,第一个是不起作用,第二个倒是不能保存,但是比如说,我受定10个,第一次我销了2个,然后我在销货一次,按理只要小于或等于8就可以吧,但是就是不能保存了,如果删掉这个触发其就可以保存了,我很晕,所以才来问的。
Benimarunikado 2003-11-24
  • 打赏
  • 举报
回复
大力回答问题还真块~
1,触发器和应用程序有关吗?
怎么说,不直接关联;触发器只和触发它的insert,update,delete操作有关;
如果应用程序设计到数据的insert,update,delete操作,则于触发器有关,否则无关!

2.如果用触发器解决的话,同意大力的方案;如果不用触发器的话;建议在应用程序中修改相应模块的显示记录的查询语句:拿你的情况做例子,
在销货模块中,可以这样定义显示语句:
SELECT * FROM ...WHERE os_no IS NOT NULL AND tf_pss.qty<tf_pos.qty-tf_pos.qty_ps
这样一来,不满足销货条件的记录根本显示不出来,更不要说可以销货了!
(当然,这是另外的解决方案,如果用触发器的话参照大力的吧)
希望你的问题尽快解决!
wzh1215 2003-11-24
  • 打赏
  • 举报
回复
CREATE TRIGGER 名1 ON tf_pss
FOR INSERT
AS
if exists(select 1 from inserted a,tf_pos b where a.os_no=b.os_no and a.qty>b.qty-b.qty_ps)
rollback tran
if exists(select 1 from inserted where os_no is null)
rollback tran
pengdali 2003-11-24
  • 打赏
  • 举报
回复
create table 表 (a int)
go
insert 表 values (1)
go
CREATE TRIGGER 名 ON 表
FOR UPDATE
AS
select a 更新前被删除的数据 from deleted
select a 更新后被插入的数据 from inserted
go
------------测试:
update 表 set a=3
pengdali 2003-11-24
  • 打赏
  • 举报
回复
1,触发器和应用程序有关吗?
没有,触发器只和触发它的insert,update,delete语句有关


2,
1)如果mf_pss.os_no是空,那么不能保存此笔数据,
CREATE TRIGGER 名1 ON tf_pos
FOR INSERT
AS
if exists(select 1 from inserted where os_no is null)
rollback tran
go

(2)如果tf_pss.qty>tf_pos.qty-tf_pos.qty_ps,那么这笔数据也不能保存。
CREATE TRIGGER 名1 ON tf_pss
FOR INSERT
AS
if exists(select 1 from inserted a,tf_pos b where a.os_no=b.os_no and a.qty>b.qty-b.qty_ps)
rollback tran

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧