Ti guiderò attraverso un esempio così, puoi vedere perché ci è voluto molto tempo. Creazione di un database vuoto per questo test.
CREATE DATABASE [TestFK]
GO
Creazione di 2 tabelle.
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
Creazione di un vincolo di chiave esterna sulla tabella Persona.
USE [TestFK]
GO
ALTER TABLE dbo.Person ADD CONSTRAINT FK_Person_AddressID FOREIGN KEY (AddressID)
REFERENCES dbo.Address(AddressID)
GO
Inserisci alcuni dati in entrambe le tabelle.
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
Aprire una nuova finestra della query ed eseguirla (non chiudere la finestra una volta completata la query).
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
Apri un'altra finestra di query ed esegui questo.
USE [TestFK]
GO
ALTER TABLE dbo.person DROP CONSTRAINT FK_Person_AddressID
Vedrai che il vincolo di rilascio continuerà a funzionare (in attesa) e ora esegui la query per vedere perché è in esecuzione più a lungo e quali blocchi sta aspettando.
SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;
Dopo aver eseguito l'operazione di inserimento, il vincolo di rilascio verrà completato immediatamente poiché ora l'istruzione di rilascio può acquisire il blocco richiesto.
Nel tuo caso devi assicurarti che nessuna sessione sia in possesso di un blocco compatibile che impedirà il vincolo di caduta per acquisire i blocchi / blocchi necessari.