0

我有以下powershell脚本来生成一个脚本来删除外键,使用SMO($scripter是一个Scripter对象,$db是一个数据库对象):

$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 对象以仅为外键生成 drop 的指导,以及将哪些对象传递给 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 回答