ApexSQL DevOps toolkit - Sync data

Octopus.Script exported 2020-08-20 by ApexSQLtechops belongs to ‘ApexSQL’ category.

The step will compare database from a deployment package with target database to create data synchronization script deployment resource.

ApexSQL Data Diff is requred

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Retrieve package from

PackageDownloadStepName =

Select the step from which the database package can be sourced

Export location

ExportPath =

The location for exported deployment resources. This path will be used in the “ApexSQL DevOps toolkit – Deploy” step

SQL Server

ServerName =

Provide the SQL Server name for the deployment target database

Database

Database =

Provide the name of the target database which will be used for comparison with source data located in the deployment package in order to generate deployment resource

Username

Username =

The account name used for SQL authentication method. Windows authentication method with the account that runs the Tentacle service will be used for SQL Server connection if left empty

Password

Password =

Enter password for chosen account used for SQL authentication method. Leave empty if Windows authentication method is used

Project file path

ProjectFilePath =

Use to import data comparison options and rows filter template created with ApexSQL Data Diff. Application defaults will be used if not provided

See also: Using the Row filter option in ApexSQL Data Diff

Additional parameters

Additional =

Enter any CLI options switches used with ApexSQL Data Diff. Options will override existing options imported from project file

See also: ApexSQL Data Diff Command Line Interface (CLI) switches

Script body

Steps based on this template will execute the following PowerShell script.

function Get-ApexSQLToolLocation
{
    param
    (
        [Parameter(Mandatory = $true)]
        [String] $ApplicationName
    )
    $key = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ApexSQL $($ApplicationName)_is1"
    if (Test-Path "HKLM:\$Key")
    {
		$ApplicationPath = (Get-ItemProperty -Path "HKLM:\$key" -Name InstallLocation).InstallLocation
	}
    else
    {
		$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry64)

		$regKey= $reg.OpenSubKey("$key")
		if ($regKey)
        {
			$ApplicationPath = $regKey.GetValue("InstallLocation")
		}
        else
        {
			$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry32)
			$regKey= $reg.OpenSubKey("$key")
			if ($regKey)
            {
				$ApplicationPath = $regKey.GetValue("InstallLocation")
			}
            else
            {
                return $null
			}
		}
	}
    if ($ApplicationPath)
    {
        return $ApplicationPath + "ApexSQL" + $ApplicationName.replace(' ','') + ".com"
    }
}

function AddArtifact() {
    Param(
        [Parameter(Mandatory = $true)]
        [string]$artifact
    )
    if (Test-Path $artifact) {
        New-OctopusArtifact $artifact
    }
}

function Get-ParamValue
{
    param
    (
        [Parameter(Mandatory = $true)]
        [String] $ParamName
    )
    if($OctopusParameters -and ($OctopusParameters["$($ParamName)"] -ne $null))
    {
        # set the variable value
        return $OctopusParameters["$($ParamName)"]
    }
    else
    {
        # warning
        return $null
    }
}

$exportPath = Get-ParamValue -ParamName 'ExportPath'
$PackageDownloadStepName = Get-ParamValue -ParamName 'PackageDownloadStepName'
$s2 = Get-ParamValue -ParamName 'ServerName'
$d2 = Get-ParamValue -ParamName 'Database'
$u2 = Get-ParamValue -ParamName 'Username'
$p2 = Get-ParamValue -ParamName 'Password'
$projectFilePath = Get-ParamValue -ParamName 'ProjectFilePath'
$additional = Get-ParamValue -ParamName 'Additional'

$projectId = $OctopusParameters["Octopus.Project.Id"]
$releaseNumber = $OctopusParameters["Octopus.Release.Number"]
$nugetPackageId = $OctopusParameters["Octopus.Action[$PackageDownloadStepName].Package.NuGetPackageId"]
$exportPath = Join-Path (Join-Path $exportPath $projectId) $releaseNumber

if (-Not (Test-Path $exportPath)) { New-Item $exportPath -ItemType Directory }

$FolderList = Get-ChildItem $OctopusParameters["Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath"] -Directory

Foreach($f in $Folderlist){
if ($f.Name -like '*Script*')
	{
 		$DatabaseScripts = $f.Name
 	}
}

$sfPath = $OctopusParameters["Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath"] + '\' + $DatabaseScripts

if($null -eq $sfPath) {
    throw "Step: '$PackageDownloadStepName' didn't download any NuGet package."
}

$dataSyncScript = "DataSyncScript.sql"
$dataSyncSummary = "DataSyncSummary.log"
$dataSyncReport = "DataSyncReport.html"


$creds2 = ''
if ($u2 -ne $null -and $p2 -ne $null)
{
    $creds2 = "/user2:`"$($u2)`" /password2:`"$($p2)`""
}

