sql - T-SQL/SSIS - 使用主/外键重新设计后表锁定

标签 sql sql-server t-sql ssms

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

任何使用它们的尝试(选择/更新/插入/删除/更改)都会导致查询无限期运行。我相信我已经成功地意外地滥用了 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/

相关文章:

sql - 跨数据库 SQL 脚本

sql - T SQL - 拆分和合并列

mysql - 我正在使用 2 个查询,有什么方法可以使它成为单个查询

javascript - 从网页中的 JavaScript 函数访问 PHP 变量

用于网络测试的 SQL Server

sql - 我如何正确地装框这个校对?

sql-server - Url Decode T-SQL 函数未翻译超出 ascii 范围的字符

php - 从每个对话 sql 中获取最后一条消息

mysql - 从我的查询中过滤掉特定的电子邮件域

sql-server - 关闭 SQL Server/T-SQL 中的日记功能