0

SMO を使用して、外部キーを削除するスクリプトを生成する次の PowerShell スクリプトがあります ($scripter は Scripter オブジェクトで、$db は Database オブジェクトです)。

$scripter.Options.ScriptDrops = $true;
$scripter.Options.DriForeignKeys = $true;
$scripter.Options.DriChecks = $true;

$dbObjCollection = @();
foreach($tb in $db.Tables)
{
  $dbObjCollection += $tb.Checks;
  $dbObjCollection += $tb.ForeignKeys;
}

foreach ($dbObj in $dbObjCollection) 
{   
  $smoObjects = @();
  $smoObjects += $dbObj.Urn; 
  if ($dbObj.IsSystemObject -eq $false) 
  { 
     $sc = $scripter.EnumScript($smoObjects); 
  } 
}

しかし、うまくいきません。Scripter オブジェクトの FileName プロパティで指定されたファイルにデータは書き込まれません。

外部キーのみのドロップを生成するように Scripter オブジェクトを設定する方法と、これを実現するために Scripter オブジェクトに渡すオブジェクトについて、誰かがガイダンスを提供できますか?

4

1 に答える 1

0

このスクリプトは私にとってはうまくいきます (foreach ループでの $scripter.Script($dbObj) の呼び出しに注意してください)。

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null

$s = New-Object Microsoft.SqlServer.Management.Smo.Server($serverInstance)
$db = $s.databases[$database]

$scripter = New-Object ('Microsoft.SqlServer.Management.Smo.Scripter') ($s)

$scripter.Options.ScriptDrops = $true;
$scripter.Options.DriForeignKeys = $true;
$scripter.Options.DriChecks = $true;

$dbObjCollection = @();
foreach($tb in $db.Tables)
{
  $dbObjCollection += $tb.Checks;
  $dbObjCollection += $tb.ForeignKeys;
}

foreach ($dbObj in $dbObjCollection) 
{   
  $smoObjects = @();
  $smoObjects += $dbObj.Urn; 
  if ($dbObj.IsSystemObject -eq $false) 
  { 
     $sc = $scripter.EnumScript($smoObjects); 
  } 

  $scripter.Script($dbObj)
}
于 2013-02-20T08:42:48.647 に答える