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
}
Вышеприведенный сценарий выведет все таблицы из исходной базы данных в текстовые файлы, а затем прочитает их из текстовых файлов и создаст таблицы в целевой базе данных и целевом сервере. Несколько вещей, чтобы иметь в виду -
- Сценарий требует наличия базы данных на целевом сервере. Если нет, скрипт завершится неудачно. Поэтому создайте целевые базы данных перед выполнением этого.
- Если в вашей базе данных есть другие схемы, кроме
dbo
Затем вам нужно сначала создать эти схемы. В противном случае ваши таблицы для других схем не будут созданы. - Для получения списка параметров сценариев вы можете обратиться к этой ссылке msdn, где вы можете установить параметры сценариев как
$true
или же$false
для объектов базы данных согласно вашему требованию.
Вы могли бы иметь это Get-DbaTable -SqlInstance "Machine1" -Database DBA -Table "Table01" | Copy-DbaTableData -Destination "Machine2\PANDA" -DestinationDatabase PANDA01 -DestinationTable "Table01"
запустите после создания таблиц, или вы можете выполнить цикл в сценарии после самого создания таблиц, чтобы создание таблиц и загрузка данных в таблицы происходили одновременно. Это полностью ваш выбор, и я оставляю это на ваше усмотрение. Надеюсь это поможет!