【问题标题】:Trigger Insert ONLY if column value contains XXXX仅当列值包含 XXXX 时才触发插入
【发布时间】:2020-09-11 22:47:08
【问题描述】:

假设我们有一个表,其中组合了许多唯一代码。例如:账单号:

  • XOUT12345
  • SOUT12345 等

我想创建一个触发器,确保只有值为“XOUT%”的触发器在触发器中使用并插入到另一个表中。但是,这似乎特别有效(我认为),然后当我创建使用格式 B 的文档时,保存文档时出现错误。

表格如下:

  1. 1 个名为 ICSTOCKBILL 的表,其中所有进出的交货都是 使用上述格式保存到该表中。
  2. 一栏 = FBillNo,帐单编号注册到的位置。
  3. 一列 = FStatus,如果是,则批准状态更新为 1。

1 名为 3026 的表应自动将 ICSTOCKBILL (FBillNo) 中的股票票据编号转移到该表。

我的代码如下

create Trigger DVLP_T_InsertBillNoItemSALESDEL2 On ICStockBill
for UpDate
as
If UpDate(FStatus)  
Begin
    If not exists (Select 1 
                  From inserted a 
                  Inner Join t_Item b on b.FItemClassID=3026 AND b.FNumber=a.FBillNo where FBillNo like 'XOUT%')
    Begin
        INSERT INTO t_Item (FItemClassID,FParentID,FLevel,FName,FNumber,FShortNumber,FFullNumber,FFullName,FDetail,FDeleted) 
        Select 3026,0,1,FBillNo,FBillNo,FBillNo,FBillNo,FBillNo,1,0
        From inserted where FBillNo like 'XOUT%'

    End
End

所以最终目标是:所有被批准的文件(FStatus = 更新)必须通过触发器运行。但只有那些有 XOUT 格式的 应该插入到表 3026 中。

到目前为止,在我应用此触发器后,它就可以工作了。我创建了一个新的销售交货,它还没有在新表中。我批准它,它就在那里。

但是,其他没有说格式的文档,会报错:

UPDATE ICSTOCKBILL SET FORDERAFFIRM=0 WHERE FBILLNO=SEOUT1234 violation of UNIQUE KEY contraint 'item2;.

任何提示将不胜感激。

【问题讨论】:

  • 嗨,戴尔,感谢您的提示。出于某种原因,由于我创建了此触发器,因此也提交到同一个表的其他文档在提交时会出错。这些提交也将更新 columnA,因此触发器也将运行。但是它们没有任何与触发器中定义的值匹配的值。我认为这是问题所在,我可能是错的(我是菜鸟)。我希望有办法说 if (x = x) 而不是 if update(columnA)..
  • 谢谢 Dale,我尽可能多地更新了它。正如所描述的,触发器完美地工作,只是当触发器在那里时,同一个表中的其他文档会出现错误。当我删除触发器时,错误不再出现。
  • 那么哪个表有item2列?
  • ICStockkBill 有这个专栏 抱歉,我现在就试试你的方法!谢谢!我会报告的

标签: sql-server tsql database-trigger


【解决方案1】:

您可以通过使用适当的基于集合的逻辑而不是程序逻辑来简化整个触发器。

以下内容应该可以满足您的要求。

create trigger DVLP_T_InsertBillNoItemSALESDEL2 on ICStockBill
for update
as
begin
    set nocount on;

    -- Always use meaningful aliases - using a, b, c is asking for trouble
    insert into t_Item (FItemClassID, FParentID, FLevel, FName, FNumber, FShortNumber, FFullNumber, FFullName, FDetail, FDeleted) 
    select 3026, 0, 1, FBillNo, FBillNo, FBillNo, FBillNo, FBillNo, 1, 0
    from Inserted I
    where FBillNo like 'XOUT%'
    and FStatus = 1
    and not exists (
        select 1
        from t_Item IT
        where IT.FItemClassID = 3026
        and IT.FNumber = I.FBillNo
    );
end

如果您仍然收到最初报告的错误,那么我非常怀疑它与触发器有关。它报告主表上的唯一约束已被违反,并且触发器不会触及该表。我怀疑您的测试数据可能不够独特。

【讨论】:

  • 非常感谢 Dale,从中学到了很多。整理了我的代码,现在运行良好。仍然不确定是什么导致了错误,但它似乎已经消失了。欣赏!
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多