导致主键违规的触发

时间:2017-08-17 16:31:35

标签: sql sql-server

我们有一个触发器,我们正在尝试更新,以便在更新记录时,触发器将更新第二个表。当我们激活更改时,我们会收到错误

  

违反PRIMARY KEY约束'KPRIMARY_SO_SalesOrderHeader'。无法在对象'dbo.SO_SalesOrderHeader'中插入重复键。重复键是XXXXXX。

我真的很困惑,因为我没有在触发器中看到我们试图插入一个键。

ALTER Trigger [dbo].[SO_SALESORDERHEADER_onOrderChange] 
ON [dbo].[SO_SalesOrderHeader] 
FOR INSERT, UPDATE
AS 
    SET NOCOUNT ON;
    --+
    INSERT INTO dbo.OrderUpdateQueue (SourceId, OrderNumber, Action)
        SELECT DISTINCT
            N'SO', Inserted.SALESORDERNO, N'U'
        FROM
            Inserted
        LEFT JOIN
            dbo.OrderUpdateQueue ON (Inserted.SALESORDERNO = OrderUpdateQueue.OrderNumber)
                                 AND (OrderUpdateQueue.SourceID = N'SO')
                                 AND (OrderUpdateQueue.Action = N'U')
        WHERE 
            (OrderUpdateQueue.[Key] IS NULL)
            AND (Inserted.SALESORDERNO IS NOT NULL);
    --+ New Trigger Stuff
    UPDATE MO
    SET MO.[ShipDate] = I.ShipExpireDate
    FROM [BACKEND_db].[dbo].[Order] MO
    INNER JOIN Inserted I ON I.SalesOrderNo = MO.OrderId
    WHERE MO.ShipDate <> I.ShipExpireDate;



CREATE TABLE [dbo].[SO_SalesOrderHeader](
[SalesOrderNo] [varchar](7) NOT NULL
  CONSTRAINT [KPRIMARY_SO_SalesOrderHeader] PRIMARY KEY CLUSTERED 
(
[SalesOrderNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[OrderUpdateQueue](
[Key] [int] IDENTITY(1,1) NOT NULL,
[SourceId] [nvarchar](50) NOT NULL,
[OrderNumber] [nvarchar](50) NOT NULL,
[Action] [nchar](1) NOT NULL,
CONSTRAINT [PK_OrderUpdateQueue] PRIMARY KEY CLUSTERED 
(
[Key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

USE [BACKEND_db]
CREATE TABLE [dbo].[Order](
[Key] [int] IDENTITY(1,1) NOT NULL,
[OrderId] [nvarchar](10) NULL,
[ShipDate] [datetime] NULL
CONSTRAINT [PK_MasOrder] PRIMARY KEY CLUSTERED 
(
[Key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO

1 个答案:

答案 0 :(得分:0)

如何发布OrderUpdateQueue表的架构,我相信pk是OrderNumber字段。您可以尝试将触发器更改为:

ALTER Trigger [dbo].[SO_SALESORDERHEADER_onOrderChange] 
ON [dbo].[SO_SalesOrderHeader] 
FOR INSERT, UPDATE
AS 
    SET NOCOUNT ON;
    --+
    INSERT INTO dbo.OrderUpdateQueue (SourceId, OrderNumber, Action)

SELECT DISTINCT
            N'SO', Inserted.SALESORDERNO, N'U'
        FROM
            Inserted 
        WHERE not exists (SELECT 1 FROM dbo.OrderUpdateQueue  where Inserted.SALESORDERNO = OrderUpdateQueue.OrderNumber) 

 UPDATE MO
    SET MO.[ShipDate] = I.ShipExpireDate
    FROM [BACKEND_db].[dbo].[Order] MO
    INNER JOIN Inserted I ON I.SalesOrderNo = MO.OrderId
    WHERE MO.ShipDate <> I.ShipExpireDate;