param
(
[string] $_instanceName,
[string] $_databaseName,
[string] $_outputRoot
)
$currentPath
= [System.IO.Directory]::GetCurrentDirectory();
[void][System.Reflection.Assembly]::LoadFile([System.IO.Path]::Combine($currentPath,"log4net.dll"));
$log4netLogManager = "PowerShell";
$log4netConfigName = "powershell.config";
$script:log=[log4net.LogManager]::GetLogger("PowerShell");
$private:fileInfo = new-object System.IO.FileInfo([System.IO.Path]::Combine($currentPath,$log4netConfigName));
[log4net.Config.XmlConfigurator]::Configure($fileInfo);
function ScriptSqlObject($_scripter,$_smoObject,$_targetPath,$_includeDrop,$_scriptToFileOnly,$_smoObjectTypetitle)
{
$log.Info(($_smoObjectTypetitle +
": " + $_smoObject))
$actualFullPathToScriptFile = [System.IO.Path]::Combine($_targetPath, $_smoObject.Name +
".sql")
if ( [System.IO.File]::Exists($actualFullPathToScriptFile) -eq
$true )
{
[System.IO.File]::Delete($actualFullPathToScriptFile)
}
$_scripter.Options.FileName = $actualFullPathToScriptFile
$_scripter.Options.IncludeHeaders =
$true
$_scripter.Options.ToFileOnly = $_scriptToFileOnly
if ( $_includeDrop
-eq $true )
{
$_scripter.Options.AppendToFile
= $true
$_scripter.Options.ScriptDrops
= $scriptDrop
$_scripter.Options.IncludeIfNotExists
= $true
# script the drop
$_scripter.Script($_smoObject.Urn)
}
$_scripter.Options.ScriptDrops =
$false
$_scripter.Options.IncludeIfNotExists
= $false
# script the create
$_scripter.Script($_smoObject.Urn)
trap
{
$log.Error("$error[0].exception");
}
}
# WARNING: this deletes the directory and all contents
function ZapDirectory ([string] $scriptPath)
{
mkdir $scriptPath
}
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null
$smoServer
= new-object ( 'Microsoft.SqlServer.Management.Smo.Server')
$_instanceName
$smoDatabase
= $smoServer.Databases[$_databaseName]
$smoScripter
= new-object ( 'Microsoft.SqlServer.Management.Smo.Scripter')
($smoServer)
#configure the generic SMO ScriptingOptions
#$smoScripter.Options.Permissions
= $true
$smoScripter.Options.WithDependencies
= $false
$smoScripter.Options.DriChecks
= $false
$smoScripter.Options.DriWithNoCheck
= $false;
$smoScripter.Options.SchemaQualify
= $true;
$smoScripter.Options.NoExecuteAs
= $false;
$smoScripter.Options.AllowSystemObjects
= $false;
ZapDirectory ( $_outputRoot
+ "\FileGroups" )
ZapDirectory ( $_outputRoot
+ "\Users" )
ZapDirectory ( $_outputRoot
+ "\Data" )
ZapDirectory ( $_outputRoot
+ "\Tables" )
ZapDirectory ( $_outputRoot
+ "\StoredProcedures" )
ZapDirectory ( $_outputRoot
+ "\CheckConstraints" )
ZapDirectory ( $_outputRoot
+ "\Defaults" )
ZapDirectory ( $_outputRoot
+ "\Synonyms" )
ZapDirectory ( $_outputRoot
+ "\Functions" )
ZapDirectory ( $_outputRoot
+ "\Indexes" )
ZapDirectory ( $_outputRoot
+ "\PrimaryKeys" )
ZapDirectory ( $_outputRoot
+ "\ForeignKeys" )
ZapDirectory ( $_outputRoot
+ "\Schemas" )
ZapDirectory ( $_outputRoot
+ "\UserDefinedTypes" )
ZapDirectory ( $_outputRoot
+ "\UserDefinedDataTypes" )
ZapDirectory ( $_outputRoot
+ "\XmlSchemas" )
ZapDirectory ( $_outputRoot
+ "\Views" )
ZapDirectory ( $_outputRoot
+ "\Roles" )
ZapDirectory ( $_outputRoot
+ "\Users" )
ZapDirectory ( $_outputRoot
+ "\DmlTriggers" )
ZapDirectory ( $_outputRoot
+ "\DdlTriggers" )
$smoServer.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.StoredProcedure], "IsSystemObject" )
foreach ( $smoRole in $smoDatabase.Roles
) { if ( $smoRole.IsFixedRole -eq
$false ) {ScriptSqlObject
$smoScripter $smoRole
"$_outputRoot\Roles" $true $true
"ROLE"} }
foreach ( $smoDefault in $smoDatabase.Defaults
) { ScriptSqlObject $smoScripter
$smoDefault "$_outputRoot\Defaults"
$true $true "DEFAULT" }
foreach ( $smoSynonym in $smoDatabase.Synonyms
){ ScriptSqlObject $smoScripter
$smoSynonym "$_outputRoot\Synonyms"
$true $true "SYNONYM"}
$smoDatabase.PrefetchObjects([Microsoft.SqlServer.Management.Smo.View])
foreach ( $smoView in $smoDatabase.Views
) { if ( $smoView.IsSystemObject -eq
$false ) { ScriptSqlObject $smoScripter
$smoView "$_outputRoot\Views"
$true $true "VIEW" } }
foreach ( $smoDdlTrigger in $smoDatabase.Triggers
) { ScriptSqlObject $smoScripter
$smoDdlTrigger "$_outputRoot\DdlTriggers"
$true $true "TRIGGER" }
$smoDatabase.PrefetchObjects([Microsoft.SqlServer.Management.Smo.UserDefinedFunction])
foreach ( $smoUDF in $smoDatabase.UserDefinedFunctions
) { if ( $smoUDF.IsSystemObject
-eq $false ) { ScriptSqlObject $smoScripter $smoUDF "$_outputRoot\Functions"
$true $true "FUNCTION" }}
foreach ( $smoUDDT in $smoDatabase.UserDefinedDataTypes
){ ScriptSqlObject
$smoScripter $smoUDDT
"$_outputRoot\UserDefinedDataTypes" $true
$true "DATA TYPE"}
foreach ( $smoUDT in $smoDatabase.UserDefinedTypes
){ ScriptSqlObject $smoScripter
$smoUDT "$_outputRoot\UserDefinedTypes"
$true $true "TYPE"}
foreach ( $smoXmlSchema in $smoDatabase.XmlSchemaCollections
){ ScriptSqlObject $smoScripter
$smoXmlSchema "$_outputRoot\XmlSchemas"
$true $true "XML SCHEMA"}
foreach ( $smoUser in $smoDatabase.Users
){ ScriptSqlObject
$smoScripter $smoUser
"$_outputRoot\Users" $true $true
"USER" }
$smoDatabase.PrefetchObjects([Microsoft.SqlServer.Management.Smo.Table])
foreach ( $smoTable in $smoDatabase.Tables
)
{
ScriptSqlObject $smoScripter
$smoTable "$_outputRoot\Tables"
$true $true "TABLE"
$smoScripter.Options.DriForeignKeys
= $true
foreach ( $smoForeignKey in $smoTable.ForeignKeys
) { ScriptSqlObject $smoScripter
$smoForeignKey "$_outputRoot\ForeignKeys"
$true $true "`tFORIEGN KEY" }
$smoScripter.Options.DriForeignKeys
= $false
$smoScripter.Options.DriPrimaryKey =
$true
foreach ( $smoIndex in $smoTable.Indexes )
{
if( $smoIndex.IndexKeyType
-eq [Microsoft.SqlServer.Management.Smo.IndexKeyType]::DriPrimaryKey )
{
ScriptSqlObject $smoScripter $smoIndex "$_outputRoot\PrimaryKeys" $true $true "`tPRIMARY KEY"
}
else
{
ScriptSqlObject $smoScripter $smoIndex "$_outputRoot\Indexes" $true $true "`tINDEX"
}
}
$smoScripter.Options.DriPrimaryKey =
$false
foreach ( $smoCheck in $smoTable.Checks )
{
$smoScripter.Options.DriChecks
= $true
ScriptSqlObject $smoScripter $smoCheck "$_outputRoot\CheckConstraints" $true $true "`tCHECK CONSTRAINT"
$smoScripter.Options.DriChecks
= $false
}
foreach ( $smoDmlTrigger in $smoTable.Triggers
) { ScriptSqlObject $smoScripter
$smoDmlTrigger "$_outputRoot\DmlTriggers"
$true $true "`tTRIGGER" }
foreach ( $smoColumn in $smoTable.Columns )
{ if ( $smoColumn.DefaultConstraint -ne $null ) { ScriptSqlObject $smoScripter $smoColumn.DefaultConstraint "$_outputRoot\Defaults"
$false $true "`tDEFAULT" } }
}
foreach ( $smoTable in $smoDatabase.Tables
)
{
$log.Info("BULK DATA: $smoTable")
cd "$_outputRoot\Data"
bcp "$_databaseName.$smoTable" out $smoTable
-S $_instanceName -T -w | out-null
}
$smoDatabase.PrefetchObjects([Microsoft.SqlServer.Management.Smo.StoredProcedure])
foreach ( $sp in $smoDatabase.StoredProcedures ){ if
( $sp.IsSystemObject -eq
$false ) { ScriptSqlObject $smoScripter
$sp "$_outputRoot\StoredProcedures" $true
$true "STORED PROCEDURE" }}