$project = ''
if($projectFilePath -ne $null)
{
    $project = "/project: `"$($projectFilePath)`""
}

$additionalParams = ''
if($additional -ne $null)
{
    $additionalParams = $additional
}


$toolLocation = Get-ApexSQLToolLocation -ApplicationName 'Data Diff'
$toolParams = " /sf1:`"$($sfPath)`" /server2:`"$($s2)`" /database2:`"$($d2)`" $($creds2)"
$toolParams += " /ot:sql /on:`'$($exportPath)\$($dataSyncScript)`'"
$toolParams += " /ot2:html /on2:`"$($exportPath)\$($dataSyncReport)`""
$toolParams += " /cso:`"$($exportPath)\$($dataSyncSummary)`""
$toolParams += " $($project)"
$toolParams += " $($additionalParams) /v /f"
write-host $toolParams
Invoke-Expression -Command ("& `"$($toolLocation)`" $toolParams")

AddArtifact("$exportPath\$dataSyncScript")
AddArtifact("$exportPath\$dataSyncSummary")
AddArtifact("$exportPath\$dataSyncReport")

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "71d5998a-3100-4a7e-9565-b65bf0fa2352",
  "Name": "ApexSQL DevOps toolkit - Sync data",
  "Description": "The step will compare database from a deployment package with target database to create data synchronization script deployment resource.\n\n[ApexSQL Data Diff](https://www.apexsql.com/sql-tools-datadiff.aspx) is requred",
  "Version": 2,
  "ExportedAt": "2020-08-20T11:41:02.493Z",
  "ActionType": "Octopus.Script",
  "Author": "ApexSQLtechops",
  "Packages": [],
  "Parameters": [
    {
      "Id": "3d6da5fc-e18f-4092-9e01-03c35f650644",
      "Name": "PackageDownloadStepName",
      "Label": "Retrieve package from",
      "HelpText": "Select the step from which the database package can be sourced",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "StepName"
      }
    },
    {
      "Id": "a349fecf-1fe3-4827-8d3b-9f02fb2a12cf",
      "Name": "ExportPath",
      "Label": "Export location",
      "HelpText": "The location for exported deployment resources. This path will be used in the “ApexSQL DevOps toolkit – Deploy” step",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "11c4c432-f021-4671-96e0-04c2b9da1588",
      "Name": "ServerName",
      "Label": "SQL Server",
      "HelpText": "Provide the SQL Server name for the deployment target database",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "96fe6267-ac00-461f-bb97-a33cf628ac94",
      "Name": "Database",
      "Label": "Database",
      "HelpText": "Provide the name of the target database which will be used for comparison with source data located in the deployment package in order to generate deployment resource",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "1deec13b-2b56-43fb-a43e-f73c8825a986",
      "Name": "Username",
      "Label": "Username",
      "HelpText": "The account name used for SQL authentication method. Windows authentication method with the account that runs the Tentacle service will be used for SQL Server connection if left empty",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "e2abb015-9baa-44cc-8c9a-93ba368d36aa",
      "Name": "Password",
      "Label": "Password",
      "HelpText": "Enter password for chosen account used for SQL authentication method. Leave empty if Windows authentication method is used",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      }
    },
    {
      "Id": "ea6a3d17-1341-4f86-87bf-57c39616132c",
      "Name": "ProjectFilePath",
      "Label": "Project file path",
      "HelpText": "Use to import data comparison options and rows filter template created with ApexSQL Data Diff. Application defaults will be used if not provided\n\nSee also:\n[Using the Row filter option in ApexSQL Data Diff](https://knowledgebase.apexsql.com/using-row-filter-feature-in-apexsql-data-diff/)",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "24fb5094-7d3e-421a-bddd-5629aba43982",
      "Name": "Additional",
      "Label": "Additional parameters",
      "HelpText": "Enter any CLI options switches used with ApexSQL Data Diff. Options will override existing options imported from project file\n\nSee also:\n[ApexSQL Data Diff Command Line Interface (CLI) switches](https://knowledgebase.apexsql.com/apexsql-data-diff-command-line-interface-cli-switches/)",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptBody": "function Get-ApexSQLToolLocation\n{\n    param\n    (\n        [Parameter(Mandatory = $true)]\n        [String] $ApplicationName\n    )\n    $key = \"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\ApexSQL $($ApplicationName)_is1\"\n    if (Test-Path \"HKLM:\\$Key\")\n    {\n\t\t$ApplicationPath = (Get-ItemProperty -Path \"HKLM:\\$key\" -Name InstallLocation).InstallLocation\n\t}\n    else\n    {\n\t\t$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry64)\n\n\t\t$regKey= $reg.OpenSubKey(\"$key\")\n\t\tif ($regKey)\n        {\n\t\t\t$ApplicationPath = $regKey.GetValue(\"InstallLocation\")\n\t\t}\n        else\n        {\n\t\t\t$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry32)\n\t\t\t$regKey= $reg.OpenSubKey(\"$key\")\n\t\t\tif ($regKey)\n            {\n\t\t\t\t$ApplicationPath = $regKey.GetValue(\"InstallLocation\")\n\t\t\t}\n            else\n            {\n                return $null\n\t\t\t}\n\t\t}\n\t}\n    if ($ApplicationPath)\n    {\n        return $ApplicationPath + \"ApexSQL\" + $ApplicationName.replace(' ','') + \".com\"\n    }\n}\n\nfunction AddArtifact() {\n    Param(\n        [Parameter(Mandatory = $true)]\n        [string]$artifact\n    )\n    if (Test-Path $artifact) {\n        New-OctopusArtifact $artifact\n    }\n}\n\nfunction Get-ParamValue\n{\n    param\n    (\n        [Parameter(Mandatory = $true)]\n        [String] $ParamName\n    )\n    if($OctopusParameters -and ($OctopusParameters[\"$($ParamName)\"] -ne $null))\n    {\n        # set the variable value\n        return $OctopusParameters[\"$($ParamName)\"]\n    }\n    else\n    {\n        # warning\n        return $null\n    }\n}\n\n$exportPath = Get-ParamValue -ParamName 'ExportPath'\n$PackageDownloadStepName = Get-ParamValue -ParamName 'PackageDownloadStepName'\n$s2 = Get-ParamValue -ParamName 'ServerName'\n$d2 = Get-ParamValue -ParamName 'Database'\n$u2 = Get-ParamValue -ParamName 'Username'\n$p2 = Get-ParamValue -ParamName 'Password'\n$projectFilePath = Get-ParamValue -ParamName 'ProjectFilePath'\n$additional = Get-ParamValue -ParamName 'Additional'\n\n$projectId = $OctopusParameters[\"Octopus.Project.Id\"]\n$releaseNumber = $OctopusParameters[\"Octopus.Release.Number\"]\n$nugetPackageId = $OctopusParameters[\"Octopus.Action[$PackageDownloadStepName].Package.NuGetPackageId\"]\n$exportPath = Join-Path (Join-Path $exportPath $projectId) $releaseNumber\n\nif (-Not (Test-Path $exportPath)) { New-Item $exportPath -ItemType Directory }\n\n$FolderList = Get-ChildItem $OctopusParameters[\"Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath\"] -Directory\n\nForeach($f in $Folderlist){\nif ($f.Name -like '*Script*')\n\t{\n \t\t$DatabaseScripts = $f.Name\n \t}\n}\n\n$sfPath = $OctopusParameters[\"Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath\"] + '\\' + $DatabaseScripts\n\nif($null -eq $sfPath) {\n    throw \"Step: '$PackageDownloadStepName' didn't download any NuGet package.\"\n}\n\n$dataSyncScript = \"DataSyncScript.sql\"\n$dataSyncSummary = \"DataSyncSummary.log\"\n$dataSyncReport = \"DataSyncReport.html\"\n\n\n$creds2 = ''\nif ($u2 -ne $null -and $p2 -ne $null)\n{\n    $creds2 = \"/user2:`\"$($u2)`\" /password2:`\"$($p2)`\"\"\n}\n\n$project = ''\nif($projectFilePath -ne $null)\n{\n    $project = \"/project: `\"$($projectFilePath)`\"\"\n}\n\n$additionalParams = ''\nif($additional -ne $null)\n{\n    $additionalParams = $additional\n}\n\n\n$toolLocation = Get-ApexSQLToolLocation -ApplicationName 'Data Diff'\n$toolParams = \" /sf1:`\"$($sfPath)`\" /server2:`\"$($s2)`\" /database2:`\"$($d2)`\" $($creds2)\"\n$toolParams += \" /ot:sql /on:`'$($exportPath)\\$($dataSyncScript)`'\"\n$toolParams += \" /ot2:html /on2:`\"$($exportPath)\\$($dataSyncReport)`\"\"\n$toolParams += \" /cso:`\"$($exportPath)\\$($dataSyncSummary)`\"\"\n$toolParams += \" $($project)\"\n$toolParams += \" $($additionalParams) /v /f\"\nwrite-host $toolParams\nInvoke-Expression -Command (\"& `\"$($toolLocation)`\" $toolParams\")\n\nAddArtifact(\"$exportPath\\$dataSyncScript\")\nAddArtifact(\"$exportPath\\$dataSyncSummary\")\nAddArtifact(\"$exportPath\\$dataSyncReport\")",
    "Octopus.Action.EnabledFeatures": ""
  },
  "Category": "ApexSQL",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/apexsql-devops-toolkit-sync-data.json",
  "Website": "/step-templates/71d5998a-3100-4a7e-9565-b65bf0fa2352",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Thursday, August 20, 2020