2017-08-17 81 views
1

我们有一个触发器,我们正在尝试更新,以便更新记录时触发器将更新第二个表。当我们激活变化,我们得到一个错误触发器导致主键违规

违反PRIMARY KEY contstraint的“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

启动触发器的表中的主键是SO_SalesOrderHeader.Salesorderno。我们正在更新的辅助表上的主键是Order。[key] – MattC

+0

哪个表有一个名为''KPRIMARY_SO_SalesOrderHeader'的约束? –

回答

1

如何不发布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; 
+0

我收到了与此代码相同的错误消息。原谅我的无知,你想通过“发布模式”看到什么?我会在其他帖子中搜索一个例子。 – MattC

+0

当我们研究与PK,FK和其他违规相关的SQL问题时,我们需要了解这些表是他们与所有问题环境之间的联系。如果你看到上面的评论,所有人都在问你关于表模式。 –

+0

显示/描述模式的最佳方式是什么?有没有查询我应该运行和粘贴结果? – MattC