Update: Eine MERGE-Anweisung kann eine foreign Key-Einschränkung nicht erzwingen Wenn die Anweisung aktualisiert eine Spalte von eindeutige Schlüssel, die nicht Teil einer Gruppierungsschlüssel ist und eine einzelne Zeile als Updatequelle in SQL Server 2008

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 956718 - Produkte anzeigen, auf die sich dieser Artikel bezieht
# Fehler: 50003167 (SQL-Hotfix)
Weitere Informationen die Masterliste der Builds, die nach SQL freigegeben wurde veröffentlicht wurden, finden Sie im folgenden Artikel der Microsoft Knowledge Base:
957826Wobei finden Sie weitere Informationen über SQL Server 2008 erstellt, die nach SQL Server 2008 veröffentlicht wurden und SQL Server 2005 erstellt, die nach SQL Server 2005 Service Pack 2 veröffentlicht wurden
Alles erweitern | Alles schließen

Problembeschreibung

In SQL Server 2008 möglicherweise eine foreign Key-Einschränkung nicht erzwungen werden, wenn folgenden Bedingungen erfüllt sind:
  • Eine MERGE-Anweisung wird ausgegeben.
  • Die Zielspalte des Updates über einen nicht gruppierten eindeutigen Index verfügt.
Stellen Sie sich das folgende Szenario vor. Die Anweisung aktualisiert eine eindeutige Spalte mit dem Namen Column1 einer Tabelle mit dem Namen Table1. Table1 wird durch eine Fremdschlüsseleinschränkung aus einer Tabelle verwiesen, die Table2 benannt ist.

Das Ergebnis ist, dass Zeilen in Table1 geändert werden, wenn diese nicht wurden sollten. Darüber hinaus wird Table2 Zeilen haben, Verbleibendes Verweise auf Table1.

Dieses Problem tritt für dieses Szenario, wenn folgenden Bedingungen erfüllt sind:
  • Die verwiesen wird Column1 Spalte in Table1 ist nicht Teil den Gruppierungsschlüssel Table1.
  • Die Spalte Column1 kann nur einen möglichen Wert zugewiesen werden. Beispielsweise tritt eines der folgenden Szenarios:
    • Die Seriendruck-Quelle ist eine einzelne Zeile von Daten. Beispielsweise ist die Seriendruck-Datenquelle aus einem der folgenden select-Anweisungen:
      • select <ConstantValues>
      • select <Parameters>
      Hinweis: Dieses Szenario ist das wahrscheinlichste Szenario.
    • Die Seriendruck-Quelle ist tatsächlich eine einzelne Datenzeile. Beispielsweise ist die Seriendruck-Datenquelle aus einem der folgenden select-Anweisungen:
      • select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1
        Hinweis: <TableName>. <ColumnName> ist vom Abfrageoptimierer bekannt, dass ein eindeutiger Wert sein.
      • select top 1 <ColumnName> from <TableName>
    • Die Verknüpfung zwischen der Datenquelle für Seriendruck und dem Ziel zusammenführen hat ein Prädikat, die garantiert, dass eine einzelne Zeile aktualisiert wird.
    • Die Update-Klausel legt die Column1-Spalte auf einen konstanten Wert, unabhängig von der Seriendruck-Quelle fest.
  • Die On Update Cascade -Option wird auf foreign Key-Einschränkung in Table2 nicht aktiviert.
Hinweis: Microsoft empfiehlt, diesen Hotfix zu installieren, wenn Sie die MERGE-Anweisung verwenden, um Spalten zu aktualisieren, die eindeutige nicht gruppierte Indizes verfügen, auf die durch foreign Key-Einschränkungen verwiesen wird.

Lösung

Die Fehlerbehebung für dieses Problem wurde zuerst im kumulativen Update 1 veröffentlicht. Weitere Informationen, wie Sie dieses kumulative Updatepaket für SQL Server 2008 erhalten finden Sie im folgenden Artikel der Microsoft Knowledge Base:
956717Kumulatives Updatepaket 1 für SQL Server 2008
Hinweis: Da die Builds kumulativ sind, enthält jede neue Update-Version alle Hotfixes und alle Sicherheitsupdates, die mit früheren SQL Server 2008 enthalten waren. Wir empfehlen Sie die neueste Hotfix-Version, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
956909SQL Server 2008 erstellt, die nach SQL Server 2008 veröffentlicht wurde veröffentlicht wurden

Abhilfe

