2017-09-20 87 views
1

我在桌面上创建了一个触发器,这是我的第一次。SQL Server:触发器停止工作

当一条记录被插入到我的TableA中时,触发器会向同一个TableA插入一条新记录。

  1. 当我插入符合语句中设置的条件的记录时,触发器会正确动作。

  2. 当我插入一条不符合这些条件的记录时,触发器无法执行。

  3. 问题是,如果我现在再添加一条符合条件的新记录,那么触发器就不再被执行。当我插入不符合条件的记录时,它似乎停止工作。

如果我删除了第2点中添加的条件未满足条件的记录,则它再次开始工作。奇怪,无法理解。有什么建议吗?

情景:当客户第一次购买属于StockType=1的商品时,新商品将被添加到同一张发票中。它工作正常。

如果客户购买不属于StockType=1的其他产品,则不会触发该触发器。这很好。

之后,触发器将不会再次被执行。这是原始的语句代码。

SET NOCOUNT ON;  
DECLARE @SerialNo NVARCHAR(50) 

    SET @SerialNo = (SELECT TOP 1 SNSerialNoTx 
        FROM T_SNSerialNo 
        WHERE (SNStockItemID = 7058 AND SNInvoiceID_N IS NULL)) 

    INSERT INTO T_IIInvoiceItem (IIInvoiceID, IIProfitCenterID, IIStockItemID, IISerialNoTx_N, 
           IIQtyIn, IICostPriceCompsTx, IITaxBandIDsTx, IITaxRatesTx, 
           IIStockNoTx, IIStockItemTx, IIStockTypeID, IIStockTypeTx, 
           IIManufacturerID, IIManufacturerTx, IICustID) 

     SELECT 
      IIInvoiceID, 23, 7058, @SerialNo, 
      IIStockTypeID, '-1:[email protected]', 0, 0, 
      'Training.EUCS', 
      (SELECT 'Online Training (SN:'[email protected]+')'), 40,'Online Training', 7, 'Company', IICustID 
      FROM inserted 
      WHERE IIStockTypeID = 1 
       AND IICustID IN (SELECT IICustID 
           FROM T_IIInvoiceItem 
           INNER JOIN T_InInvoice ON InInvoiceID = IIInvoiceID 
           INNER JOIN T_CuCust ON CuCustID = IICustID 
           WHERE IIStockTypeID = 1 AND InTransStatusID = 0 
           GROUP BY IICustID 
           HAVING COUNT(IICustID) = 1) 

触发代码

ALTER TRIGGER [dbo].[SerialTrigger] 
    ON [dbo].[T_IIInvoiceItem] 
    AFTER INSERT 
+0

请准备这个问题的简短,完整的摄制。你可能会像你一样发现你的错误。如果没有,请将其添加到您的问题中。 –

+0

@ DavidBrowne-Microsoft我发布了实际的声明。 – DeepDiver

+0

我的猜测是你的insert语句正在检查表中是否存在一行。第一次,不存在,并且在插入行后触发器触发。第二次,该行已经存在于'T_IIIInvoiceItem'中,并且什么都不插入。没有插入物,没有触发点火。你可以附加你的触发代码吗?如果触发条件不满足,您可能希望调用事务回滚。 – Xedni

回答

1

试试这个(每@DeepDiver):

SET NOCOUNT ON; 

--********************************************** 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
--********************************************** 

DECLARE @SerialNo NVARCHAR(50) 

    -- ----------------------------------------------------- 
    SELECT TOP 1 @SerialNo = SNSerialNoTx 
    FROM T_SNSerialNo 
    WHERE SNStockItemID = 7058 
     AND SNInvoiceID_N IS NULL ; 

    -- ----------------------------------------------------- 
    ; WITH ins 
    AS (
     SELECT IIInvoiceID, IIStockTypeID, IICustID 
     FROM Inserted 
     WHERE IIStockTypeID = 1 
      AND IICustID IN (
       SELECT IICustID 
       FROM T_IIInvoiceItem 
        INNER JOIN T_InInvoice ON InInvoiceID = IIInvoiceID 
        INNER JOIN T_CuCust ON CuCustID = IICustID 
       WHERE IIStockTypeID = 1 
        AND InTransStatusID = 0 
       GROUP BY IICustID 
       HAVING COUNT(IICustID) = 1 
       ) 
     ) 
    -- ----------------------------------------------------- 
    INSERT INTO T_IIInvoiceItem (IIInvoiceID, IIProfitCenterID, IIStockItemID, IISerialNoTx_N, 
           IIQtyIn, IICostPriceCompsTx, IITaxBandIDsTx, IITaxRatesTx, 
           IIStockNoTx, IIStockItemTx, IIStockTypeID, IIStockTypeTx, 
           IIManufacturerID, IIManufacturerTx, IICustID) 
    SELECT 
     IIInvoiceID 
     , 23 
     , 7058 
     , @SerialNo 
     , IIStockTypeID 
     , '-1:[email protected]' 
     , 0 
     , 0 
     , 'Training.EUCS' 
     , 'Online Training (SN:'[email protected]+')' 
     , 40 
     ,'Online Training' 
     , 7 
     , 'Company' 
     , IICustID 
    FROM ins 
+0

tnx很多,它的工作原理在语法上都是正确的,不幸的是,情况相同。一旦添加了不符合CTE中的标准的记录,下次满足标准时触发器不会插入新记录。 – DeepDiver

+0

我不知道它是否看不到这些,因为它们没有被提交 - 基本上它在提交之前等待触发器。我编辑了触发器,将事务隔离级别设置为READ UNCOMMITTED - 尝试一下,让我们知道它是否有效。触发完成后,隔离级别将重置,因此不应在触发器之外引发任何问题。 –

+0

tnx很多为您的帮助。不知怎的,就像你说的那样。 Colic IICustID是由另一个触发器产生的,我昨晚才发现这一点。我现在从层次结构(发票表)中较高的表中检索CustID,因为该值已经存在,并且一切正常。像往常一样,我学到了很多东西,尤其是从你最新加入的东西。谢谢。 – DeepDiver