Ich muss ein Bereitstellungsskript schreiben, das funktioniert, wenn eine gespeicherte Prozedur vorhanden ist oder nicht. dh wenn es existiert, muss ich es ändern, sonst erstelle ich es.
Wie kann ich das in der SQL tun.
Ich verwende SQL Server 2005
sql
sql-server-2005
stored-procedures
GordyII
quelle
quelle
Antworten:
Wenn Sie die Prozedur fallen lassen und erstellen, verlieren Sie die Sicherheitseinstellungen. Dies kann Ihren DBA stören oder Ihre Anwendung insgesamt beschädigen.
Ich erstelle eine triviale gespeicherte Prozedur, wenn sie noch nicht existiert. Danach können Sie die gespeicherte Prozedur nach Ihren Wünschen ÄNDERN.
Auf diese Weise überleben Sicherheitseinstellungen, Kommentare und andere Meta-Details die Bereitstellung.
quelle
if object_id('YourSp') is null BEGIN ... END
, um die richtigen Berechtigungen nach dem Erstellen der gespeicherten Prozedur hinzuzufügen.Am saubersten ist es, die Existenz zu testen, sie zu löschen, falls vorhanden, und sie dann neu zu erstellen. Sie können eine "create proc" -Anweisung nicht in eine IF-Anweisung einbetten. Das sollte gut gehen:
quelle
Wenn Sie nur mit gespeicherten Prozeduren arbeiten, ist es am einfachsten, den Prozess wahrscheinlich zu löschen und dann neu zu erstellen. Sie können den gesamten Code dazu mithilfe des Assistenten zum Generieren von Skripten in SQL Server generieren.
quelle
Von können
SQL Server 2016 CTP3
Sie neue DIE- Anweisungen anstelle von großenIF
Wrappern verwendenSyntax:
Abfrage:
Mehr Infos hier
quelle
Wo
xxx
ist der Proc-Name?quelle
Zusätzlich zu dem, was bereits gesagt wurde, möchte ich auch einen anderen Ansatz hinzufügen und die Verwendung einer differenziellen Skriptbereitstellungsstrategie befürworten. Anstatt ein statusbehaftetes Skript zu erstellen, das immer den aktuellen Status überprüft und basierend auf diesem Status handelt, stellen Sie es über eine Reihe zustandsloser Skripts bereit, die von bekannten Versionen aktualisiert werden . Ich habe diese Strategie angewendet und sie zahlt sich aus, da meine Bereitstellungsskripte jetzt alle "IF" -frei sind.
quelle
Sie können eine Abfrage wie folgt schreiben:
Um die obige Syntax genauer zu beschreiben:
OBJECT_ID ist eine eindeutige ID-Nummer für ein Objekt in der Datenbank, die intern von SQL Server verwendet wird. Da wir ProcedureName gefolgt von Ihrem Objekttyp P übergeben , teilt dies dem SQL Server mit, dass Sie das Objekt ProcedureName finden sollen, das vom Typ procedure ist, dh P.
Diese Abfrage findet die Prozedur und wenn sie verfügbar ist, wird sie gelöscht und eine neue erstellt.
Ausführliche Informationen zu OBJECT_ID und Objekttypen finden Sie unter: SYS.Objects
quelle
quelle
Ich habe einen gespeicherten Prozess, mit dem der Kunde die Validierung erweitern kann. Wenn er vorhanden ist, möchte ich ihn nicht ändern. Wenn er nicht erstellt werden soll, habe ich den besten Weg gefunden:
quelle
Der folgende Code prüft, ob die gespeicherte Prozedur bereits vorhanden ist oder nicht.
Wenn es existiert, ändert es sich, wenn es nicht existiert, erstellt es eine neue gespeicherte Prozedur für Sie:
quelle
Eine bessere Option könnte darin bestehen, ein Tool wie Red-Gate SQL Compare oder SQL Examiner zu verwenden, um die Unterschiede automatisch zu vergleichen und ein Migrationsskript zu generieren.
quelle