DBATOOLS - копировать данные из таблицы и создавать в базе данных назначения

Связанные с DbaTools - https://dbatools.io/functions/

Здравствуйте, я пытаюсь найти решение, чтобы скопировать таблицу и создать ее на -Destination / -DestinationDatabase, пожалуйста.

Я использую:

Get-DbaTable -SqlInstance "Machine1" -Database DBA -Table "Table01" | Copy-DbaTableData -Destination "Machine2\PANDA" -DestinationDatabase PANDA01 -DestinationTable "Table01"

Но так как таблица не создана в месте назначения, я получаю сообщение об ошибке:

ВНИМАНИЕ: [15:25:58][Copy-DbaTableData] Table01 не существует в месте назначения

Можно ли как-нибудь скопировать и создать таблицу в DestinationDatabase, пожалуйста?

1 ответ

Решение

Это то, что я использовал для аналогичной задачи -

# Configuration for scripting options: Which related objects should also be scripted? 
$so = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions; 
$so.DriAllConstraints = $true; 
$so.DriAllKeys = $true;
$so.DriClustered = $true; 
$so.DriDefaults = $true; 
$so.DriIndexes = $true; 
$so.DriNonClustered = $true; 
$so.DriPrimaryKey = $true; 
$so.DriUniqueKeys = $true; 
$so.AnsiFile = $true; 
$so.ClusteredIndexes  = $true; 
$so.IncludeHeaders = $true; 
$so.Indexes = $true; 
$so.SchemaQualify = $true; 
$so.Triggers = $true; 
$so.XmlIndexes = $true; 

#Hard-Coding the Server and database info
$SourceServer = "SourceServer"
$SourceDatabase = "SourceDatabase"
$TargetServer = "TargetServer"
$TargetDatabase = "TargetDatabase"


#Creating folders for storing Create_Database text files if they don't exist
If(!(Test-Path E:\ScriptDatabases)) 
{
    New-Item -ItemType Directory -Force -Path E:\ScriptDatabases
}

#Creating the database connection object for Source server
$Srcsrv = new-Object Microsoft.SqlServer.Management.Smo.Server($Sourceserver);
$Srcdb = New-Object Microsoft.SqlServer.Management.Smo.Database;
$Srcdb = $Srcsrv.Databases.Item($SourceDatabase);

#Creating the database connection object for Destination server
$Destsrv = new-Object Microsoft.SqlServer.Management.Smo.Server($TargetServer);
$Destdb = New-Object Microsoft.SqlServer.Management.Smo.Database;
$Destdb = $Destsrv.Databases.Item($TargetDatabase);

foreach ($table in $Srcdb.Tables)
{
    $table.Script($so) | Out-File -FilePath E:\ScriptDatabases\$($table.Name).txt
    $CreatedbQuery = Get-Content E:\ScriptDatabases\$($table.Name).txt | Out-String
    Invoke-sqlcmd -Query $CreatedbQuery -Database $TargetDatabase -server $TargetServer
}

Вышеприведенный сценарий выведет все таблицы из исходной базы данных в текстовые файлы, а затем прочитает их из текстовых файлов и создаст таблицы в целевой базе данных и целевом сервере. Несколько вещей, чтобы иметь в виду -

  1. Сценарий требует наличия базы данных на целевом сервере. Если нет, скрипт завершится неудачно. Поэтому создайте целевые базы данных перед выполнением этого.
  2. Если в вашей базе данных есть другие схемы, кроме dboЗатем вам нужно сначала создать эти схемы. В противном случае ваши таблицы для других схем не будут созданы.
  3. Для получения списка параметров сценариев вы можете обратиться к этой ссылке msdn, где вы можете установить параметры сценариев как $true или же $false для объектов базы данных согласно вашему требованию.

Вы могли бы иметь это Get-DbaTable -SqlInstance "Machine1" -Database DBA -Table "Table01" | Copy-DbaTableData -Destination "Machine2\PANDA" -DestinationDatabase PANDA01 -DestinationTable "Table01" запустите после создания таблиц, или вы можете выполнить цикл в сценарии после самого создания таблиц, чтобы создание таблиц и загрузка данных в таблицы происходили одновременно. Это полностью ваш выбор, и я оставляю это на ваше усмотрение. Надеюсь это поможет!

Другие вопросы по тегам