922 Stimmen

Wie können Fremdschlüssel-Beschränkungen mit T-SQL vorübergehend deaktiviert werden?

Wird das Deaktivieren und Aktivieren von Fremdschlüssel-Beschränkungen in SQL Server unterstützt? Oder ist meine einzige Option drop und dann re- create die Zwänge?

147 Stimmen

Für Leute, die sich fragen, "warum" ich dies tun möchte: Es geht um eine Testumgebung, in der ich in der Lage sein möchte, Testdaten aus mehreren Tabellen zu entfernen und zu laden, ohne dass ich die Reihenfolge, in der die Daten geladen werden, pflegen und festlegen muss. Die Datenintegrität ist in diesem Szenario nicht so wichtig.

9 Stimmen

Hinweis: Wenn Sie die Tabelle TRUNCATE (löschen) möchten, müssen Sie die Beschränkungen tatsächlich aufheben.

0 Stimmen

@OutstandingBill Offensichtlich, dies funktioniert für TRUNCATE .

1voto

Carter Medlin Punkte 11077

Sie können die Beschränkungen für Ihre Tabellen vorübergehend deaktivieren, die Arbeit erledigen und sie dann wiederherstellen.

Hier ist ein einfacher Weg, dies zu tun...

Deaktivieren Sie alle Indizes, einschließlich der Primärschlüssel, wodurch alle Fremdschlüssel deaktiviert werden, und aktivieren Sie dann nur die Primärschlüssel wieder, damit Sie mit ihnen arbeiten können...

DECLARE @sql AS NVARCHAR(max)=''
select @sql = @sql +
    'ALTER INDEX ALL ON [' + t.[name] + '] DISABLE;'+CHAR(13)
from  
    sys.tables t
where type='u'

select @sql = @sql +
    'ALTER INDEX ' + i.[name] + ' ON [' + t.[name] + '] REBUILD;'+CHAR(13)
from  
    sys.key_constraints i
join
    sys.tables t on i.parent_object_id=t.object_id
where
    i.type='PK'

exec dbo.sp_executesql @sql;
go

[Etwas tun, wie Daten laden]

Dann aktivieren Sie die Indizes wieder und bauen sie neu auf...

DECLARE @sql AS NVARCHAR(max)=''
select @sql = @sql +
    'ALTER INDEX ALL ON [' + t.[name] + '] REBUILD;'+CHAR(13)
from  
    sys.tables t
where type='u'

exec dbo.sp_executesql @sql;
go

0voto

Abolfazl Punkte 1

Sie können CONSTRAINT ganz einfach mit ausschalten: ALTER TABLE Tabellenname NOCHECK CONSTRAINT ALL

Vergessen Sie nach Abschluss der Transaktion nicht, sie mit wieder einzuschalten: ALTER TABLE Tabellenname CHECK CONSTRAINT ALL

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X