【问题标题】:Trigger needs to use inserted record columns in select触发器需要在选择中使用插入的记录列
【发布时间】:2011-08-22 13:41:33
【问题描述】:

我们有一个运输表,其中包含一个 orderID (oid) 和一个发票号 (ino) 以及一个序列号列。我正在尝试编写一个触发器,将序列号设置为零或如果存在唯一的 oid、ino、seq 集则将其递增。我不知道如何引用插入记录的 OID 和 INO 列?

这是我目前得到的:

CREATE TRIGGER SHPVIAb_insert ON [acsdcs2].[dbo].[SHPVIAb]
FOR INSERT
AS
DECLARE @newseq tinyint;
SET @newseq = 0;
IF EXISTS (SELECT *
           FROM [acsdcs2].[dbo].[SHPVIAb] s 
           WHERE s.SHVOID_AN = inserted.SHVOID_AN
             AND s.SHVINO_AN = inserted.SHVINO_AN
          )
  BEGIN
    SET @newseq = (SELECT MAX(SHVSEQ_US)
           FROM [acsdcs2].[dbo].[SHPVIAb] s 
           WHERE s.SHVOID_AN = inserted.SHVOID_AN
             AND s.SHVINO_AN = inserted.SHVINO_AN)
    SET @newseq = @newseq + 1
  END

update [acsdcs2].[dbo].[SHPVIAb]
   set SHVSEQ_US=@newseq;

【问题讨论】:

  • 什么数据库后端?触发器代码是非常特定于数据库的
  • 我可以告诉你,如果这是用于 SQl 服务器(我怀疑来自插入的伪表引用),你的触发器写得不好,因为它假设插入的表中永远不会有超过一条记录。这是一个在编写触发器时非常糟糕的假设,它们只为一批中的所有记录触发一个。

标签: sql-server triggers insert


【解决方案1】:

我认为这样的事情更接近你想要的。您想加入插入的表,并处理一次插入多个记录的情况。

CREATE TRIGGER SHPVIAb_insert ON [acsdcs2].[dbo].[SHPVIAb]
    FOR INSERT
AS
BEGIN
    IF EXISTS ( SELECT  1
                FROM    [acsdcs2].[dbo].[SHPVIAb] s
                        INNER JOIN INSERTED i ON s.SHVOID_AN = i.SHVOID_AN
                                                 AND s.SHVINO_AN = i.SHVINO_AN ) 
        BEGIN
            UPDATE  s
            SET     SHVSEQ_US = ( SELECT    MAX(SHVSEQ_US)
                                  FROM      [acsdcs2].[dbo].[SHPVIAb] ss
                                  WHERE     ss.SHVOID_AN = s.SHVOID_AN
                                            AND ss.SHVINO_AN = s.SHVINO_AN
                                ) + 1
            FROM    [acsdcs2].[dbo].[SHPVIAb] s
                    INNER JOIN INSERTED i ON s.SHVOID_AN = i.SHVOID_AN
                                             AND s.SHVINO_AN = i.SHVINO_AN 
        END
END        

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 2015-04-17
    相关资源
    最近更新 更多