318  /  331

Перенос данных с помощью PowerShell

Просмотров: 1043 (Статистика ведётся с 06.02.2017)

Если у клиента нет Visual Studio или он по каким-либо причинам не может установить ее Express-редакцию, ниже приводится вариация скрипта, мигрирующего базу «1С-Битрикс: Управление сайтом» на языке сценариев PowerShell:

cls

function DisEnableFKConstraints([bool] $switchOff)
{
        [string] $prefix; if ($switchOff) { $prefix = "От" } else { $prefix = "В" };
        Write-Host ($prefix + "ключение FK-ограничений...")
		[System.Data.SqlClient.SqlDataReader] $sdr = (
                     New-Object System.Data.SqlClient.SqlCommand("select name, object_name(parent_object_id) from sys.foreign_keys",
                     $sqlSrvCnn)).ExecuteReader()
		while ($sdr.Read())
        {
            [string] $fkName = $sdr.GetString(0); [string] $tblName = $sdr.GetString(1)
			[string] $prefix1 = ""; if ($switchOff) {$prefix1 = "no"}
			[string] $cmdText = "alter table {0} {1}check constraint {2}" -f $tblName,  $prefix1, $fkName
            (New-Object System.Data.SqlClient.SqlCommand($cmdText, $sqlSrvCnn)).ExecuteNonQuery() 
            Write-Host ("{0}ключено ограничение {1} в таблице {2}" -f $prefix, $fkName, $tblName)
        }
        $sdr.Close();
        Write-Host ($prefix + "ключение FK-ограничений завершено.")
}

function CleanDestTablesInSQLSrvDB([System.Data.DataTable] $tblList)
{
    Write-Host "Очистка таблиц назначения..."
    foreach ($r in $tblList.Rows)
    {
        [string] $cmdText = "delete " + $r[0]
		(New-Object System.Data.SqlClient.SqlCommand($cmdText, $sqlSrvCnn)).ExecuteNonQuery()
        Write-Host ("Очищена таблица " + $r[0])
    }
    Write-Host "Очистка закончена."
}

function TransferData([System.Data.DataTable] $tblList)
{
    Write-Host "Загрузка данных..."
    foreach ($r in $tblList.Rows)
    {
        CopyDataFromMySQLTblToCorrespondingSQLSrvTbl($r[0]) 
        Write-Host ("Перенесена таблица " + $r[0])
    }
    Write-Host "Загрузка завершена."
}

function CopyDataFromMySQLTblToCorrespondingSQLSrvTbl([string] $tblName)
{
    [System.Data.SqlClient.SqlCommand] $sqlSrvCmd = $sqlSrvCnn.CreateCommand() 
	$sqlSrvCmd.CommandText = "select name from sys.columns where object_id = object_id(@tblName) order by column_id"
    $sqlSrvCmd.Parameters.AddWithValue("@tblName", $tblName) 
	[System.Data.SqlClient.SqlDataReader] $sqlSrvRdr = $sqlSrvCmd.ExecuteReader() 
    [System.Text.StringBuilder] $mySqlCmdText = New-Object System.Text.StringBuilder("select ")
    while ($sqlSrvRdr.Read()) { $mySqlCmdText.Append("``" + $sqlSrvRdr.GetSqlString(0) + "``,") } 
    $sqlSrvRdr.Close()
    $mySqlCmdText.Remove($mySqlCmdText.Length - 1, 1) 
    $mySqlCmdText.Append(" from " + $tblName) 
	[MySql.Data.MySqlClient.MySqlCommand] 
    $mySqlCmd = New-Object MySql.Data.MySqlClient.MySqlCommand($mySqlCmdText.ToString(), $mySqlCnn);
    [MySql.Data.MySqlClient.MySqlDataReader] $mySqlRdr = $mySqlCmd.ExecuteReader()

    [System.Data.SqlClient.SqlBulkCopy] $bcp = New-Object System.Data.SqlClient.SqlBulkCopy(
                     $sqlSrvCnn, [System.Data.SqlClient.SqlBulkCopyOptions]::KeepIdentity, $null)
    $bcp.DestinationTableName = $tblName
    $bcp.WriteToServer($mySqlRdr) 
	$bcp.Close()

    $mySqlRdr.Close() 
}
########################################### MAIN ###############################################

[System.Data.SqlClient.SqlConnection] 
$sqlSrvCnn = New-Object System.Data.SqlClient.SqlConnection(
                     "server=(local)\SQLExpress;database=bitrix;trusted_connection=true;MultipleActiveResultSets=true")
$sqlSrvCnn.Open()
[void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data")
[MySql.Data.MySqlClient.MySqlConnection] 
$mySqlCnn = New-Object MySql.Data.MySqlClient.MySqlConnection(
                     "server=127.0.0.1;port=31006;uid=root;pwd=;database=bsm_demo;Pooling=False")
$mySqlCnn.Open()

$mySqlRdr = (New-Object MySql.Data.MySqlClient.MySqlCommand("show tables;", $mySqlCnn)).ExecuteReader()
[System.Data.DataTable] $tblList = New-Object System.Data.DataTable
$tblList.Load($mySqlRdr)
$mySqlRdr.Close()

DisEnableFKConstraints $true | Out-Null
CleanDestTablesInSQLSrvDB $tblList 
TransferData $tblList | Out-Null
DisEnableFKConstraints $false | Out-Null

$sqlSrvCnn.Close()
$mySqlCnn.Close()
2
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии