June 3, 2016 at 7:08 am
I'm getting an error using the script i've added a link to below as well, in case the forum doinks up some of the code.
this script, in a larger context, scripts all the objects out in a given database...it scripts each object out to a folder by object type and individual file per object.
i have an issue if the table or view has a trigger on it.
I thought that by making sure $ScriptOptions.Triggers = $true; was in my options, i'd be fine, but whether i toggle that to true or false, i cannot get tables or views, featuring a trigger, to script yet.
the error is on the line $scrp.Script($URNCollection), so it's probably an overlooked option that is incompatible with my "default" options, maybe? i'm kinda stuck and need a bit of peer review.
I KNOW it's triggers, because I've got a verbose statement that echos out exactly what object is being scripted at the moment.
the error specifically is
Exception calling "Script" with "1" argument(s): "Script failed for Server 'HOL-WKS-444'. "
At C:\Users\lizaguirre\Documents\ScriptOneDatabase.ps1:60 char:24
+ $scrp.Script <<<< ($URNCollection)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
###################################################################################################
## Function Declarations
###################################################################################################
function get-databaseobjectscripts($db) {
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
#$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $sqlserver
$srv.Databases | Where-Object {$_.name -eq $db} | foreach-object{$_.name | Out-Null
$database = $_
$databaseName = $_.name
write-verbose -Message "scripting [$databasename] in [$sqlserver]" -verbose
$ScriptOptions = new-object ("Microsoft.SqlServer.Management.Smo.ScriptingOptions")
$ScriptOptions.ExtendedProperties = $true # yes, we want these
$ScriptOptions.DRIAll= $true # and all the constraints
$ScriptOptions.ClusteredIndexes = $true;
$ScriptOptions.NonClusteredIndexes = $true;
$ScriptOptions.Indexes= $true # Yup, these would be nice
$ScriptOptions.ScriptBatchTerminator = $true # this only goes to the file
$ScriptOptions.IncludeHeaders = $true; # of course
$ScriptOptions.ToFileOnly = $true # no need of string output as well
$ScriptOptions.IncludeIfNotExists = $true # not necessary but makes script more versatile
$ScriptOptions.Triggers = $true;
$scrp=new-object ("Microsoft.SqlServer.Management.Smo.Scripter") ($Database.parent)
$scrp.options=$ScriptOptions
$database.EnumObjects([long]0x1FFFFFFF -band [Microsoft.SqlServer.Management.Smo.DatabaseObjectTypes]::all) | `
Where-Object {('sys','information_schema') -notcontains $_.Schema} | Foreach-Object {
$urn= [Microsoft.SqlServer.Management.Sdk.Sfc.Urn] $_.URN
write-verbose -Message "scripting $urn.name $urn.type" -verbose
if(('StoredProcedure','View','UserDefinedFunction') -contains $urn.type -and $urn.IsEncrypted -eq $true){
$fullPath="$currentPath\$($urn.type)"
$fileName = "$fullPath\$($urn.GetAttribute('Schema')-replace '[\\\/\:\.]','-')-$($urn.GetAttribute('Name') -replace '[\\\/\:\.]','-')(encrypted).sql"
New-Item fileName -type file
#save a file
}
else {
if (('ExtendedStoredProcedure','ServiceBroker') -notcontains $urn.type)
{
$currentPath="$directoryname\$($ServerName -replace '[\\\/\:\.]','-' )\$($urn.GetAttribute('Name','Database') -replace '[\\\/\:\.]','-')"
if ( $ServiceBrokerTypes -contains $urn.type)
{$fullPath="$currentPath\ServiceBroker\$($urn.type)"}
else
{$fullPath="$currentPath\$($urn.type)"}
if (!(Test-Path -path $fullPath ))
{
Try { New-Item $fullPath -type directory | out-null }
Catch [system.exception]{
Write-Error "error while creating '$fullPath' "
return
}
}
$scrp.options.FileName = "$fullPath\$($urn.GetAttribute('Schema')-replace '[\\\/\:\.]','-')-$($urn.GetAttribute('Name') -replace '[\\\/\:\.]','-').sql"
$UrnCollection = new-object ('Microsoft.SqlServer.Management.Smo.urnCollection')
$URNCollection.add($urn)
write-verbose "writing script to $($scrp.options.FileName)"
[highlight="#ffff11"]$scrp.Script($URNCollection)[/highlight]
}
}
}
}
}
###################################################################################################
## Execution Space is Below
###################################################################################################
##$servers = get-content C:\Data\PowerShell\computers.txt
$servers = "HOL-WKS-444"
$databaseToScript = "DBA_Utilities"
$directoryname = "C:\Data\PowerShell\"
#make sure our prime directory exists
if (!(Test-Path -path $directoryname)) {
New-Item $directoryname -type directory
}
#make sure our sub directory exists
if ($sqlserver.Trim() -ne "") {
if($sqlserver.IndexOf("\") -gt 0) {
$directoryname = "C:\Data\PowerShell" + "\" + $sqlserver.Replace("\","(") + ")\"
$position =$sqlserver.IndexOf("\")
$server = $sqlserver.SubString(0,$position)
$serverfilename = $sqlserver.Replace("\","(") + ")"
}
else {
$directoryname = "C:\Data\PowerShell" + "\" + $sqlserver + "\"
$server = $sqlserver
$serverfilename = $server
}
if (!(Test-Path -path $directoryname)) {
New-Item $directoryname -type directory
}
}
get-databaseobjectscripts $databaseToScript
Lowell
June 3, 2016 at 11:51 am
Hi Lowell, just tried your script on a 2014 instance with both $ScriptOptions.Triggers = $true & $ScriptOptions.Triggers = $false; both worked as expected.
The trigger scripts are included in the create table scripts & for some reason are strings passed to sp_executesql calls.
Had to make a couple of small changes for the script to run:
the line if $servers = "servername" to $sqlserver = "servername" in the execution space
and uncomment $srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $sqlserver at the top of the function
June 3, 2016 at 12:01 pm
Worked with triggers $true on a 2008 & 2012 instance too.
Maybe check PS & SMO versions?
I don't have any triggers on views though, will give that a test. edit: yep, all good there too (2014).
Viewing 3 posts - 1 through 2 (of 2 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy