Guest User

Untitled

a guest
Dec 15th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.20 KB | None | 0 0
  1. # Usage: powershell ExtractInitialDatabaseScript.ps1 "SERVERNAME" "DATABASE" "C:\<YourOutputPath>"
  2. function GenerateDBScript([string]$ServerName, [string]$Database, [string]$scriptpath)
  3. {
  4. $outFile = "$scriptpath\$($Database)_Inital_setup.sql"
  5.  
  6. if (-not (Test-Path $scriptpath)) {
  7. [System.IO.Directory]::CreateDirectory($scriptpath)
  8. }
  9. If (Test-Path $outFile) {
  10. Remove-Item $outFile
  11. }
  12. If (Test-Path "$outFile.utf16") {
  13. Remove-Item "$outFile.utf16"
  14. }
  15.  
  16. # Load SMO assembly, and if we're running SQL 2008 DLLs load the SMOExtended and SQLWMIManagement libraries
  17. $v = [System.Reflection.Assembly]::LoadWithPartialName( 'Microsoft.SqlServer.SMO')
  18. if ((($v.FullName.Split(','))[1].Split('='))[1].Split('.')[0] -ne '9') {
  19. [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMOExtended') | out-null
  20. }
  21. [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SmoEnum') | out-null
  22. set-psdebug -strict # catch a few extra bugs
  23. $ErrorActionPreference = "stop"
  24. $My='Microsoft.SqlServer.Management.Smo'
  25. $srv = new-object ("$My.Server") $ServerName # attach to the server
  26. if ($srv.ServerType-eq $null) # if it managed to find a server
  27. {
  28. Write-Error "Sorry, but I couldn't find Server '$ServerName' "
  29. return
  30. }
  31.  
  32. $scripter = new-object ("$My.Scripter") $srv # create the scripter
  33.  
  34. $scripter.Options.IncludeDatabaseContext = $false
  35. $scripter.Options.IncludeIfNotExists = $true
  36. $scripter.Options.ToFileOnly = $true
  37. $scripter.Options.AllowSystemObjects = $false
  38. $scripter.Options.Permissions = $true
  39. $scripter.Options.DriAllConstraints = $true
  40. $scripter.Options.SchemaQualify = $true
  41. $scripter.Options.ScriptDrops = $false
  42.  
  43. $scripter.Options.SchemaQualifyForeignKeysReferences = $true
  44.  
  45. $scripter.Options.Indexes = $true
  46. $scripter.Options.DriAll = $true
  47. $scripter.Options.DriIndexes = $true
  48. $scripter.Options.DriClustered = $true
  49. $scripter.Options.DriNonClustered = $true
  50. $scripter.Options.NonClusteredIndexes = $true
  51. $scripter.Options.ClusteredIndexes = $true
  52. $scripter.Options.FullTextIndexes = $true
  53. $scripter.Options.Triggers = $true
  54. $scripter.Options.Permissions = $true
  55. $scripter.Options.EnforceScriptingOptions = $true
  56. $scripter.Options.WithDependencies = $true
  57. $scripter.Options.AppendToFile = $true
  58. $scripter.Options.FileName = "$outFile.utf16"
  59.  
  60. $scripterNonTable = new-object ("$My.Scripter") $srv # create the scripter
  61.  
  62. $scripterNonTable.Options.IncludeDatabaseContext = $false
  63. $scripterNonTable.Options.IncludeIfNotExists = $true
  64. $scripterNonTable.Options.ToFileOnly = $true
  65. $scripterNonTable.Options.AllowSystemObjects = $false
  66. $scripterNonTable.Options.SchemaQualify = $true
  67. $scripterNonTable.Options.Permissions = $true
  68. $scripterNonTable.Options.AppendToFile = $true
  69. $scripterNonTable.Options.FileName = "$outFile.utf16"
  70.  
  71. # first we get the bitmap of all the object types we want
  72. $all =[long] [Microsoft.SqlServer.Management.Smo.DatabaseObjectTypes]::all `
  73. -bxor [Microsoft.SqlServer.Management.Smo.DatabaseObjectTypes]::ExtendedStoredProcedure
  74. # and we store them in a datatable
  75. $d = new-object System.Data.Datatable
  76. # get everything except the servicebroker object, the information schema and system views
  77. $d=$srv.databases[$Database].EnumObjects([long]0x1FFFFFFF -band $all) | `
  78. Where-Object {$_.Schema -ne 'sys' `
  79. -and !($_.IsSystemObject) `
  80. -and $_.Schema -ne "information_schema" }
  81. # and write out each scriptable object as a file in the directory you specify
  82. $d| FOREACH-OBJECT { # for every object we have in the datatable.
  83. Write-Host "$($_.DatabaseObjectTypes) : $($_.name -replace '[\\\/\:\.]','-')"
  84. if ($_.DatabaseObjectTypes -eq 'Table' `
  85. -or $_.DatabaseObjectTypes -eq 'View' ) {
  86.  
  87. $UrnCollection = new-object ('Microsoft.SqlServer.Management.Smo.urnCollection')
  88. $URNCollection.add($_.urn)
  89. $scripter.script($URNCollection)
  90. Write-Host "$($_.DatabaseObjectTypes) : $($_.name -replace '[\\\/\:\.]','-')"
  91.  
  92. }
  93. if ($_.DatabaseObjectTypes -eq 'DatabaseRole' `
  94. -or $_.DatabaseObjectTypes -eq 'Schema' `
  95. -or $_.DatabaseObjectTypes -eq 'Synonym' ) {
  96.  
  97. $UrnCollection = new-object ('Microsoft.SqlServer.Management.Smo.urnCollection')
  98. $URNCollection.add($_.urn)
  99. $scripterNonTable.script($URNCollection)
  100. Write-Host "$($_.DatabaseObjectTypes) : $($_.name -replace '[\\\/\:\.]','-')"
  101.  
  102. }
  103.  
  104. }
  105.  
  106. #MSSQL outputs UTF16, which git will see as binary. This converts it to UTF8 so diff will work.
  107. Get-Content -en Unicode "$outFile.utf16" | Out-File -en utf8 "$outFile"
  108. Remove-Item "$outFile.utf16"
  109. }
  110.  
  111. #=============
  112. # Execute
  113. #=============
  114. GenerateDBScript $args[0] $args[1] $args[2]
Add Comment
Please, Sign In to add comment