触发器:内联的两张表,不符合条件不允许保存并且返回错误信息

pumjun 2018-01-24 10:18:40
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER TRIGGER [ICStockBillEntry_INCK24]
ON [dbo].[ICStockBillEntry] /*icstockbill出入库单表体表 */
for insert,update
as

if EXISTS(
select 1 from inserted a

left join ICStockBill b /*ICStockBill出入库单表头表 */

on a.finterid=b.finterid /* finterid为出入库单表头和表体两张表的关联内码 */

where b.ftrantype=24 /* ftrantype为出入库单表头表的单据类型字段,ftrantype=24即单据类型为领料单 */

and (a.fscstockid=335 or a.fscstockid=338)) /*出入库单表体的仓库内码,fscstockid=335即原料仓,
fscstockid=338为配件仓 */
begin
rollback tran
raiserror('收料仓库不是周转仓,无法保存!',16,1) with seterror
end

/**

出入库单表体表,通过关联出入库单表头表的单据类型字段ftrantype=24(即关联单据类型为领料的单据),

在表体表录入仓库字段fscstockid=335 or fscstockid=338的时候,返回不符合仓库值fscstockid=338(周转仓)的错误提示,
并不允许保存。

很奇怪的是直接执行这条查询语句是返回正确的数据,即要返回两张表关联表的单据类型ftrantype=24(领料单),

并且仓库fscstockid=335(原料仓) or fscstockid=338(配件仓);

然而在此触发器里,判断条件 where b.ftrantype=24 and (a.fscstockid=335 or a.fscstockid=338)
根本就不生效,所有单据类型和所有仓库值都允许保存,不返回错误提示。


有哪位遇到类似问题,或者此语句写得不合理的地方,不吝赐教**/




...全文
788 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
OwenZeng_DBA 2018-01-25
  • 打赏
  • 举报
回复
都返回消息 ,是指触发器成功回滚吗? 你就用我上面的方法,在表中插入数据,看看当时这个查询是查询出来什么数据就知道了。
pumjun 2018-01-25
  • 打赏
  • 举报
回复
如果判断条件改成如下, a.finterid=b.finterid ----finterid为出入库单表头和表体两张表的关联内码 and b.ftrantype=24 ----ftrantype为出入库单表头表的单据类型字段,ftrantype=24即单据类型为领料单 where (a.fscstockid=335 or a.fscstockid=338) 判断仓库字段fscstockid是成功了,只符合a.fscstockid=335 or a.fscstockid=338就会返回消息, 但是单据类型字段ftrantype=24(领料单)就无效, 所有单据类型只要符合条件a.fscstockid=335 or a.fscstockid=338都会返回消息。
OwenZeng_DBA 2018-01-25
  • 打赏
  • 举报
回复
你在SSMS里面执行insert into ICStockBillEntry 看下,,,你第一条不是直接执行的截图
pumjun 2018-01-25
  • 打赏
  • 举报
回复
触发器执行情况 直接执行语句也是没问题 单据执行情况01 单据执行情况02
OwenZeng_DBA 2018-01-25
  • 打赏
  • 举报
回复
ALTER TRIGGER [ICStockBillEntry_INCK24]
           ON [dbo].[ICStockBillEntry]   /*icstockbill出入库单表体表 */
for insert,update 
as


select 1 from inserted a

              left join ICStockBill b    /*ICStockBill出入库单表头表 */

              on a.finterid=b.finterid   /* finterid为出入库单表头和表体两张表的关联内码 */

              where b.ftrantype=24      /* ftrantype为出入库单表头表的单据类型字段,ftrantype=24即单据类型为领料单 */

              and (a.fscstockid=335 or a.fscstockid=338)



    if EXISTS(
              select 1 from inserted a

              left join ICStockBill b    /*ICStockBill出入库单表头表 */

              on a.finterid=b.finterid   /* finterid为出入库单表头和表体两张表的关联内码 */

              where b.ftrantype=24      /* ftrantype为出入库单表头表的单据类型字段,ftrantype=24即单据类型为领料单 */

              and (a.fscstockid=335 or a.fscstockid=338))   /*出入库单表体的仓库内码,fscstockid=335即原料仓,
                                                                                        fscstockid=338为配件仓  */
         begin
    	      rollback tran
              raiserror('收料仓库不是周转仓,无法保存!',16,1) with seterror
         end 
看着没什么问题,像我这样在触发器里面吧数据查询出来,吧结果发来看看
shoppo0505 2018-01-25
  • 打赏
  • 举报
回复
select 1 from inserted a 不对啊 应该是 select * from inserted a
shoppo0505 2018-01-25
  • 打赏
  • 举报
回复
select 1 from inserted a 不对啊 应该是 select * from inserted a
pumjun 2018-01-25
  • 打赏
  • 举报
回复
用select into语句执行,能插入查询的数据。 但是写在触发器里,以下判断条件还是没有生效 where b.ftrantype=24 /* ftrantype为出入库单表头表的单据类型字段,ftrantype=24即单据类型为领料单 */ and (a.fscstockid=335 or a.fscstockid=338)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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