8 Stimmen

Versionsänderungen für Stored Procedures

Ich habe eine Anwendung, die sich sehr stark auf gespeicherte Prozeduren (SQL 2005/2008) stützt. Wir führen gerade ein kleines Update durch, bei dem 25-35 dieser gespeicherten Prozeduren geändert werden sollen. Die Anwendung ist so konzipiert, dass beide Versionen der gespeicherten Prozeduren verfügbar sein müssen.

Dies ist die Hauptversion 4 der Anwendung, und normalerweise konnten wir die Datenstruktur mit jeder neuen Version vollständig ändern. In diesem Fall können wir das jedoch nicht tun.

Hier sind meine 2 Optionen, die ich mir ausgedacht habe

  1. Erstellen Sie von jeder gespeicherten Prozedur eine "2"-Version. Wenn ich eine Prozedur namens getUser habe, erstelle ich eine getUser2. Der Nachteil dabei ist, dass die Anzahl der gespeicherten Prozeduren mit jeder Versionsänderung exponentiell ansteigt

  2. Fügen Sie einen @version-Parameter zu jeder gespeicherten Prozedur hinzu, der standardmäßig v1 lautet. Dies würde die Anzahl der gespeicherten Prozeduren verringern, aber jede gespeicherte Prozedur aufblähen

Hat jemand eine Meinung dazu? Irgendwelche anderen cleveren Ideen?

Cody

5voto

Spencer Ruport Punkte 34547

Ich würde diese Gelegenheit nutzen, um von gespeicherten Prozeduren auf ein ORM oder einen anderen Ansatz umzusteigen. Beide von Ihnen vorgeschlagenen Lösungen würden eine Art von Codeänderung erfordern, um zu entscheiden, welche gespeicherte Prozedur zu verwenden ist. Stattdessen würde ich es entscheiden lassen, ob die gespeicherten Prozeduren oder das ORM verwendet werden sollen. Ich würde auch Pläne für die Abschaffung der meisten Stored Procedures machen.

Ich habe in meiner Laufbahn schon viel schlechten Code und verkorkste Systeme gesehen, aber nichts lässt meine Hoffnungen, dass ein Projekt noch zu retten ist, so schnell schwinden wie der Anblick von GetItemFromLots_2_Temp_2 in der Liste der gespeicherten Verfahren. Mehrere Methoden sind viel hübscher und einfacher zu pflegen als mehrere gespeicherte Prozeduren.

(Für andere, die gespeicherte Verfahren lieben. Ich sage nicht, dass sie schlecht sind. Ich bin mir sicher, dass es clevere Ansätze gibt, diese Art von Dingen mit gespeicherten Prozeduren zu handhaben, aber wenn ein solcher Ansatz verwendet würde, wäre diese Frage nicht gestellt worden).

2voto

Charles Bretana Punkte 137391

Ändern Sie die vorhandenen gespeicherten Prozeduren so, dass die neue Logik nur dann ausgeführt wird, wenn die Prozedur unter den Umständen aufgerufen wird, unter denen die neue Logik ausgeführt werden soll... Wenn die neue Prozedur eine etwas andere Schnittstelle hätte (eine Reihe von sProc-Parametern), dann könnten Sie diese optional machen und das Vorhandensein oder Fehlen der Parameter als Schalter verwenden, um zu steuern, welches Code-Stück innerhalb der Prozedur ausgeführt wird...

Wenn die alte Logik nicht mehr benötigt wird, können Sie sie einfach aus den sProcs entfernen

1voto

Robert Greiner Punkte 28052

Ich würde nicht zwei verschiedene Dateien erstellen, das ist sicher.

Vielleicht sollten Sie in Ihrer Versionsverwaltung einen Zweig mit all Ihren Versionen anlegen und dann einen neuen Zweig mit Ihrer nächsten Version, dann können Sie beide Zweige als separate Ordner in Ihr System einbinden und Ihre Geschäftslogik auf den richtigen Ort verweisen lassen.

Diese Lösung mag etwas schlampig sein, aber ich denke, sie ist das kleinere Übel.

Unabhängig davon ist die Versionierung Ihres gespeicherten Prozedurcodes meiner Meinung nach ein absolutes Muss.

1voto

thomas Punkte 2519

Ich würde die zweite Option vorschlagen, die Sie angegeben haben. Verwenden Sie einen Versionsparameter. So machen es Webdienste, damit sie nicht den Code von Anwendungen zerstören, die vor langer Zeit mit der Verwendung der API begonnen haben, aber die API wird irgendwann aktualisiert.

Ich wette, es gibt eine Logik, die zwischen den beiden Versionen gleich ist und die man in die Unterseite des Proc oder so abstrahieren könnte. Oder erstellen Sie möglicherweise Funktionen für gemeinsame Elemente und rufen Sie diese Funktionen innerhalb Ihrer großen IF/SWTICH-Blöcke.

0voto

Shiraz Bhaiji Punkte 62129

Ich würde mich aus den folgenden beiden Gründen für die Option mit zwei Dateien entscheiden:

  • Die Signatur, d.h. die Anzahl der Parameter, kann sich zwischen den Versionen ändern
  • Jede gespeicherte Prozedur wäre einfacher, so dass die Gefahr von Fehlern durch den gesamten bedingten Code geringer wäre.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X