使用SMO生成外键drop powershell脚本

时间:2013-02-20 08:21:51

标签: powershell foreign-keys smo

我有以下powershell脚本生成一个脚本来删除外键,使用SMO($ 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对象以实现此目的?

1 个答案:

答案 0 :(得分: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)
}