Das Hotfix-Paket behebt das Problem. Gehen Sie wenn Sie die MERGE-Anweisung in diesem Szenario verwenden, die im Abschnitt "Problembeschreibung" beschrieben wird und wenn Sie den Hotfix anwenden, folgendermaßen vor um dieses Problem zu vermeiden.
  1. Ändern Sie die MERGE-Anweisung, so dass die Werte für die Datenquelle für Seriendruck in eine Tabelle, temporäre Tabelle oder Tabellenvariable statt Inlining in der Abfrage sind.
  2. Verwenden Sie das Ablaufverfolgungsflag 8790. Dieses Ablaufverfolgungsflag erzwingt der Abfrageoptimierer um eine Art von Plan zu verwenden, die einen breiten Update Plan aufgerufen wird. Ausführlichen Aktualisierungsplänen verfügen nicht über das Problem. Diese Schritt birgt Leistung Risiken für alle DML-Anweisungen. Daher sollten Sie sich mit dieser Schritt nur, wenn es unmöglich, die Anwendung zu ändern ist.
Das folgende Transact-SQL-Skript zeigt eine Möglichkeit, Ihr Skript, um dieses Problem zu beheben Sie diesen Hotfix anwenden können nicht zu ändern.

Angenommen, Sie verfügen über ein Skript, die die folgenden ähnelt:
use tempdb;

drop table sale, product;
create table product(pno int not null primary key, name char(30), pAlternateKey char(6) not null unique);
create table sale(sno int not null primary key, pAlternateKey char(6) not null references product(pAlternateKey));
insert product values(1, 'Office Chair', 'ochair');
insert sale values(1, 'ochair')

-- No violation of foreign key constraint is detected. However, one should be.
merge into product
using (select 'Office Chair2' as name, 1 as pno, 'oxx' as pAlternateKey) as src
on product.pno = src.pno
when matched then
   update set product.pAlternateKey = src.pAlternateKey, 
              product.name = src.name
when not matched then
   insert values(src.pno, src.name, src.pAlternateKey);
das Skript ändern, so dass es die folgenden Inhalts angezeigt:
insert product values(1, 'Office Chair', 'ochair');
insert sale values(1, 'ochair')
-- A foreign key constraint violation is detected, and the update fails.
declare @source table 
   (name nchar(30), pno int, pAlternateKey nchar(30));
insert into @source values('Office Chair2',1,'oxx');

merge into product
using @source as src
on product.pno = src.pno
when matched then
   update set product.pAlternateKey = src.pAlternateKey, 
              product.name = src.name
when not matched then
   insert values(src.pno, src.name, src.pAlternateKey);

Status

Microsoft hat bestätigt, dass dies ein Problem in Microsoft-Produkten handelt, die im Abschnitt "Gilt für" aufgeführt sind.

Weitere Informationen

Weitere Informationen, welche Dateien geändert werden, sowie über alle Voraussetzungen für das kumulative Updatepaket anwenden, das den Hotfix enthält, der in diesem Knowledge Base-Artikel beschrieben wird, finden Sie die folgende KB-Artikelnummer:
956717Kumulatives Updatepaket 1 für SQL Server 2008

Informationsquellen

Weitere Informationen zur Liste der Builds, die nach der Veröffentlichung von SQL Server 2008 finden Sie im folgenden Artikel der Microsoft Knowledge Base:
956909SQL Server 2008 erstellt, die nach SQL Server 2008 veröffentlicht wurde veröffentlicht wurden


Weitere Informationen zu inkrementellen Dienstmodell für SQL Server finden Sie im folgenden Artikel der Microsoft Knowledge Base:
935897Ein inkrementelles Dienstmodell steht SQL Server-Team zum Übermitteln von Hotfixes für gemeldete Probleme


Weitere Informationen zum Benennungsschema für SQL Server-Updates finden Sie im folgenden Artikel der Microsoft Knowledge Base:
822499Neues Namensschema für Microsoft SQL Server-Softwareupdate-Paketen


Weitere Informationen zur Terminologie für Softwareupdates finden Sie im folgenden Artikel der Microsoft Knowledge Base:
824684Erläuterung von Standardbegriffen bei Microsoft Softwareupdates

Informationsquellen

Weitere Informationen zu nicht gruppierten Indizes in SQL Server 2008 die folgenden Microsoft Developer Network (MSDN)-Website:
http://msdn.microsoft.com/en-us/library/ms179325(SQL.100).aspx

Eigenschaften

Artikel-ID: 956718 - Geändert am: Freitag, 19. September 2008 - Version: 4.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Standard Edition for Small Business
  • Microsoft SQL Server 2008 Web
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Express with Advanced Services
Keywords: 
kbmt kbautohotfix kbhotfixserver kbqfe kbpubtypekc kbfix KB956718 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 956718
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com