Мой любимый способ заняться этим с эти configSource
атрибут. По общему признанию я только использую это на одном элементе (<connectionStrings>
), но он действительно обеспечивает простой способ загрузить и различные сегменты web.config (который я делаю в течение времени установки с помощью проекта WebSetup).
Что ж, мы сохраняем все в управления источником. Наши пакеты SSIS сохраняются как файлы DTSX и помещаются в систему управления версиями. Мы используем версии из системы контроля версий всего для продвижения в QA и Prod. Мы выполняем всю нашу настройку для пакетов SSIS, используя таблицы конфигурации в базе данных, которую мы настроили для управления метаданными для пакетов SSIS. Обычно он состоит из всех наших строк подключения, а также некоторых переменных, которые мы могли бы установить во время выполнения. У нас также есть все наши журналы, настроенные в этой базе данных. Одним из достоинств этого является то, что становится намного проще загружать изменяемые пакеты, потому что таблицы конфигурации обычно не нужно изменять, и все, что нужно, - это загрузить измененный файл dtsx в то место, откуда он будет запускаться. И даже если нам нужно добавить новую ссылку в таблицу конфигурации, это будет вставка в таблицу, и ее легко запрограммировать для процесса обновления.
Вы также можете использовать файлы конфигурации xml, чтобы легко изменить свои конфигурации (они также могут быть хранится в системе управления версиями), но мы предпочитаем иметь все в базе данных ETL, где мы храним метаданные.
На мой взгляд, нет смысла создавать полноценную утилиту развертывания для развертывания пакетов SSIS, поскольку это очень редкое действие. Развертывание / установка должны быть простыми, когда мы распространяем программный продукт среди нетехнических пользователей, чтобы он был удобен для пользователя.
В точке 1 (автоматизация развертывания):
Пакеты SSIS можно развертывать из командной строки с помощью dtutil.exe
.
В следующем примере выполняется развертывание локальный файл c: \ test.dtsx
в хранилище MSDB на server1
с именем test_package
:
dtutil.exe /FILE C:\test.dtsx /dests server1 /COPY SQL;test_package
Он будет выполнять любую комбинацию импорта / экспорта для все различные варианты хранилища SSIS, если вы можете выработать комбинацию используемых параметров.
Возможно, это не имеет отношения к вам, но это не будет делать (что будет делать мастер), так это скопировать файлы конфигурации; для этого потребуется отдельный пакетный шаг.
В пунктах 2 и 3 (управление исходным кодом агента SQL):
Как уже говорили другие, задания и расписания агента SQL могут быть написаны как сценарий T-SQL (в разделе «Управление» Студия, щелкните правой кнопкой мыши задание и выберите Задание сценария для ...
), которое хранится в системе управления версиями и развертывается, как любой другой сценарий T-SQL.
Наше дерево управления версиями БД настроено с одной папкой на производственный сервер, содержащий одну подпапку для каждой пользовательской базы данных плюс дополнительную подпапку с именем _config
, которая содержит сценарии для объектов уровня сервера, таких как имена входа, связанные серверы и задания агента SQL.
(На самом деле это не имеет отношения к вашему вопросу, но мы храним пакеты SSIS в их собственном дереве, так как они могут применяться к нескольким серверам)
Мы не используем TFS, поэтому я не могу комментировать особенности вставляя в него скрипты.
Наше дерево управления версиями БД настроено с одной папкой на рабочий сервер, содержащей одну подпапку для каждой пользовательской базы данных, плюс дополнительную подпапку с именем _config
, которая содержит сценарии для объектов уровня сервера, таких как логины, связанные серверы и Задания агента SQL.
(На самом деле это не имеет отношения к вашему вопросу, но мы храним пакеты SSIS в их собственном дереве, так как они могут применяться к нескольким серверам)
Мы не используем TFS, поэтому я не могу комментировать особенности вставляя в него скрипты.
Наше дерево управления версиями БД настроено с одной папкой на производственный сервер, содержащей одну подпапку для каждой пользовательской базы данных, плюс дополнительную подпапку с именем _config
, которая содержит сценарии для объектов уровня сервера, таких как логины, связанные серверы и Задания агента SQL.
(На самом деле это не имеет отношения к вашему вопросу, но мы храним пакеты SSIS в их собственном дереве, так как они могут применяться к нескольким серверам)
Мы не используем TFS, поэтому я не могу комментировать особенности вставляя в него скрипты.
Пункт 1 см. На этом сайте http://jessicammoss.blogspot.com/2008/05/ssis-configuration-to-configuration-to.html
Некоторое время назад у меня был тот же вопрос, и этот сайт мне очень помог. Мне интересно узнать о других точках, а также о том, что моя команда развертывает их вручную, как и вы, но я подумал, что поделюсь тем, что знал.
Что касается создания сценариев для объектов, вы можете сделать это через DMO, SMO, PowerShell, VBScript и любое другое количество методов. Я до сих пор использую свой старый сценарий VB DMO, который я написал, основанный на коде с нескольких веб-сайтов, и выполняю этот код через задачу сценария SSIS. Настройте задание агента SQL Server, которое выполняет пакет, и добавьте шаг, который проверяет код. Я не знаком с TFS, но я сделал это как с Visual SourceSafe, так и с Perforce без каких-либо проблем. Уловка заключается в том, что вам просто нужно научиться выполнять автоматическую регистрацию в командной строке, которая объединяет изменения (обновления, удаления, создания). Ниже приведена моя древняя задача сценария VB.NET. Имейте в виду, что вы можете частично заменить его переменными, чтобы сделать его более динамичным.
' 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
End Class