Fremdschlüssel werden nach dem Masseneinfügen nicht mehr vertrauenswürdig


10

Auf einem SQL 2014 Edition-Server (12.0.2430.0 - noch kein SP1) mit einer Datenbank im 2012-Kompatibilitätsmodus (arbeitet daran, sie auf 2014 umzustellen ...) habe ich eine Handvoll Fremdschlüsselobjekte, die konsistent als not trustedin der Datenbank markiert sind . Ich habe sie ohne NOCHECKOptionen gelöscht und neu erstellt , aber innerhalb von 5-10 Minuten werden sie wieder nicht mehr vertrauenswürdig. Wenn ich ein CREATESkript generiere, wird Folgendes ausgegeben :

ALTER TABLE [dbo].[Points]  WITH NOCHECK 
ADD  CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO

Das verwendete Erstellungsskript lautet:

ALTER TABLE [dbo].[Points]
ADD  CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO

ALTER TABLE [dbo].[Points] CHECK CONSTRAINT [FK_BadgeId]
GO

Es gibt keine Replikation, es gibt keine Tools von Drittanbietern und ich überwache alle DDL-Anweisungen in der Datenbank, damit es sich nicht um einen anderen Benutzer handelt.

Ich kann die Einschränkungen gut überprüfen ( WITH CHECK CHECKjeweils verwenden), aber sie werden kurz darauf immer noch nicht vertrauenswürdig. Nur Wartungsarbeiten, die ausgeführt werden, werden am frühen Morgen von Ola ausgeführt, und dies geschieht den ganzen Tag über.

Aktualisieren:

Nach ein paar Spuren, um die Möglichkeiten einzugrenzen, scheint es, als würde a BULK INSERTdazu führen, dass das FKnicht mehr vertrauenswürdig wird. Diese msdn-Frage besagt, dass dies eine gültige Route ist, auf der der Schlüssel nicht mehr vertrauenswürdig ist. Dies ist die erste, von der ich gehört habe.

Meine Frage ist nun, BULK INSERTob es eine alternative Strategie zur Verwendung gibt , mit der der Fremdschlüsselstatus beibehalten werden kann is_trusted. Es wird im Kontext einer Anwendung ausgeführt, die mehrmals pro Stunde ausgeführt wird. Ich könnte die Entwickler stattdessen ihre Einfügeanweisungen stapeln lassen, aber ich würde es vorziehen, kein Ultimatum für die Verwendung zu stellen, BULK INSERTwenn ich nicht muss.

Antworten:


9

A BULK INSERTaus unserer Anwendung war die Ursache für nicht vertrauenswürdige Fremdschlüssel, wie durch eine MSDN-Frage bestätigt . Ähnlich wie bei BCPjeder Ausführung BULK INSERTwird der Fremdschlüssel beim Einfügen nicht überprüft, wodurch er nicht vertrauenswürdig wird.

Wie Kin erwähnte, stehen einfache Skripte zur Verfügung, um nicht vertrauenswürdige Fremdschlüssel zu finden und zu beheben. In meinem Szenario werden die Einfügungen jedoch häufig ausgeführt, sodass es sich nicht lohnt, dieses Problem ständig zu beheben.

Und ypercube schlug vor, eine CHECK_CONSTRAINTS Option innerhalb der Bulk-Einfügungen zu verwenden, die die Einhaltung der Einschränkung erzwingen würde.

Ich habe vor, mit den Entwicklern zu besprechen, ob jede Verwendung von BULK INSERTin Bezug auf eingefügte Zeilen gerechtfertigt ist, sonst muss es etwas sein, mit dem man leben kann.


2
Ich habe SqlBulkCopymit dem gleichen Effekt verwendet, aber es gibt (zumindest jetzt) ​​eine Option zum Erstellen der Massenkopie, während die Einschränkungen weiterhin überprüft werden. Dies bedeutet, dass die Massenkopierfunktion das Einchecken im Prinzip durchführen kann. Wahrscheinlich hat bcp eine Option zum Aktivieren Das. Wer den Nichtprüfungsmodus zum Standard gemacht hat, muss ins Gesicht geschlagen werden.
John
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.