我编写了一个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)"
}
}
}
}
答案 0 :(得分: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部分的剪切和粘贴。