Microsoft.SqlServer.Management.Smo.Transfer class - PullRequest
2 голосов
/ 18 июня 2010

Я пытаюсь скопировать sql db между серверами, используя класс Smo.Transfer.

И это нормально, когда вы копируете абсолютно обычную базу данных.Это работает.

Но что, если ваши данные противоречивы?Например, у меня есть функция, и она получает значение из таблицы и несуществующего столбца (кто-то переименовал столбец, и теперь функция не будет работать).Но если вы попытаетесь сгенерировать скрипт, он будет сгенерирован нормально.

Но проблема начинается, когда вы на самом деле пытаетесь запустить этот скрипт.Сервер Sql не позволит вам создать функцию, поскольку он не может ссылаться на несуществующий столбец.

Нечто подобное происходит с классом Transfer, когда вы фактически запускаете метод .TransferData ().* Вопросы есть.Можно ли как-то вообще пропустить создание объекта (в нашем примере - функции)?

Как отловить ошибку, пропустить объект и позволить методу .TransferData () продолжить работу?

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Я бы сначала воспользовался подходом к исправлению нарушенных зависимостей. Тогда я выбрал бы подход, разработанный для предотвращения разрыва этих зависимостей в будущем. В результате ваш код передачи начнет работать, и, вероятно, другой код или взаимодействие с кодом БД также будет работать лучше.

Чтобы сделать все это, вам нужно знать о нарушенных зависимостях. У меня где-то здесь что-то есть. Если я найду это, я отправлю назад. Я думаю, может быть RedGate Dependency Tracker 2? Как я помню, он все еще не был в «зоне» для меня настолько полезен, но все же мог бы сделать эту работу за вас.

0 голосов
/ 29 февраля 2016

Невозможно предотвратить остановку метода TransferData при первой ошибке.Тем не менее, есть обходной путь.Вместо этого вы можете сгенерировать сценарий sql и выполнить его немедленно - в этом сценарии вы можете заставить его продолжить работу при ошибке:

$Transfer.Options.ScriptBatchTerminator = $true
$ScriptFileName = $PSScriptRoot + '\\' + $DbName + '.sql'
$Transfer.Options.FileName = $ScriptFileName
$Transfer.Options.ToFileOnly = $true
$Transfer.EnumScriptTransfer()

Invoke-SqlCmd -InputFile $ScriptFileName -ServerInstance $SQLInstanceName -Database $TargetDbName -ErrorAction Continue

Просто не забудьте установить для Options.ScriptBatchTerminator значение true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...