param (
[string] $server = $(Read-Host -prompt "Server"),
[string] $database = $(Read-Host -prompt "Database"),
[string] $directory = $(Read-Host -prompt "Output Directory")
)
$srv = new-object ("Microsoft.SqlServer.Management.Smo.Server") $server
$srv.Initialize() | out-null
if ( $srv.Databases.Contains($database) ) {
$db = $srv.Databases[$database]
}
else {
throw "Database '" + $database + "' not found on '" + $server + "'. Aborting."
}
$scr = new-object "Microsoft.SqlServer.Management.Smo.Scripter"
$scr.Server = $srv
$header_opts = $scr.Options
$header_opts.IncludeDatabaseContext = $false
$header_opts.ToFileOnly = $true
$body_opts = New-Object ("Microsoft.SqlServer.Management.Smo.ScriptingOptions") $header_opts
$header_opts.AppendToFile = $false
$header_opts.IncludeHeaders = $false
$header_opts.IncludeIfNotExists = $true
$header_opts.ScriptDrops = $true
$body_opts.AppendToFile = $true
$body_opts.AnsiPadding = $true
$body_opts.ExtendedProperties = $true
$body_opts.NoCollation = $true
$body_opts.NoCommandTerminator = $false
$body_opts.Permissions = $true
$body_opts.SchemaQualify = $true
$body_opts.ScriptBatchTerminator = $true
$body_opts.ScriptSchema = $true
new-item -path $directory -name "Schema Objects\Views" -type directory -force
foreach ($a in $db.Views | where {$_.IsSystemObject -eq $false}) {
$filename = $directory + '\Schema Objects\views\' + $a.schema + '.' + $a.name + '.view.sql'
$header_opts.FileName = $body_opts.FileName = $filename
$scr.Options = $header_opts
$scr.Script($a)
$scr.Options = $body_opts
$scr.Script($a)
}
new-item -path $directory -name "Schema Objects\Stored Procedures" -type directory -force
foreach ($a in $db.StoredProcedures | where {$_.IsSystemObject -eq $false}) {
$filename = $directory + '\Schema Objects\Stored Procedures\' + $a.schema + '.' + $a.name + '.proc.sql'
$header_opts.FileName = $body_opts.FileName = $filename
$scr.Options = $header_opts
$scr.Script($a)
$scr.Options = $body_opts
$scr.Script($a)
}
new-item -path $directory -name 'Schema Objects\Functions' -type directory -force
foreach ($a in $db.UserDefinedFunctions | where {$_.IsSystemObject -eq $false}) {
$filename = $directory + '\Schema Objects\Functions\' + $a.schema + '.' + $a.name + '.function.sql'
$header_opts.FileName = $body_opts.FileName = $filename
$scr.Options = $header_opts
$scr.Script($a)
$scr.Options = $body_opts
$scr.Script($a)
}
new-item -path $directory -name "Schema Objects\Triggers" -type directory -force
foreach ($table in $db.Tables | where {$_.IsSystemObject -eq $false}) {
foreach ($a in $table.Triggers) {
$filename = $directory + '\Schema Objects\Triggers\' + `
$table.schema + '.' + $table.name + '.' + `
$a.name + '.trigger.sql'
$header_opts.FileName = $body_opts.FileName = $filename
$scr.Options = $header_opts
$scr.Script($a)
$scr.Options = $body_opts
$scr.Script($a)
}
}
Toss that into a file and run it through Powershell. A word of warning: it will clobber any directory that you point it at for the output. The interesting thing here is that you can get the behavior that Mr. Leonard wants: a guarded 'drop procedure' and a 'create procedure' that's not in an sp_executesql. Have fun...but remember don't run with scissors!
Nice inaugural post. No longer is SMO available to the ".NET elite". I can see why a lot of DBAs are picking up powershell in a big way. I'll have to play with this a little more...
ReplyDelete-Eric Strom