5 Stimmen

Was sind die besten Praktiken für die Bereitstellung von SSIS-Paketen und die Verfolgung von Änderungen?

Ich habe eine ziemlich robuste Entwicklungsumgebung in Bezug auf meine SQL-Datenbank Schema und Daten (alles ist Quelle kontrolliert, Bereitstellung ist automatisiert, etc), aber wenn es um SSIS-Pakete kommt, ist der Prozess ziemlich mühsam und völlig manuell.

  • Wie kann ich den SSIS-Paket-Upgrade-Prozess automatisieren (derzeit kopiere ich meine Pakete manuell auf jeden Server und verwende dann den "SSIS Package Upgrade Wizard" von Management Studio)?

  • Wie kann ich meine Zeitpläne verteilen (im Moment mache ich das manuell)?

  • Wie kann ich meine SQL-Agent-Aufträge verteilen (im Moment mache ich das manuell)?

  • Wie kann ich meine Zeitpläne und Jobs in mein TeamSystem Repository bekommen (im Moment benutze ich keine Source-Control dafür)

  • Gibt es andere Dinge, die ich tun kann/sollte, um meine Arbeitsweise in Bezug auf SSIS-Pakete zu verbessern?

Ich verwende MS SQL Server 2008 SP1, aber ich kann mir vorstellen, dass einige Ratschläge auch für andere Versionen nützlich sein könnten.

1 Stimmen

Gibt es eine endgültige Lösung oder eine endgültige Schlussfolgerung?

3voto

Ed Harper Punkte 20677

Zu Punkt 1 (Automatisierung der Bereitstellung):

Es ist möglich, SSIS-Pakete von der Befehlszeile aus bereitzustellen, indem man dtutil.exe .

Das folgende Beispiel würde die lokale Datei bereitstellen c:\test.dtsx zum MSDB-Speicher auf server1 mit dem Namen test_package :

dtutil.exe /FILE C:\test.dtsx /dests server1 /COPY SQL;test_package

Es kann jede beliebige Kombination von Import/Export für alle verschiedenen SSIS-Speicheroptionen durchführen, wenn Sie die zu verwendende Parameterkombination herausfinden können.

Das mag für Sie nicht relevant sein, aber was dies nicht tut (was der Assistent tut), ist das Kopieren von Konfigurationsdateien; dafür benötigen Sie einen separaten Batch-Schritt.

Zu den Punkten 2 und 3 (Quellensicherung von SQL Agent):

Wie bereits erwähnt, können SQL-Agent-Aufträge und Zeitpläne als T-SQL-Skript erstellt werden (klicken Sie in Management Studio mit der rechten Maustaste auf den Auftrag und wählen Sie Script job to... ), die in der Versionskontrolle gehalten und wie jedes andere T-SQL-Skript eingesetzt werden.

Unser DB-Source-Control-Baum ist mit einem Ordner pro Produktionsserver eingerichtet, der einen Unterordner pro Benutzerdatenbank und einen zusätzlichen Unterordner namens _config die Skripte für Objekte auf Serverebene wie Anmeldungen, verknüpfte Server und SQL-Agentenaufträge enthält.

(Es ist nicht wirklich relevant für Ihre Frage, aber wir speichern SSIS-Pakete in ihrem eigenen Baum, da sie auf mehrere Server angewendet werden können)

Da wir nicht mit TFS arbeiten, kann ich nicht sagen, wie man die Skripte in TFS einpflegt.

2voto

HLGEM Punkte 91543

Nun, wir speichern alles in der Versionskontrolle. Unsere SSIS-Pakete werden als DTSX-Dateien gespeichert und in der Versionskontrolle abgelegt. Wir verwenden die Quellkontrollversionen von allem, um es an QA und Prod weiterzuleiten. Wir konfigurieren alle SSIS-Pakete mithilfe von Konfigurationstabellen in einer Datenbank, die wir zur Verwaltung von Metadaten für SSIS-Pakete eingerichtet haben. Diese bestehen in der Regel aus all unseren Verbindungszeichenfolgen sowie einigen Variablen, die wir zur Laufzeit setzen möchten. In dieser Datenbank haben wir auch unsere gesamte Protokollierung eingerichtet. Das Schöne daran ist, dass das Hochladen der geänderten Pakete viel einfacher wird, da die Konfigurationstabellen in der Regel nicht geändert werden müssen und die überarbeitete dtsx-Datei nur an den Ort geladen werden muss, von dem aus sie ausgeführt werden soll. Und selbst wenn wir der Konfigurationstabelle eine neue Referenz hinzufügen müssen, ist dies eine Einfügung in eine Tabelle und für den Aktualisierungsprozess leicht zu skripten.

Sie können auch xml-Konfigurationsdateien verwenden, um Ihre Konfigurationen einfach zu ändern (diese können auch in der Versionskontrolle gespeichert werden), aber wir ziehen es vor, alles in der ETL-Datenbank zu haben, wo wir die Metadaten speichern.

