Size bir örnek vereceğim, böylece neden uzun zaman aldığını görebilirsiniz. Bu sınama için boş bir veritabanı oluşturma.
CREATE DATABASE [TestFK]
GO
2 tablo oluşturma.
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
Kişi tablosunda Yabancı Anahtar kısıtı oluşturma.
USE [TestFK]
GO
ALTER TABLE dbo.Person ADD CONSTRAINT FK_Person_AddressID FOREIGN KEY (AddressID)
REFERENCES dbo.Address(AddressID)
GO
Her iki tabloya da bazı veriler ekleyin.
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
Yeni bir sorgu penceresi açın ve bunu çalıştırın (sorgu tamamlandıktan sonra pencereyi kapatmayın).
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
Başka bir sorgu penceresi açın ve bunu çalıştırın.
USE [TestFK]
GO
ALTER TABLE dbo.person DROP CONSTRAINT FK_Person_AddressID
Bırakma kısıtını çalıştırmaya devam edeceğinizi göreceksiniz (bekleyen) ve şimdi neden daha uzun çalıştığını ve hangi kilitleri beklediğini görmek için sorguyu çalıştırın.
SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;
Ekleme işleminizi tamamladıktan sonra, drop deyimi derhal tamamlanacaktır çünkü artık drop deyimi gerekli kilidi alabilir.
Sizin durumunuz için, hiçbir oturumun, gerekli kısıtlama / kilitleri almasını engelleyecek uyumlu bir kilit tutmadığından emin olmanız gerekir.