Skip to content

Instantly share code, notes, and snippets.

@AndyDaSilva52
Forked from cheynewallace/ExportSchema.ps1
Last active February 16, 2019 23:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndyDaSilva52/e612692c3b2b79e29823795f47b3e6c7 to your computer and use it in GitHub Desktop.
Save AndyDaSilva52/e612692c3b2b79e29823795f47b3e6c7 to your computer and use it in GitHub Desktop.
Export MSSQL schema with PowerShell. This script will export your schema definitions for tables, stored procs, triggers, functions and views to .sql files with Directory Hierarchy by type of Object
# Usage: powershell MSSQLExportSchema.ps1 "SERVERNAME" "DATABASE" "C:\<YourOutputPath>"
# Start Script
#Set-ExecutionPolicy RemoteSigned
# Set-ExecutionPolicy -ExecutionPolicy:Unrestricted -Scope:LocalMachine
function GenerateDBScript([string]$serverName, [string]$dbname, [string]$scriptpath)
{
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Data") | Out-Null
$srv = new-object "Microsoft.SqlServer.Management.SMO.Server" $serverName
$srv.SetDefaultInitFields([Microsoft.SqlServer.Management.SMO.View], "IsSystemObject")
$db = New-Object "Microsoft.SqlServer.Management.SMO.Database"
$db = $srv.Databases[$dbname]
$scr = New-Object "Microsoft.SqlServer.Management.Smo.Scripter"
$deptype = New-Object "Microsoft.SqlServer.Management.Smo.DependencyType"
$scr.Server = $srv
$options = New-Object "Microsoft.SqlServer.Management.SMO.ScriptingOptions"
$options.AllowSystemObjects = $false
$options.IncludeDatabaseContext = $true
$options.IncludeIfNotExists = $false
$options.ClusteredIndexes = $true
$options.Default = $true
#$options.SchemaQualify = $true
$options.ScriptOwner = $true
$options.DriAll = $true
$options.Indexes = $true
$options.NonClusteredIndexes = $true
$options.IncludeHeaders = $false
$options.ToFileOnly = $true
$options.AppendToFile = $false
$options.ScriptDrops = $false
$options.ScriptSchema = $true
# Set options for SMO.Scripter
$scr.Options = $options
#=============
# Tables
#=============
Foreach ($tb in $db.Tables)
{
If ($tb.IsSystemObject -eq $FALSE)
{
$options.FileName = $scriptpath + "\$($dbname)\TABLES\$($tb.Schema).$($tb.Name).sql"
New-Item $options.FileName -type file -force | Out-Null
$smoObjects = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection
$smoObjects.Add($tb.Urn)
$scr.Script($smoObjects)
}
}
#=============
# Views
#=============
$views = $db.Views | where {$_.IsSystemObject -eq $false}
Foreach ($view in $views)
{
if ($views -ne $null)
{
$options.FileName = $scriptpath + "\$($dbname)\VIEWS\$($view.Schema).$($view.Name).sql"
New-Item $options.FileName -type file -force | Out-Null
$scr.Script($view)
}
}
#=============
# StoredProcedures
#=============
$StoredProcedures = $db.StoredProcedures | where {$_.IsSystemObject -eq $false}
Foreach ($StoredProcedure in $StoredProcedures)
{
if ($StoredProcedures -ne $null)
{
$options.FileName = $scriptpath + "\$($dbname)\STORED_PROCEDURES\$($StoredProcedure.Schema).$($StoredProcedure.Name).sql"
New-Item $options.FileName -type file -force | Out-Null
$scr.Script($StoredProcedure)
}
}
#=============
# Functions
#=============
$UserDefinedFunctions = $db.UserDefinedFunctions | where {$_.IsSystemObject -eq $false}
Foreach ($function in $UserDefinedFunctions)
{
if ($UserDefinedFunctions -ne $null)
{
$options.FileName = $scriptpath + "\$($dbname)\FUNCTIONS\$($function.Schema).$($function.Name).sql"
New-Item $options.FileName -type file -force | Out-Null
$scr.Script($function)
}
}
$PartitionFunctions = $db.PartitionFunctions | where {$_.IsSystemObject -eq $false}
Foreach ($function in $PartitionFunctions)
{
if ($UserDefinedFunctions -ne $null)
{
$options.FileName = $scriptpath + "\$($dbname)\FUNCTIONS_PARTITION\$($function.Schema).$($function.Name).sql"
New-Item $options.FileName -type file -force | Out-Null
$scr.Script($function)
}
}
#=============
# DBTriggers
#=============
$DBTriggers = $db.Triggers
foreach ($trigger in $db.triggers)
{
if ($DBTriggers -ne $null)
{
$options.FileName = $scriptpath + "\$($dbname)\TRIGGERS\$($trigger.Schema).$($trigger.Name).sql"
New-Item $options.FileName -type file -force | Out-Null
$scr.Script($DBTriggers)
}
}
#=============
# Table Triggers
#=============
Foreach ($tb in $db.Tables)
{
if($tb.triggers -ne $null)
{
foreach ($trigger in $tb.triggers)
{
$options.FileName = $scriptpath + "\$($dbname)\TRIGGERS\$($tb.Schema).$($tb.Name).$($trigger.Name).sql"
New-Item $options.FileName -type file -force | Out-Null
$scr.Script($trigger)
}
}
}
}
#=============
# Execute
#=============
GenerateDBScript $args[0] $args[1] $args[2]
@AndyDaSilva52
Copy link
Author

This could be used to put files at a Git Repository to maintain the control of changes in the Database

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment