Doh! A while back I posted a Powershell script that would script out a SQL Server database. Well, a reader pointed out to me yesterday that it wasn’t quite working for him. And wouldn’t you know, it wasn’t working for me either. The problem was that when I created the script I had a specific database in mind. And this database resided on a SQL 2005/Powershell 1.0 server. My script worked like a champ there. On a SQL 2008/Powershell 2.0 server, well, not so much. So I spent some time yesterday making some fixes and I think I’ve got it this time (for either system).
Many thanks to William for the heads up.
The new code:
# SQLExportDBSchema.ps1 # Usage - # From PS: .SQLExportDBSchema.ps1 "[Drive letter]" "[Server]" "[Database]" # From CMD: powershell -command "& 'D:powershellSQLExportDBSchema.ps1' "[Drive letter]" "[Server]" "[Database]" " param( [string]$drive=$null, [string]$srv=$null, [string]$database=$null ) [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null $filepath = $drive+":"+$srv+"_backup"+$database+"" $s = new-object ('Microsoft.SqlServer.Management.Smo.Server') $srv $db = New-Object ("Microsoft.SqlServer.Management.SMO.Database") $db=$s.Databases[$database] $scrp = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($s) $scrp.Options.AppendToFile = $False $scrp.Options.ClusteredIndexes = $True $scrp.Options.DriAll = $True $scrp.Options.ScriptDrops = $False $scrp.Options.IncludeHeaders = $True $scrp.Options.IncludeIfNotExists = $True $scrp.Options.ToFileOnly = $True $scrp.Options.Indexes = $True $scrp.Options.Triggers = $True $scrp.Options.Permissions = $True #CREATE DATABASE $scrp.Options.AppendToFile = $False $outfile =$filepath+$database+"_create.sql" $scrp.Options.FileName = $outfile $scrp.Script($db) #SECURITY $scrp.Options.AppendToFile = $False $outfile = $filepath+$database+"_security.sql" $scrp.Options.FileName = $outfile $scrp.Options.IncludeDatabaseRoleMemberships = $true Foreach ($ro in $db.Roles) { $scrp.Script($ro) $scrp.Options.AppendToFile = $True } $scrp.Options.AppendToFile = $True Foreach ($appro in $db.ApplicationRoles) { $scrp.Script($appro) } Foreach ($us in $db.Users) { $scrp.Script($us) } Foreach ($sch in $db.Schemas) { $scrp.Script($sch) } $scrp.Options.WithDependencies = $True #PARTITIONING $scrp.Options.AppendToFile = $False $outfile = $filepath+$database+"_partitioning.sql" $scrp.Options.FileName = $outfile Foreach ($part in $db.PartitionFunctions) { $scrp.Script($part) $scrp.Options.AppendToFile = $True } $scrp.Options.AppendToFile = $True Foreach ($psch in $db.PartitionSchemes) { $scrp.Script($psch) } #TABLES $scrp.Options.AppendToFile = $False $outfile = $filepath+$database+"_tables.sql" $scrp.Options.FileName = $outfile Foreach ($tab in $db.Tables) { $scrp.Script($tab) $scrp.Options.AppendToFile = $True } #DDLTRIGGERS $scrp.Options.WithDependencies = $False $scrp.Options.AppendToFile = $False $outfile = $filepath+$database+"_triggers.sql" $scrp.Options.FileName = $outfile Foreach ($trig in $db.Triggers) { $scrp.Script($trig) $scrp.Options.AppendToFile = $True } $scrp.Options.WithDependencies = $True #VIEWS $scrp.Options.AppendToFile = $False $outfile = $filepath+$database+"_views.sql" $scrp.Options.FileName = $outfile $views = $db.Views | where {$_.IsSystemObject -eq $false} $scrp.Script($views) #FUNCTIONS $scrp.Options.AppendToFile = $False $outfile = $filepath+$database+"_functions.sql" $scrp.Options.FileName = $outfile $functions = $db.UserDefinedFunctions | where {$_.IsSystemObject -eq $false} $scrp.Script($functions) #STORED PROCS $scrp.Options.AppendToFile = $False $outfile = $filepath+$database+"_storedProcs.sql" $scrp.Options.FileName = $outfile $storedprocs = $db.StoredProcedures | where {$_.IsSystemObject -eq $false} $scrp.Script($storedprocs) #SYNONYMS $scrp.Options.AppendToFile = $False $outfile = $filepath+$database+"_synonyms.sql" $scrp.Options.FileName = $outfile Foreach ($syn in $db.Synonyms) { $scrp.Script($syn) $scrp.Options.AppendToFile = $True }
This works great! Thanks a ton! (Now, I just need to figure out how to script out the data in tables…)
You’re welcome. Good luck with that!