1voto

ajdams Punkte 2240

Zu Punkt 1 siehe diese Website http://jessicammoss.blogspot.com/2008/05/ssis-configuration-to-configuration-to.html

Ich hatte vor einiger Zeit die gleiche Frage, und diese Website hat mir sehr geholfen. Ich bin auch neugierig auf die anderen Punkte, da mein Team sie wie Sie manuell einsetzt, aber ich dachte, ich würde mein Wissen mit Ihnen teilen.

1voto

Faiz Punkte 5161
  1. Ich weiß nicht, ob die Aktualisierung des Pakets überhaupt automatisiert werden kann.
  2. So stellen Sie SSIS-Pakete bereit eine Manifest-Datei erstellen
  3. Sie können SQL-Skripte schreiben, um SQL-Zeitpläne und -Aufträge zu erstellen und rufen Sie dann dieses Skript mit einigen vb.net-Skript oder etwas.
  4. Um SQL-Skripts zu TFS hinzuzufügen, öffnen Sie SQL Server Management Studio > Datei > Neu > Projekt > SQL Server-Skripts. Fügen Sie Scripts zum Ordner Queries hinzu und fügen Sie dann später diese Lösung zum TFS hinzu. Ich habe dies nie versucht. Stattdessen kopiere ich die Skriptdateien manuell in TFS.

Meiner Meinung nach macht es keinen Sinn, ein vollwertiges Bereitstellungsprogramm für die Bereitstellung von SSIS-Paketen zu erstellen, da dies eine sehr seltene Tätigkeit ist. Die Bereitstellung/Installation sollte einfach sein, wenn wir ein Softwareprodukt an nichttechnische Benutzer verteilen, damit es benutzerfreundlich ist. Aber ein SSIS-Paket wird immer von einem DBA oder einer anderen Person gehandhabt, die bereits weiß, wie man es benutzt...

0voto

Registered User Punkte 8214

Was das Skripting von Objekten betrifft, so können Sie dies über DMO, SMO, PowerShell, VBScript und eine beliebige Anzahl anderer Methoden tun. Ich verwende immer noch mein altes VB DMO-Skript, das ich auf der Grundlage von Code aus verschiedenen Websites geschrieben habe, und führe den Code über eine SSIS-Skriptaufgabe aus. Richten Sie einen SQL Server-Agentenauftrag ein, der das Paket ausführt, und fügen Sie einen Schritt zum Einchecken des Codes hinzu. Ich kenne mich mit TFS nicht aus, aber ich habe dies sowohl mit Visual SourceSafe als auch mit Perforce ohne Probleme getan. Der Trick besteht darin, dass man einfach lernen muss, wie man einen unbeaufsichtigten Befehlszeilen-Check-in durchführt, der Änderungen zusammenführt (Aktualisierungen, Löschungen, Erstellungen). Nachfolgend sehen Sie meine alte VB.NET-Skriptaufgabe. Denken Sie daran, dass Sie Teile davon durch Variablen ersetzen können, um die Aufgabe dynamischer zu gestalten.

' Microsoft SQL Server Integration Services Script Task
' Write scripts using Microsoft Visual Basic 2008.
' The ScriptMain is the entry point class of the script.

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.IO
Imports System.Text.RegularExpressions

<System.AddIn.AddIn("ScriptMain", Version:="1.0", Publisher:="", Description:="")> _
Partial Class ScriptMain

Private Sub ScriptMain_Startup(ByVal sender As Object, ByVal e As System.EventArgs)

End Sub

Private Sub ScriptMain_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs)
    Try
        ' Unlock variables from the read-only and read-write variable collection properties
        If (Dts.Variables.Count <> 0) Then
            Dts.Variables.Unlock()
        End If
    Catch ex As Exception
    End Try
End Sub

Enum ScriptResults
    Success = DTSExecResult.Success
    Failure = DTSExecResult.Failure
End Enum
Private Function CleanFileName(ByVal FileName As String) As String

    FileName = Regex.Replace(FileName, "[/\\:?=*<>]", "-")
    Return FileName

End Function

