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?
Antworten
Zu viele Anzeigen?
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
Abolfazl
Punkte
1
- See previous answers
- Weitere Antworten anzeigen
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 .
8 Stimmen
Es scheint seltsam, dass jemand diese Frage in einem Produktion Umwelt. Ein sehr häufiger Anwendungsfall sind Massenbeilagen. Wenn Sie eine selbstreferenzielle Tabelle haben, ist es manchmal extrem schwierig, eine Masseneinfügung so zu sortieren, dass die übergeordnete Zeile immer vor der untergeordneten Zeile eingefügt wird, also deaktivieren Sie die Einschränkung, fügen die Masseneinfügung ein und aktivieren die Einschränkung.
0 Stimmen
Außerdem haben Sie möglicherweise ein absichtlich denormalisiertes Schema mit redundanten Spalten an einigen Stellen (sei es aus Leistungs- oder anderen Gründen). Diese können dann mit FKs verknüpft werden, so dass sich aufgrund der Redundanz keine Fehler einschleichen können. Um jedoch einen dieser redundant gespeicherten Werte zu aktualisieren (was hoffentlich selten vorkommt), müssen Sie die FKs vorübergehend deaktivieren.