【问题标题】:T-SQL/SSIS - Tables locking after redesign with primary/foreign keysT-SQL/SSIS - 使用主键/外键重新设计后锁定表
【发布时间】:2014-08-24 20:03:26
【问题描述】:

我设法让自己陷入了困境,我快速重新设计了通知系统中使用的表格,并设法使这些东西完全无用。

任何使用它们的尝试(选择/更新/插入/删除/更改)都会导致查询无限期地运行。我相信我已经设法不小心误用了 CASCADE 选项以接近史诗般的比例。以下是我使用过的三个表和关联键

我已经设法通过使用“WITH (NOLOCK)”提示从表中选择,但是我尝试删除/更改 TBL_NOTIFICATIONS 表上的 CONSTRAINTS 却没有成功。希望你们中的一个人能够看到我哪里出错并正确地责备我。

http://i.imgur.com/s8YrFFn.png(关系结构,我在包含图片方面还没有足够的声誉)

TBL_NOTIFICATIONS:

CREATE TABLE [dbo].[TBL_NOTIFICATIONS]
(
    [NotificationID]    INT IDENTITY(0,1)   NOT NULL,
    [ApplicationID]     INT                 NULL,
    [SubApplicationID]  INT                 NULL,
    [Title]             NVARCHAR(50)        NULL,
    [ShortDesc]         NVARCHAR(512)       NULL,
    [Link]              NVARCHAR(100)       NULL,
    [RaisedBy]          NVARCHAR(36)        NULL,
    [RaisedFor]         NVARCHAR(36)        NULL,
    [Show]              INT                 NULL,
    [DateCreated]       DATETIME            NULL,
    [DateToArchive]     DATETIME            NULL,
    CONSTRAINT [PK_TBL_NOTIFICATIONS] PRIMARY KEY CLUSTERED 
    (
        [NotificationID] 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

ALTER TABLE [dbo].[TBL_NOTIFICATIONS]
WITH CHECK ADD CONSTRAINT [FK_TBL_NOTIFICATIONS_TBL_NOTIFICATIONS_APPLICATION_DESCRIPTIONS]
FOREIGN KEY( [ApplicationID] )
REFERENCES [dbo].[TBL_NOTIFICATIONS_APPLICATION_DESCRIPTIONS] ( [ApplicationID] )
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[TBL_NOTIFICATIONS] CHECK CONSTRAINT [FK_TBL_NOTIFICATIONS_TBL_NOTIFICATIONS_APPLICATION_DESCRIPTIONS]
GO

ALTER TABLE [dbo].[TBL_NOTIFICATIONS]
WITH CHECK ADD CONSTRAINT [FK_TBL_NOTIFICATIONS_TBL_NOTIFICATIONS_SUBAPPLICATION_DESCRIPTIONS]
FOREIGN KEY( [SubApplicationID], [ApplicationID] )
REFERENCES [dbo].[TBL_NOTIFICATIONS_SUBAPPLICATION_DESCRIPTIONS] ( [SubApplicationID], [ApplicationID] )
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[TBL_NOTIFICATIONS] CHECK CONSTRAINT [FK_TBL_NOTIFICATIONS_TBL_NOTIFICATIONS_SUBAPPLICATION_DESCRIPTIONS]
GO

TBL_NOTIFICATIONS_APPLICATION_DESCRIPTIONS:

CREATE TABLE [dbo].[TBL_NOTIFICATIONS_APPLICATION_DESCRIPTIONS]
(
    [ApplicationID] [int] NOT NULL,
    [Description] [nvarchar](50) NULL,
    CONSTRAINT [PK_TBL_NOTIFICATIONS_APPLICATION_DESCRIPTIONS] PRIMARY KEY CLUSTERED 
    (
        [ApplicationID] 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

最后……

TBL_NOTIFICATIONS_SUBAPPLICATION_DESCRIPTIONS:

CREATE TABLE [dbo].[TBL_NOTIFICATIONS_SUBAPPLICATION_DESCRIPTIONS]
(
    [SubApplicationID] [int] NOT NULL,
    [ApplicationID] [int] NOT NULL,
    [Description] [nvarchar](50) NULL,
    [ImagePath] [nvarchar](200) NULL,
    CONSTRAINT [PK_TBL_NOTIFICATIONS_SUBAPPLICATION_DESCRIPTIONS] PRIMARY KEY CLUSTERED 
    (
        [SubApplicationID] ASC,
        [ApplicationID] 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

正如我所提到的,可以使用“WITH (NOLOCK)”对表执行 SELECT 语句,但是任何修改它们的尝试都会遇到无限加载的查询。我试图更改 UPDATE 和 DELETE CONSTRAINTS(更改为“NO ACTION”和“SET NULL”)但没有成功。同样,将 ALTER TABLE 与 DROP CONSTRAINT 一起使用只会永远运行。

我可以在查询“sys.foreign_keys”时查看约束,但是我不相信我可以直接修改系统表,尽管我非常希望在这一点上被告知。

有没有人有任何想法: a)如何删除这些表上的约束/键,或 b) 如何在不遇到另一个锁的情况下删除表

欢迎任何和所有想法,特别欢迎的是我如何设法使这些表不受我的 SQL-fu 影响的提示。

提前致谢

【问题讨论】:

    标签: sql sql-server tsql ssms


    【解决方案1】:

    我没有足够的声誉来发表评论,所以请原谅我将这个作为答案发布,也许 Mod 想要移动它?

    您是否尝试过进入 SSMS 中的“活动监视器”并查看您是否有一个被阻止的进程(您可以从那里杀死进程)?持有锁的卡住进程会导致您描述的症状。

    这里有一个很好的阻塞线程How to find what is locking my tables

    【讨论】:

    • 你很准确,出于某种原因我没有考虑到这一点。原来你毕竟提出了正确的答案!谢谢你的建议
    • 太好了,很高兴我能帮上忙 :-)
    • 我创建了一个工具,可以帮助您找出锁定表的原因:stackoverflow.com/a/59838858/612609 看看,它是开源的。
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多