【发布时间】: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