我设法让自己陷入了困境,我对通知系统中使用的表进行了快速的重新设计,并设法使这些东西完全无用。
任何使用它们的尝试(select/update/insert/delete/alter)都会导致一个无限期运行的查询。我相信我不小心误用了级联选项,使之接近史诗般的比例。下面是我使用过的三个表和相关键
通过使用"WITH (NOLOCK)“提示,我成功地选择了表的形式,但是我删除/更改TBL_NOTIFICATIONS表上的约束的尝试没有成功。希望你们中的一个能看到我哪里出了错&好好惩罚我。
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]
GOTBL_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正如我已经提到的,SELECT语句可以通过使用"WITH (NOLOCK)“对表执行,但是任何修改它们的尝试都会遇到无限加载的查询。我试图修改UPDATE和DELETE约束(改为“无操作”和"SET“),但没有成功。同样,使用带DROP约束的ALTER只会永远运行。
在查询"sys.foreign_keys“时,我可以查看约束,但是我不认为我可以直接修改系统表,尽管我非常希望在这一点上被告知其他方面。
是否有人有任何想法:( a)如何删除这些表上的约束/键;或( b)如何在不遇到另一个锁的情况下删除这些表
欢迎的任何想法,特别是欢迎,都会暗示我到底是如何使这些表对我的SQL-fu免疫的。
提前感谢
发布于 2014-07-03 16:13:17
我没有足够的声誉来评论,所以请原谅我把这个作为一个回答,也许一个国防部想要移动它?
您是否尝试过访问SSMS中的“活动监视器”,并查看是否有阻塞的进程(您可以从那里杀死进程)?持有锁的卡住过程会引起你所描述的症状。
在这里阻塞有一个很好的线程,How to find what is locking my tables
https://stackoverflow.com/questions/24558078
复制相似问题