Ich schaue mir die AdventureWorks-Beispieldatenbank für SQL Server 2008 an und sehe in ihren Erstellungsskripten, dass sie normalerweise Folgendes verwenden:
ALTER TABLE [Production].[ProductCostHistory] WITH CHECK ADD
CONSTRAINT [FK_ProductCostHistory_Product_ProductID] FOREIGN KEY([ProductID])
REFERENCES [Production].[Product] ([ProductID])
GO
gefolgt von:
ALTER TABLE [Production].[ProductCostHistory] CHECK CONSTRAINT
[FK_ProductCostHistory_Product_ProductID]
GO
Ich sehe dies für Fremdschlüssel (wie hier), eindeutige Einschränkungen und reguläre CHECK
Einschränkungen. DEFAULT
Einschränkungen verwenden das reguläre Format, mit dem ich besser vertraut bin, wie z.
ALTER TABLE [Production].[ProductCostHistory] ADD CONSTRAINT
[DF_ProductCostHistory_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]
GO
Was ist der Unterschied zwischen dem ersten und dem zweiten Weg?
quelle
ALTER TABLE foo NOCHECK CONSTRAINT fk_b
und dann wieder aktivierenALTER TABLE foo CHECK CONSTRAINT fk_b
, wird die Einschränkung nicht überprüft.ALTER TABLE foo WITH CHECK CHECK CONSTRAINT fk_b
ist notwendig, um die Daten überprüfen zu lassen.Um zu demonstrieren, wie das funktioniert--
quelle
DROP TABLE T2; DROP TABLE T1;
Weiter zu den oben genannten ausgezeichneten Kommentaren zu vertrauenswürdigen Einschränkungen:
Einer nicht vertrauenswürdigen Einschränkung kann, wie der Name schon sagt, nicht vertraut werden, um den aktuellen Status der Daten in der Tabelle genau darzustellen. Es kann jedoch vertrauenswürdig sein, Daten zu überprüfen, die in Zukunft hinzugefügt und geändert werden.
Darüber hinaus werden nicht vertrauenswürdige Einschränkungen vom Abfrageoptimierer ignoriert.
Der Code zum Aktivieren von Prüf- und Fremdschlüsseleinschränkungen ist ziemlich schlecht, mit drei Bedeutungen des Wortes "Prüfung".
quelle
WITH NOCHECK
wird auch verwendet, wenn in einer Tabelle vorhandene Daten vorhanden sind, die nicht der definierten Einschränkung entsprechen, und Sie nicht möchten, dass sie der neuen Einschränkung, die Sie implementieren, zuwiderlaufen ...quelle
WITH CHECK
ist in der Tat das Standardverhalten, es wird jedoch empfohlen, es in Ihre Codierung aufzunehmen.Das alternative Verhalten ist natürlich zu verwenden
WITH NOCHECK
, daher ist es gut, Ihre Absichten explizit zu definieren. Dies wird häufig verwendet, wenn Sie mit Inline-Partitionen spielen / diese ändern / wechseln.quelle
Fremdschlüssel- und Prüfbeschränkungen haben das Konzept, vertrauenswürdig oder nicht vertrauenswürdig zu sein sowie aktiviert und deaktiviert zu werden.
ALTER TABLE
Ausführliche Informationen finden Sie auf der MSDN-Seite .WITH CHECK
ist die Standardeinstellung zum Hinzufügen neuer Fremdschlüssel- und Überprüfungsbeschränkungen,WITH NOCHECK
die Standardeinstellung zum erneuten Aktivieren deaktivierter Fremdschlüssel- und Überprüfungsbeschränkungen. Es ist wichtig, sich des Unterschieds bewusst zu sein.Allerdings dienen scheinbar redundante Anweisungen, die von Versorgungsunternehmen generiert werden, lediglich der Sicherheit und / oder der einfachen Codierung. Mach dir keine Sorgen um sie.
quelle
WITH CHECK CHECK CONSTRAINT
, dass Sie ihnen vertrauen können.select * from sys.objects where [type] in ('C', 'F') and (objectproperty([object_id], 'CnstIsDisabled') = 1 or objectproperty([object_id], 'CnstIsNotTrusted') = 1)
, um deaktivierte und nicht vertrauenswürdige Einschränkungen zu finden. Nach dem Ausgeben der entsprechenden alter table-Anweisungen wie oben verschwinden diese Einschränkungen aus der Abfrage, sodass ich sehen kann, dass sie funktioniert.Hier ist ein Code, den ich geschrieben habe, um nicht vertrauenswürdige Einschränkungen in einer Datenbank zu identifizieren und zu korrigieren. Es generiert den Code zur Behebung jedes Problems.
quelle