Saya akan memandu Anda melalui contoh, jadi, Anda dapat melihat mengapa itu membutuhkan waktu lama. Membuat database kosong untuk pengujian ini.
CREATE DATABASE [TestFK]
GO
Membuat 2 tabel.
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
Membuat batasan Kunci Asing di tabel Orang.
USE [TestFK]
GO
ALTER TABLE dbo.Person ADD CONSTRAINT FK_Person_AddressID FOREIGN KEY (AddressID)
REFERENCES dbo.Address(AddressID)
GO
Masukkan beberapa data ke dalam kedua tabel.
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
Buka jendela permintaan baru dan jalankan ini (jangan tutup jendela setelah permintaan selesai).
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
Buka jendela permintaan lain dan jalankan ini.
USE [TestFK]
GO
ALTER TABLE dbo.person DROP CONSTRAINT FK_Person_AddressID
Anda akan melihat Anda menjatuhkan batasan akan terus berjalan (menunggu) dan sekarang jalankan kueri untuk melihat mengapa itu berjalan lebih lama dan kunci apa yang ditunggu.
SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;
Setelah Anda melakukan operasi penyisipan Anda, batasan drop akan selesai segera karena sekarang pernyataan drop dapat memperoleh kunci yang diperlukan.
Untuk kasus Anda, Anda perlu memastikan tidak ada sesi memegang kunci yang kompatibel yang akan mencegah drop drop untuk mendapatkan kunci / kunci yang diperlukan.