Przedstawię ci przykład, abyś mógł zobaczyć, dlaczego zajęło to dużo czasu. Tworzenie pustej bazy danych dla tego testu.
CREATE DATABASE [TestFK]
GO
Tworzenie 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
Tworzenie ograniczenia klucza obcego w tabeli Person.
USE [TestFK]
GO
ALTER TABLE dbo.Person ADD CONSTRAINT FK_Person_AddressID FOREIGN KEY (AddressID)
REFERENCES dbo.Address(AddressID)
GO
Wstaw niektóre dane do obu 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
Otwórz nowe okno zapytania i uruchom je (nie zamykaj okna po zakończeniu zapytania).
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
Otwórz kolejne okno zapytania i uruchom to.
USE [TestFK]
GO
ALTER TABLE dbo.person DROP CONSTRAINT FK_Person_AddressID
Zobaczysz, że upuszczenie ograniczenia będzie nadal działać (czeka), a teraz uruchom zapytanie, aby zobaczyć, dlaczego działa dłużej i na jakie blokady czeka.
SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;
Po zatwierdzeniu operacji wstawiania ograniczenie upuszczania zostanie natychmiast zakończone, ponieważ teraz instrukcja drop może uzyskać wymaganą blokadę.
W twoim przypadku musisz upewnić się, że żadna sesja nie posiada kompatybilnej blokady, która zapobiegnie ograniczeniu upuszczenia w celu uzyskania niezbędnej blokady / blokad.