例を挙げて説明しますので、なぜ時間がかかったのかがわかります。このテスト用に空のデータベースを作成します。
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;
挿入操作をコミットすると、ドロップ文は必要なロックを取得できるため、ドロップ制約はすぐに完了します。
あなたの場合、セッションが互換性のあるロックを保持していないことを確認する必要があります。これにより、ドロップ制約が必要なロックを取得できなくなります。