2010-03-03 9 views
18

Unser Team hat zum ersten Mal das Problem erlebt, keine Versionskontrolle für unsere Datenbank zu haben. Wie können Stored Procedures mindestens zur Versionskontrolle hinzugefügt werden? Das aktuelle System, das wir entwickeln, basiert hauptsächlich auf SPs.Wie Stored Procedures zur Versionssteuerung hinzugefügt werden

+3

Ähnliche Beiträge: http://stackoverflow.com/questions/146543/what-is-the-best-way-to-version-control-my-sql-server-stored-procedures –

Antwort

19

Hintergrund: Ich entwickle ein System mit fast 2000 gespeicherten Prozeduren.

Das kritische Ding, das ich gefunden habe, ist, die Datenbank als eine Anwendung zu behandeln. Sie würden niemals eine EXE mit einem Hexeditor direkt öffnen und bearbeiten. Das Gleiche mit einer Datenbank; Nur weil Sie die gespeicherten Prozeduren aus der Datenbank bearbeiten können, heißt das nicht, dass Sie es sollten.

Behandeln Sie die Kopie der gespeicherten Prozedur in der Quellcodeverwaltung als die aktuelle Version. Es ist dein Quellcode. Checken Sie es aus, bearbeiten Sie es, testen Sie es, installieren Sie es und checken Sie es ein. Wenn Sie das nächste Mal ändern müssen, gehen Sie genauso vor. So wie eine Anwendung einen Build- und Deploy-Prozess erfordert, sollten auch die gespeicherten Prozeduren funktionieren.

Der folgende Code ist eine gut gespeicherte Prozedurvorlage für diesen Prozess. Es behandelt beide Fälle eines Updates (ALTER) oder einer neuen Installation (CREATE).

IF EXISTS(SELECT name 
      FROM sysobjects 
      WHERE name = 'MyProc' AND type = 'P' AND uid = '1') 
    DROP PROCEDURE dbo.MyProc 
GO 

CREATE PROCEDURE dbo.MyProc 
AS 

GO 

jedoch folgendes Beispiel ist besser in Situationen, in denen Sie den Zugriff auf die gespeicherten Prozeduren steuern. Die DROP - CREATE Methode verliert GRANT Information.

Darüber hinaus kann das Erstellen eines Prozesses zum vollständigen Erstellen der Datenbank aus der Quellcodeverwaltung dazu beitragen, die Dinge kontrolliert zu halten.

Erstellen Sie eine neue Datenbank aus der Quellcodeverwaltung. Verwenden Sie ein Tool wie Red Gate SQL Compare, um die beiden Datenbanken zu vergleichen und Unterschiede zu identifizieren. Vereinbaren Sie die Unterschiede.

Eine billigere Lösung besteht darin, einfach die Funktion "Skript als" von SQL Management Studio zu verwenden und einen Textvergleich durchzuführen. Diese Methode ist jedoch sehr empfindlich auf die genaue Methode, die SSMS verwendet, um das extrahierte SQL zu formatieren.

+0

Interessant, ich habe Red Gate noch nicht gesehen. Ich werde es sehen sehen. Es ist schwierig, alle in Schach zu halten, obwohl – Jonn

+1

@Darryl - SQL Server das zweite Beispiel nicht mögen wird, weil "CREATE PROCEDURE" die erste Anweisung im Stapel sein muss. –

+0

Eine weitere günstigere Option ist JetBrains 'PhpStorm (und möglicherweise auch andere aus der * Storm-Reihe), die ein überraschend gutes Datenbankvergleichstool enthält. Es ist auch ein anständiger Editor mit Autocomplete für verschiedene SQL-Varianten. – Aron

1

Wir fügen Sie einfach die CREATE Anweisung Steuerung in einer SQL-Datei zu beziehen, zB:

-- p_my_sp.sql 
CREATE PROCEDURE p_my_sp 
AS 
    -- Procedure 

Vergewissern Sie sich, dass Sie ein SP nur pro Datei setzen, und dass der Dateiname entspricht genau den Namen Verfahren (es macht es so viel einfacher, die Prozedur in der Quellcodeverwaltung zu finden)

Sie müssen dann nur diszipliniert werden, wenn Sie keine gespeicherte Prozedur auf Ihre Datenbank anwenden, die nicht aus der Quellcodeverwaltung stammt. Eine Alternative wäre, den SP als eine ALTER-Anweisung zu speichern - dies hat den Vorteil, dass es das Aktualisieren einer vorhandenen Datenbank erleichtert, aber bedeutet, dass Sie einige Optimierungen vornehmen müssen, um eine neue leere Datenbank zu erstellen.

3

Ich denke, es ist gut, jede gespeicherte Prozedur in eine separate .sql-Datei zu scripten und diese Dateien dann nur in die Quellcodeverwaltung zu übertragen. Jedes Mal, wenn ein Sproc geändert wird, aktualisieren Sie das Erstellungsskript - dies gibt Ihnen den vollen Versionsverlauf auf einer Sproc-Basis.

Es gibt SQL Server-Tools zur Quellcodeverwaltung, die sich in SSMS einklinken, aber ich denke, dass sie nur die db-Objekte scripten und diese Skripte festschreiben. Red Gate scheint in diesem Jahr zum Beispiel auf releasing such a tool zurückzuführen zu sein.

+2

Sie sind zu Zeiten gespeichert, Aber es gab Situationen, die darauf hindeuten, dass nicht alle Programmierer sich ständig daran erinnern. – Jonn

1

Ich habe an diesem Werkzeug für genau diesen Zweck gearbeitet.

Der Weg, sicherzustellen, dass niemand ihre aktualisierten .sql-Dateien eincheckt, besteht darin, dass Ihr Build-Server die Staging- und Live-Umgebungen dazu zwingt, die Quellcodeverwaltung anzupassen (was Ihnen dieses Tool behilflich ist).

5

Ich würde definitiv ein Drittanbieter-Tool empfehlen, das in SSMS integriert ist. Abgesehen von der oben erwähnten SQL-Quellcodeverwaltung können Sie auch SQL Version von Apex ausprobieren.

Wichtig ist, dies für Entwickler wirklich einfach zu machen, wenn Sie möchten, dass sie es verwenden, und der beste Weg ist, ein Werkzeug zu verwenden, das in SSMS integriert ist.

1

Die zweite Lösung von @Darryl funktionierte nicht wie von @Moe vorgeschlagen. Ich änderte @ Darryls Vorlage und ich habe es funktioniert, und dachte, es wäre schön, es mit allen zu teilen.

IF NOT EXISTS(SELECT name FROM sysobjects 
       WHERE name = '<Stored Proc Name>' AND type = 'P' AND uid = '1') 
    EXEC sp_executesql N'CREATE PROCEDURE dbo.<Stored Proc Name> 
    AS 
    BEGIN 
     select ''Not Implemented'' 
    END 
    ' 
GO 

ALTER PROCEDURE dbo.<Stored Proc Name> 
AS 
BEGIN 
    --Stored Procedure Code 
End 

Das ist wirklich nett, weil ich meine gespeicherten Prozedurberechtigungen nicht verliere.

Verwandte Themen