【问题标题】:How to update a table inside AFTER INSERT trigger on different table?如何更新不同表上的 AFTER INSERT 触发器内的表?
【发布时间】:2019-08-09 11:56:17
【问题描述】:

我有一个表 DISPENSE_DOSAGES 并在此表上创建了一个 AFTER INSERT 触发器。在该触发器中,我正在尝试更新另一个表DISPENSE_DRUGS,该表具有与INSERTED 表匹配的行。当一行插入DISPENSE_DOSAGES 时,触发器成功触发,但它不更新DISPENSE_DRUGS 中的行。我知道这条线正在产生问题。

WHERE [DISPENSE_ID] IN (SELECT [DISPENSE_ID] FROM INSERTED)

上述代码中的(SELECT [DISPENSE_ID] FROM INSERTED) 行正在生成问题。

我知道触发器需要批量插入并尝试了游标解决方案,但它对我不起作用。

这是触发器的代码

CREATE TRIGGER [dbo].[TRG_DISPENSE_DOSAGES]
ON [dbo].[DISPENSE_DOSAGES] 
AFTER INSERT     
AS
BEGIN
    IF (EXISTS (SELECT [DISPENSE_ID]
                FROM INSERTED
                WHERE [DISPENSE_ID] IN (SELECT [DISPENSE_ID] 
                                        FROM [DISPENSE_DOSAGES]
                                        WHERE [SEPARATE_ITEM] = 1)))
    BEGIN
        UPDATE [dbo].[DISPENSE_DRUGS]
        SET QUANTITY_DISPENSED = 0,
            QUANTITY_OWED = QUANTITY_PRESCRIBED
        WHERE [DISPENSE_ID] IN (SELECT [DISPENSE_ID] FROM INSERTED)  --This line generates issue
    END
END

【问题讨论】:

  • 您使用的是哪个 dbms? (该代码是特定于产品的。)
  • 我正在使用 SQL Server
  • 触发器正确触发,如果条件为真。但更新语句不起作用。
  • 您的描述与代码不匹配 - 您说您在 DISPENSE_DOSAGES 上有触发器,但代码是 DISPENSE_DRUGS 上的触发器?
  • 错误信息或问题是什么?为什么你知道WHERE [DISPENSE_ID] IN (SELECT [DISPENSE_ID] FROM INSERTED) 导致了这个问题?

标签: sql-server tsql database-trigger


【解决方案1】:

我认为您唯一的问题是您创建触发器的表格。

试试这个,正如你所说的,你正在 DISPENSE_DOSAGES 创建触发器,但在你的创建触发器中你写了 'DISPENSE_DRUGS, and because of this on any insertion inDISPENSE_DOSAGES` 触发器不起作用,因为它实际上不起作用。

    CREATE TRIGGER [dbo].[TRG_DISPENSE_DRUGS]
        ON [dbo].[DISPENSE_DOSAGES] AFTER INSERT     
    AS
    BEGIN
        IF (EXISTS (SELECT [DISPENSE_ID]
                    FROM INSERTED
                    WHERE 
                    [DISPENSE_ID] IN (SELECT [DISPENSE_ID] FROM [DISPENSE_DOSAGES]
                        WHERE [SEPARATE_ITEM] = 1)))
                            BEGIN
                                UPDATE 
                                [Integra].[dbo].[DISPENSE_DRUGS]
                                SET QUANTITY_DISPENSED = 0,QUANTITY_OWED = QUANTITY_PRESCRIBED
                                WHERE [DISPENSE_ID] IN (SELECT [DISPENSE_ID] FROM INSERTED)  --This line generates issue
                            END
    END

【讨论】:

  • 对不起,这是旧代码。但是触发器在 DISPENSE_DOSAGES 表上,我正在更新 DISPENSE_DRUGS 表。
  • 343597781504 是我插入 DISPENSE_DOSAGES 表并与插入表比较的 DISPENSE_ID
猜你喜欢
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
相关资源
最近更新 更多