2010-08-06 26 views
1

我已經編寫了一個Powershell腳本,它將比較兩個數據庫並提供一個要刪除的數據庫中的對象列表。我將這些項目(作爲具有名稱和模式的自定義對象)放入數組中。將SMO集合複製到Powershell中的數組中

在我的腳本的下一步中,遍歷數據庫中的對象並查看它們是否與我的數組中的對象匹配。如果我找到一個匹配,然後繼續從我的數據庫中刪除對象。但我遇到的問題是,如果我嘗試刪除該對象,那麼通過其進行迭代的集合會發生更改,並且會收到一條錯誤消息,指出集合已更改,IEnumerable將無法正常工作。

我試圖做一個集合的副本,但我似乎無法使用CopyTo方法將其填充到數組中。有什麼建議麼?

我目前的代碼如下。當我運行這個時,數組$ sprocs是空的。

function DropSQLObjects 
{ 
param([object]$database, [object]$objectsToDrop) 

$sprocs = @() 
$database.StoredProcedures.CopyTo($sprocs, 0) 

# If I do a $sprocs | out-host I see that the array is still empty 

foreach ($objectToDrop in $objectsToDrop) 
{ 
    foreach ($sproc in $sprocs) 
    { 
    if ($sproc.Name -eq $objectToDrop.Name -and $sproc.Schema -eq $objectToDrop.Schema) 
    { 
    $sproc.Drop() 
    LogToSQL $database "Dropped Stored Procedure: $($objectToDrop.Schema).$($objectToDrop.Name)" 
    } 
    } 
} 
} 

回答

1

我加了這個作爲答案,以防其他人在將來需要這個。事實證明,我真的讓事情比他們需要的更努力。自從我使用Powershell以來,「where」函數比迭代存儲過程更好。

這裏是它解決了我的問題代碼:

function DropSQLObjects 
{ 
    param([object]$database, [object]$objectsToDrop) 

    foreach ($objectToDrop in $objectsToDrop) 
    { 
     if ($database.StoredProcedures.Contains($objectToDrop.Name, $objectToDrop.Schema)) 
     { 
      $sproc = $database.StoredProcedures | where {$_.Schema -eq $objectToDrop.Schema -and $_.Name -eq $objectToDrop.Name} 
      $sproc.Drop() 
      LogToSQL $database "Dropped Stored Procedure: $($objectToDrop.Schema).$($objectToDrop.Name)" 
     } 
    } 
} 

在現實中,我也有代碼,違背UserDefinedFunctions,但代碼大多來自StoredProcedures部分剪切和粘貼。

相關問題