简单的SQL Server删除失败

时间:2017-12-07 23:01:28

标签: sql-server

我看到简单删除后出现间歇性故障。

基本上我有一个包含许多条目的临时说明。每个条目都有一个分类,它是一个查找值。完成此注释后,它将被发送到注释存储库,并且需要删除临时版本。

我无法可靠地复制,但有时,当调用执行删除临时注释的存储过程时,只会删除一些条目。巧合的是(?)留下的条目一直是一种特定的分类类型。

经过多次尝试后,我能够在运行SQL Server Profiler时重现该问题。尽管试图捕获At​​tention,ErrorLog,EventLog,Exception和Execution Warnings,但结果配置文件并没有显示任何异常。

所涉及的表都不大。事实上,他们是微不足道的。在任何给定时间进入约100-1000,草稿约100,分类9,类别3。

我不相信它应该重要,但为了以防万一,这个存储过程是从实体框架调用的。

有什么想法吗?有关如何进行故障排除的任何想法?我完全不知所措。提前感谢您的帮助。

以下是删除的存储过程:

CREATE PROCEDURE [NoteDraft].[ClearNoteDraft]
    @DraftId BIGINT
AS
BEGIN
    SET NOCOUNT ON;

    DELETE FROM NoteDraft.[Entry]
    WHERE DraftId = @DraftId

    DELETE FROM NoteDraft.Draft
    WHERE Id = @DraftId
END

以下是表格定义(为简洁起见,省略了一些栏目。)

CREATE TABLE [NoteDraft].[Category]
(
   [Id] [int] IDENTITY(1,1) NOT NULL,
   [Name] [varchar](50) NOT NULL,
   [SortOrder] [int] NULL,

   CONSTRAINT [PK_Category] 
       PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY]

CREATE TABLE [NoteDraft].[Classification]
(
   [Id] [int] IDENTITY(1,1) NOT NULL,
   [CategoryId] [int] NOT NULL,
   [Name] [varchar](50) NOT NULL,
   [SortOrder] [int] NULL,

   CONSTRAINT [PK_Classification] 
       PRIMARY KEY CLUSTERED ([Id] ASC)
)

CREATE TABLE [NoteDraft].[Draft]
(
   [Id] [bigint] IDENTITY(1,1) NOT NULL,
   [DateModified] [datetime] NOT NULL CONSTRAINT [DF_TestNoteDraft_DateModified]  DEFAULT (getdate()),
   [AccountNumber] [varchar](30) NULL,
   --...10 other biz columns...
   CONSTRAINT [PK_Notes] 
       PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY]

CREATE TABLE [NoteDraft].[Entry]
(
   [DraftId] [bigint] NOT NULL,
   [ClassificationId] [int] NOT NULL,
   [Body] [varchar](2100) NULL,
   CONSTRAINT [PK_Entry] 
       PRIMARY KEY CLUSTERED ([DraftId] ASC, [ClassificationId] ASC)
) ON [PRIMARY]

ALTER TABLE [NoteDraft].[Classification] WITH CHECK 
     ADD CONSTRAINT [FK_Classification_Category] 
         FOREIGN KEY([CategoryId]) REFERENCES [NoteDraft].[Category] ([Id])
GO

ALTER TABLE [NoteDraft].[Classification] CHECK CONSTRAINT [FK_Classification_Category]
GO

ALTER TABLE [NoteDraft].[Entry]  WITH CHECK 
     ADD CONSTRAINT [FK_Entry_Classification] 
         FOREIGN KEY([ClassificationId]) REFERENCES [NoteDraft].[Classification] ([Id])
GO

ALTER TABLE [NoteDraft].[Entry] CHECK CONSTRAINT [FK_Entry_Classification]
GO

ALTER TABLE [NoteDraft].[Entry]  WITH CHECK 
     ADD CONSTRAINT [FK_Entry_Draft] 
         FOREIGN KEY([DraftId]) REFERENCES [NoteDraft].[Draft] ([Id])
GO

ALTER TABLE [NoteDraft].[Entry] CHECK CONSTRAINT [FK_Entry_Draft]
GO

1 个答案:

答案 0 :(得分:0)

就像这样简单的事情一样,答案并不是我在寻找的地方。

事实证明,页面上有一个事件监听器,它会在删除后重新插入记录。

仍无法弄清楚为什么听众在跑,但至少我知道发生了什么。