2016-04-13 3 views
5

Wenn eine gespeicherte Prozedur erstellt wird, die in eine einfache Verknüpfungstabelle eingefügt wird, sollte sie prüfen, ob die FK vorhanden sind und einen Fehler fehlerfrei zurückgeben oder SQL einfach eine Ausnahme auslösen lassen?Empfohlene Vorgehensweise für gespeicherte Prozeduren? Sollten sie vor dem Einfügen prüfen, ob Fremdschlüssel vorhanden sind?

  • Was ist die beste Vorgehensweise?
  • Was ist am effizientesten?

Nur falls jemand meine Frage nicht versteht:

  • Table A
  • Table B
  • Table AB

Sollte ich:

IF EXISTS(SELECT 1 FROM A WHERE Id = @A) AND EXISTS(SELECT 1 FROM B WHERE Id = @B) 
BEGIN 
     INSERT AB (AId,BId) VALUES (@A, @B) 
END 
ELSE 
    --handle gracefully, return error code or something 

oder

INSERT AB (AId,BId) VALUES (@A, @B) 

und lassen Sie SQL

eine Ausnahme werfen

Dank

+0

Wenn Sie sich Sorgen um die Leistung machen und eine Vielzahl von Fremdschlüsselverletzungen erwarten, sehen Sie sich die [Auswirkung der verschiedenen Fehlerbehandlungstechniken] an (http://sqlperformance.com/2012/08/t-sql-abfragen)/Fehlerbehandlung) und messen Sie die Auswirkungen auf Ihre Datenbank und Hardware. –

Antwort

2

Wenn die Tabellen unter Ihrer Kontrolle sind, gibt es keinen Grund, eine zusätzliche Prüfung durchzuführen. Gehen Sie einfach davon aus, dass sie korrekt eingerichtet sind und SQL einen Fehler behandeln lässt. Ständig zu überprüfen, dass Sie tatsächlich getan haben, was Sie vorhatten, ist eine zu defensive Programmierung, die Ihrem Code unnötige Komplexität hinzufügt.

Zum Beispiel, würden Sie nicht Code wie folgt schreiben:

i = 1; 

if (i != 1) 
{ 
    print "Error: i is not 1!"; 
} 

Und Ich sehe diese Situation ähnlich.

Wenn die Tabellen nicht unter Ihrer Kontrolle sind, kann es sinnvoll sein, den Fehler ordnungsgemäß zu behandeln. Wenn diese Prozedur z. B. für einen beliebigen Satz von Tabellen ausgeführt werden kann, die vom Benutzer erstellt wurden, oder wenn sie an externe Benutzer verteilt werden, die die Tabellen in ihrer eigenen Datenbank einrichten müssen, möchten Sie möglicherweise einen benutzerdefinierten Fehler hinzufügen Handhabung. Der Zweck wäre, dem Benutzer eine klarere Beschreibung dessen zu geben, was falsch gelaufen ist.

0

Normalerweise werde ich Fk überprüfen. Wenn der Fk nicht existiert, dann werfe einen Fehler freundlich, und die Einfügeanweisung wird nicht ausgeführt, die Datenbank wird die Tabelle auch nicht sperren.

+0

Dies sollte ein Kommentar sein. Keine Antwort –

2

Als Grundkonzept ist die Validierung von Werten vor einem potenziell fehlererhöhenden Code eine gute Sache. In diesem Fall könnte es jedoch (zumindest theoretisch) eine Änderung in der Tabelle a oder in der Tabelle b zwischen den exist-Prüfungen und der insert-Anweisung geben, die den fk-Verletzungsfehler auslösen würden.

BEGIN TRY 
    INSERT AB (AId,BId) VALUES (@A, @B) 
    SELECT NULL As ErrorMessage 
END TRY 
BEGIN CATCH 
    SELECT ERROR_MESSAGE() AS ErrorMessage 
END CATCH 

Die ERROR_MESSAGE() Funktion gibt den Fehler, der im try-Block rasied wurde:

Ich würde so etwas tun.

Dann im Ausführungscode können Sie einfach überprüfen, ob die zurückgegebene Fehlermeldung null ist.Wenn dies der Fall ist, wissen Sie, dass die Einfügung erfolgreich war. Wenn nicht, können Sie mit dieser Ausnahme umgehen, wie immer Sie es für richtig halten.

+0

Overkill, es sei denn, Sie haben einen Grund zu glauben, dass jemand anders die Tabellen ändert, während der Code ausgeführt wird. –

+0

Sie müssen den Fehler sowieso behandeln, warum nicht auf dem SQL-Server? Es ist nicht mehr ein Overkill verglichen mit dem Fehler im Client-Code zu behandeln. –

+0

Unabhängig davon, was Sie tun, muss der Client-Code den generischen Fall eines SQL-Fehlers behandeln, der beim Aufruf der Prozedur ausgelöst wird. Wenn Sie also diesen Fehler behandeln, wird Ihrem Code tatsächlich etwas hinzugefügt - und Sie müssen diesen Fehler auf der Clientseite zusätzlich hinzufügen, damit er einen Unterschied macht. Wenn Sie nicht wirklich denken, dass die Tabellen falsch eingerichtet sind (z. B. liegen sie außerhalb Ihrer Kontrolle), ist diese Art der Fehlerbehandlung meiner Meinung nach zu defensiv. –

Verwandte Themen