Как использовать SMO в PowerShell для написания скриптов слегка измененных объектов? - PullRequest
1 голос
/ 12 мая 2010

Я пытаюсь сгенерировать сценарии из базы данных, но с небольшими изменениями в этих объектах. Например, я хочу сгенерировать скрипт для хранимой процедуры, но я хочу, чтобы скрипт создал его по другой схеме.

У меня есть пример того, что я сейчас пытаюсь сделать ниже. Если я иду в совершенно неправильном направлении, пожалуйста, укажите мне правильное направление. Я хочу избегать любого поиска и замены строк, так как это имеет много потенциальных опасностей.

Я пытался создать функциональный объект из существующей функции в базе данных, затем я создаю новую и пытаюсь сделать ее копией только что созданной. Это казалось необходимым, чтобы позволить мне изменить схему, поскольку она должна быть в памяти и не привязана к базе данных. Затем я пытаюсь изменить схему и написать ее. К сожалению, мне не удалось найти синтаксис для .Script, который не завершается с ошибкой в ​​PowerShell.

$instance = $args[0]    # Gets the instance name from the command line parameters
$database = $args[1]    # Gets the database name from the command line parameters

# Import the SMO assembly
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null

# Create an instance for the SQL Server
$serverInstance = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $instance

# Create an instance for the Database
$databaseInstance = $serverInstance.Databases[$database]

# Loop through all of the user defined functions (that are not system objects) in the database
foreach ($function in $databaseInstance.UserDefinedFunctions | Where-Object {$_.IsSystemObject -eq $False})
{
    $newFunction = New-Object ('Microsoft.SqlServer.Management.Smo.UserDefinedFunction') ($databaseInstance, $function.Name, "tnf_dbo_func")

    $newFunction.TextHeader = $function.TextHeader
    $newFunction.TextBody = $function.TextBody

    $newFunction.TextMode = $False
    $newFunction.ChangeSchema("tnf_dbo_func")
    $newFunction.TextMode = $True

    Write-Host $newFunction.Schema
    Write-Host $newFunction.TextHeader
    Write-Host $newFunction.TextBody
    $newFunction.Script()
}

1 Ответ

3 голосов
/ 12 мая 2010

Когда я набрал свой вопрос, я понял, что настройки .TextMode были установлены в другом решении, которое я пробовал. Удаление тех решило проблему. Поскольку вопрос уже был напечатан, я решил опубликовать его в любом случае, если это поможет кому-то еще.

Исправленный код:

$instance = $args[0]    # Gets the instance name from the command line parameters
$database = $args[1]    # Gets the database name from the command line parameters

# Import the SMO assembly
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null

# Create an instance for the SQL Server
$serverInstance = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $instance

# Create an instance for the Database
$databaseInstance = $serverInstance.Databases[$database]

# Loop through all of the user defined functions (that are not system objects) in the database
foreach ($function in $databaseInstance.UserDefinedFunctions | Where-Object {$_.IsSystemObject -eq $False})
{
    $newFunction = New-Object ('Microsoft.SqlServer.Management.Smo.UserDefinedFunction') ($databaseInstance, $function.Name, "tnf_dbo_func")

    $newFunction.TextHeader = $function.TextHeader
    $newFunction.TextBody = $function.TextBody

    $newFunction.ChangeSchema("tnf_dbo_func")

    Write-Host $newFunction.Schema
    Write-Host $newFunction.TextHeader
    Write-Host $newFunction.TextBody
    $newFunction.Script()
}
...