Public Sub Main()

    ''THESE MUST BE SET AND THE AGENT ACCOUNT MUST HAVE WRITE ACCESS TO THE DRIVE SELECTED
    Dim FolderName = "\\Your\Folder\Hierarchy\"
    Dim ServerName = "your-server-name"

    Dim ScriptOptions As Integer
    ScriptOptions = 1 ' Generate Drop
    ScriptOptions = ScriptOptions Or 4 ' Generate Default (Create)
    ScriptOptions = ScriptOptions Or 34 ' Generate Permissions (Database & Object)

    Dim ScriptOptions_Jobs As Integer
    ScriptOptions_Jobs = 1 ' Generate Drop
    ScriptOptions_Jobs = ScriptOptions_Jobs Or 1203765415 ' Other stuff

    Dim ScriptOptions_Tables As Integer
    ScriptOptions_Tables = 1 ' Generate Drop
    ScriptOptions_Tables = ScriptOptions_Tables Or 4 ' Generate Default (Create)
    ScriptOptions_Tables = ScriptOptions_Tables Or 34 ' Generate Permissions (Database & Object)
    ScriptOptions_Tables = ScriptOptions_Tables Or 73736 ' Generate Indexes

    Dim EXCLUDE_LIST = "master/tempdb/model/msdb"

    ''Standardize the end of the folder name to include \.
    If Right(FolderName, 1) <> "\" Then
        FolderName = FolderName & "\"
    End If

    ''Declare a folder that can be deleted.  Delete doesn't like ending with \.
    Dim FolderNameDelete = FolderName
    If Right(FolderNameDelete, 1) = "\" Then FolderNameDelete = _
        Left(FolderNameDelete, Len(FolderNameDelete) - 1)

    'Used for file system tasks.
    Dim oFSO = CreateObject("Scripting.FileSystemObject")

    'Delete if the folder exists.  If you don't delete the folder and populate the scripts,
    'then objects that were deleted from the database won't disappear and the Perforce diff
    'won't recognize that the objects need to be deleted in Perforce.
    If oFSO.FolderExists(FolderName) = True Then
        oFSO.DeleteFolder(FolderNameDelete, True)
    End If

    'Create the folder now so that we have a clean script destination.
    oFSO.CreateFolder(FolderName)
    oFSO.CreateFolder(FolderName & "Databases")
    oFSO.CreateFolder(FolderName & "Jobs")

    'connect to the server instance using trusted credentials so we dont have password stored in a file and we dont have
    'to worry about password changes breaking anything
    Dim oServer = CreateObject("SQLDMO.SQLServer")
    With oServer
        .LoginSecure = True
        .Connect(ServerName)
    End With

    'Script out SQL Server Agent Jobs.
    For Each oJob In oServer.JobServer.Jobs
        oJob.Script(ScriptOptions_Jobs, FolderName & "Jobs\" & CleanFileName(oJob.Name) & ".sql")
    Next

    'loop through all databases and excluding those in the EXCLUDE_LIST above, script out all the stored procedures.
    'You could easily change this to read from a table or to let you pass in a different list.
    For Each oDB In oServer.Databases

        If InStr(1, EXCLUDE_LIST, oDB.Name) = 0 Then

            'each db will get a folder in the main folder (FolderName) that will act as a container for the backup
            'folders we'll create each time we run this
            Dim dbFolder = FolderName & "Databases\" & oDB.Name & "\"

            oFSO.CreateFolder(dbFolder)
            oFSO.CreateFolder(dbFolder & "Stored Procedures")
            oFSO.CreateFolder(dbFolder & "Tables")
            oFSO.CreateFolder(dbFolder & "User-Defined Functions")
            oFSO.CreateFolder(dbFolder & "Views")

            'script out all the non-system procs
            For Each oProc In oDB.StoredProcedures
                If oProc.SystemObject = False Then
                    ''262150= SQLDMOScript_ObjectPermissions + SQLDMOScript_PrimaryObject + SQLDMOScript_OwnerQualify
                    oProc.Script(ScriptOptions, dbFolder & "\Stored Procedures\" & CleanFileName(oProc.Owner) & "_" & CleanFileName(oProc.Name) & ".sql")
                End If
            Next

            'script out all the non-system views
            For Each oView In oDB.Views
                If oView.SystemObject = False Then
                    ''262150= SQLDMOScript_ObjectPermissions + SQLDMOScript_PrimaryObject + SQLDMOScript_OwnerQualify
                    oView.Script(ScriptOptions, dbFolder & "\Views\" & CleanFileName(oView.Owner) & "_" & CleanFileName(oView.Name) & ".sql")
                End If
            Next

            'script out all the non-system user-defined functions
            For Each oUDF In oDB.UserDefinedFunctions
                If oUDF.SystemObject = False Then
                    ''262150= SQLDMOScript_ObjectPermissions + SQLDMOScript_PrimaryObject + SQLDMOScript_OwnerQualify
                    oUDF.Script(ScriptOptions, dbFolder & "\User-Defined Functions\" & CleanFileName(oUDF.Owner) & "." & CleanFileName(oUDF.Name) & ".sql")
                End If
            Next

            'script out all the non-system tables
            For Each oTable In oDB.Tables
                If oTable.SystemObject = False Then
                    ''262150= SQLDMOScript_ObjectPermissions + SQLDMOScript_PrimaryObject + SQLDMOScript_OwnerQualify
                    oTable.Script(ScriptOptions_Tables, dbFolder & "\Tables\" & CleanFileName(oTable.Owner) & "_" & CleanFileName(oTable.Name) & ".sql")
                End If
            Next

        End If
    Next

    'close it all out
    oServer.DisConnect()
    oServer = Nothing
    oFSO = Nothing

    Dts.TaskResult = ScriptResults.Success
End Sub

Klasse beenden

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