我设法让自己陷入了困境,我对通知系统中使用的表格进行了快速重新设计,并设法使这些东西完全无用。
任何使用它们的尝试(选择/更新/插入/删除/更改)都会导致查询无限期运行。我相信我已经成功地意外地滥用了 CASCADE 选项,达到了接近史诗般的程度。下面是我使用过的三个表和相关键
我已经设法使用“WITH (NOLOCK)”提示来选择表,但是我尝试删除/更改 TBL_NOTIFICATIONS 表上的 CONSTRAINTS 却没有成功。希望你们中的一位能够看到我哪里做错了并适本地惩罚我。
/image/ag2W5.png (关系结构,我在包含图像方面还没有足够的声誉)
TBL_通知:
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 语句,但是任何修改它们的尝试都会遇到无限加载查询。我尝试更改更新和删除约束(更改为“NO ACTION”和“SET NULL”),但没有成功。同样,将 ALTER TABLE 与 DROP CONSTRAINT 一起使用只会永远运行。
我可以在查询“sys.foreign_keys”时查看约束,但是我不相信我可以直接修改系统表,尽管我非常希望在这一点上被告知。
有人对以下任一方面有任何想法吗: a) 如何删除这些表上的约束/键,或者 b) 如何在不遇到另一个锁的情况下删除表
欢迎任何和所有的想法,特别是欢迎将暗示我到底是如何设法使这些表免受我的 SQL-fu 的影响。
提前致谢
最佳答案
我没有足够的声誉来发表评论,所以请原谅我将其发布为答案,也许 Mod 想要移动它?
您是否尝试过进入 SSMS 中的“事件监视器”并查看是否有被阻止的进程(您可以从那里终止进程)?持有锁的卡住进程会导致您所描述的症状。
这里有一个关于阻塞的很好的线程 How to find what is locking my tables
关于sql - T-SQL/SSIS - 使用主/外键重新设计后表锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24558078/