Guest User

Untitled

a guest
Nov 28th, 2018
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.79 KB | None | 0 0
  1. Import-Module -Name SqlServer
  2.  
  3. function Import-AvadoSqlServerManagementObjects()
  4. {
  5. $assemblies = @(
  6. "Microsoft.SqlServer.Management.Common",
  7. "Microsoft.SqlServer.Smo",
  8. "Microsoft.SqlServer.Dmf ",
  9. "Microsoft.SqlServer.Instapi ",
  10. "Microsoft.SqlServer.SqlWmiManagement ",
  11. "Microsoft.SqlServer.ConnectionInfo ",
  12. "Microsoft.SqlServer.SmoExtended ",
  13. "Microsoft.SqlServer.SqlTDiagM ",
  14. "Microsoft.SqlServer.SString ",
  15. "Microsoft.SqlServer.Management.RegisteredServers ",
  16. "Microsoft.SqlServer.Management.Sdk.Sfc ",
  17. "Microsoft.SqlServer.SqlEnum ",
  18. "Microsoft.SqlServer.RegSvrEnum ",
  19. "Microsoft.SqlServer.WmiEnum ",
  20. "Microsoft.SqlServer.ServiceBrokerEnum ",
  21. "Microsoft.SqlServer.ConnectionInfoExtended ",
  22. "Microsoft.SqlServer.Management.Collector ",
  23. "Microsoft.SqlServer.Management.CollectorEnum",
  24. "Microsoft.SqlServer.Management.Dac",
  25. "Microsoft.SqlServer.Management.DacEnum",
  26. "Microsoft.SqlServer.Management.Utility"
  27. )
  28.  
  29. foreach ($assembly in $assemblies)
  30. {
  31. [Reflection.Assembly]::LoadWithPartialName($assembly) | Out-Null
  32. }
  33. }
  34.  
  35. class AvadoDatabase
  36. {
  37. [string] $Server
  38. [string] $Login
  39. [string] $Password
  40.  
  41. [string] $Database
  42. [string] $Schema
  43.  
  44. AvadoDatabase([string] $Server, [string] $Login, [string] $Password,
  45. [string] $Database, [string] $Schema)
  46. {
  47. $this.Server = $Server
  48. $this.Login = $Login
  49. $this.Password = $Password
  50.  
  51. $this.Database = $Database
  52. $this.Schema = $Schema
  53. }
  54.  
  55. [string] ToString()
  56. {
  57. return "schema $($this.Database).$($this.Schema) on $($this.Server) as $($this.Login)"
  58. }
  59. }
  60.  
  61. function Export-AvadoDatabaseSchemaDacpac()
  62. {
  63. [CmdletBinding()]
  64. param(
  65. [Parameter(Mandatory=$true)]
  66. [string] $SqlPackagePath,
  67. [Parameter(Mandatory=$true)]
  68. [AvadoDatabase] $Source,
  69. [Parameter(Mandatory=$true)]
  70. [string] $TargetFile
  71. )
  72.  
  73. & $SqlPackagePath `
  74. /Action:Extract `
  75. "/SourceServerName:$($Source.Server)" `
  76. "/SourceUser:$($Source.Login)" `
  77. "/SourcePassword:$($Source.Password)" `
  78. "/SourceDatabaseName:$($Source.Database)" `
  79. "/TargetFile:${TargetFile}"
  80. }
  81.  
  82. function Verify-AvadoDatabaseIntegrity()
  83. {
  84. [CmdletBinding()]
  85. param(
  86. [Parameter(Mandatory=$true)]
  87. [string] $SqlPackagePath,
  88. [Parameter(Mandatory=$true)]
  89. [string] $TableDiffPath,
  90. [Parameter(Mandatory=$true)]
  91. [AvadoDatabase] $Source,
  92. [Parameter(Mandatory=$true)]
  93. [AvadoDatabase] $Destination,
  94. [Parameter(Mandatory=$true)]
  95. [string] $OutputDirectory
  96. )
  97.  
  98. Write-Verbose "Using SqlPackage ${SqlPackagePath}"
  99. Write-Verbose "Using tablediff ${TableDiffPath}"
  100. Write-Verbose "Using source $($Source.ToString())"
  101. Write-Verbose "Using destination $($Destination.ToString())"
  102. Write-Verbose "Writing results to ${OutputDirectory}"
  103.  
  104. Write-Host "Ensuring output directory is accessible"
  105. $outputDirectoryExists = Test-Path -Path $OutputDirectory -PathType Container
  106. if (!$outputDirectoryExists)
  107. {
  108. Write-Verbose "Creating missing output directory ${OutputDirectory}"
  109. New-Item -Path $OutputDirectory -ItemType Directory -Force | Out-Null
  110. }
  111. if ($null -ne (Get-ChildItem -Path $OutputDirectory))
  112. {
  113. throw "Output directory ${OutputDirectory} already contained files"
  114. }
  115.  
  116. Write-Host "Connecting to source server..." -NoNewline
  117. $sourceConnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection `
  118. $Source.Server
  119. # Authentication mode
  120. # $false for SQL Server
  121. # $true for Windows
  122. $sourceConnection.LoginSecure = $false
  123. $sourceConnection.Login = $Source.Login
  124. $sourceConnection.Password = $Source.Password
  125. $sourceServer = New-Object Microsoft.SqlServer.Management.Smo.Server $sourceConnection
  126. Write-Host "done"
  127.  
  128. Write-Host "Enumerating source database tables..." -NoNewline
  129. $sourceDatabase = $sourceServer.Databases.Item($source.Database)
  130. $tablesSql = @"
  131. select t.name
  132. from $($Source.Database).sys.tables t
  133. inner join $($Source.Database).sys.schemas s
  134. on s.schema_id = t.schema_id
  135. where t.type_desc = 'USER_TABLE'
  136. and t.is_ms_shipped = 0
  137. and s.name = '$($Source.Schema)'
  138. "@
  139. $tablesDataSet = $sourceDatabase.ExecuteWithResults($tablesSql)
  140. $tables = $tablesDataSet.Tables.Rows | ForEach{ $_.Item("name") }
  141. Write-Host "done; found $($tables.Count)"
  142.  
  143. $sourceDacpac = Join-Path $OutputDirectory "1_source.dacpac"
  144. $destinationDacpac = Join-Path $OutputDirectory "1_destination.dacpac"
  145. $schemaSql = Join-Path $OutputDirectory "2_schema.sql"
  146.  
  147. Write-Host "Extracting source schema..." -NoNewline
  148. $elapsed = Measure-Command {
  149. Export-AvadoDatabaseSchemaDacpac `
  150. -SqlPackagePath $SqlPackagePath `
  151. -Source $Source -TargetFile $sourceDacpac
  152. }
  153. Write-Host "done; took ${elapsed}"
  154.  
  155. Write-Host "Extracting destination schema..." -NoNewline
  156. $elapsed = Measure-Command {
  157. Export-AvadoDatabaseSchemaDacpac `
  158. -SqlPackagePath $SqlPackagePath `
  159. -Source $Destination -TargetFile $destinationDacpac
  160. }
  161. Write-Host "done; took ${elapsed}"
  162.  
  163. Write-Host "Comparing schema between source and destination..." -NoNewline
  164. $elapsed = Measure-Command {
  165. & $SqlPackagePath `
  166. /Action:Script `
  167. "/SourceFile:${sourceDacpac}" `
  168. "/TargetFile:${destinationDacpac}" `
  169. "/TargetDatabaseName:$($Destination.Database)" `
  170. /OutputPath:$schemaSql
  171. }
  172. Write-Host "done; took ${elapsed}"
  173.  
  174. foreach ($table in $tables)
  175. {
  176. Write-Host "Comparing data in ${table}..." -NoNewline
  177. $elapsed = Measure-Command {
  178. & $TableDiffPath `
  179. -sourceserver $Source.Server `
  180. -sourceuser $Source.Login `
  181. -sourcepassword $Source.Password `
  182. -sourcedatabase $Source.Database `
  183. -sourceschema $Source.Schema `
  184. -destinationserver $Destination.Server `
  185. -destinationuser $Destination.Login `
  186. -destinationpassword $Destination.Password `
  187. -destinationdatabase $Destination.Database `
  188. -destinationschema $Destination.Schema `
  189. -sourcetable $table `
  190. -destinationtable $table `
  191. -o (Join-Path $OutputDirectory "3_data_report.${table}.txt") `
  192. -f (Join-Path $OutputDirectory "4_data_sql${table}.sql") `
  193. | Out-Null
  194. }
  195. Write-Host "done; took ${elapsed}"
  196. }
  197. }
Add Comment
Please, Sign In to add comment