Я расскажу вам пример, и вы поймете, почему это заняло много времени. Создание пустой базы данных для этого теста.
CREATE DATABASE [TestFK]
GO
Создание 2 таблиц.
USE [TestFK]
GO
CREATE TABLE dbo.[Address] (
ADDRESSID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Address1 VARCHAR(50),
City VARCHAR(50),
[State] VARCHAR(10),
ZIP VARCHAR(10));
GO
CREATE TABLE dbo.Person (
PersonID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(50) NOT NULL,
FirstName VARCHAR(50),
AddressID INT);
GO
Создание ограничения внешнего ключа для таблицы Person.
USE [TestFK]
GO
ALTER TABLE dbo.Person ADD CONSTRAINT FK_Person_AddressID FOREIGN KEY (AddressID)
REFERENCES dbo.Address(AddressID)
GO
Вставьте некоторые данные в обе таблицы.
USE [TestFK]
GO
INSERT dbo.Address (Address1,City,[State],Zip)
SELECT '123 Easy St','Austin','TX','78701'
UNION
SELECT '456 Lakeview','Sunrise Beach','TX','78643'
GO
INSERT dbo.Person (LastName,FirstName,AddressID)
SELECT 'Smith','John',1
UNION
SELECT 'Smith','Mary',1
UNION
SELECT 'Jones','Max',2
GO
Откройте новое окно запроса и запустите его (не закрывайте окно после завершения запроса).
USE [TestFK]
GO
BEGIN TRAN
INSERT dbo.Person (LastName,FirstName,AddressID)
SELECT 'Smith1','John1',1
UNION
SELECT 'Smith1','Mary1',1
UNION
SELECT 'Jones1','Max1',2
Откройте другое окно запроса и запустите это.
USE [TestFK]
GO
ALTER TABLE dbo.person DROP CONSTRAINT FK_Person_AddressID
Вы увидите, что отбрасываемое ограничение будет продолжать работать (ждать), и теперь запустите запрос, чтобы увидеть, почему он работает дольше и каких блокировок он ожидает.
SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;
После того, как вы подтвердите операцию вставки, ограничение сброса будет немедленно выполнено, потому что теперь оператор drop может получить требуемую блокировку.
В вашем случае вам нужно убедиться, что ни один сеанс не удерживает совместимую блокировку, которая будет препятствовать сбросу ограничения для получения необходимых блокировок / блокировок.