Миграция MySQL - баз в MS SQL с помощью проекта MS ACEESS

7bvg
Дата: 08.01.2012 18:17:42
Задача: Исходная база в MySQL - оболочка в MS ACCESS, нужно перенести корректно со всеми индексами на MS SQL 2008R2
Решил вот так (может кому пригодится):
1 Этап: Создаем проект MS ACCESS. (БАЗА.adp) Импортируем в него через подключение ODBC таблицы MySQL. При этом все счетчики ключевых полей "слетают". Вот с этим и надо бороться.
2. Создаем форму с кнопкой, которой приписываем такой код:
Dim Данные As ADODB.Recordset
Dim ОбъектыБазы As AccessObject, База As Object
Dim Таблица As String, КоличествоТаблиц As Integer
Dim Столбец() As String ' Массив под имена столбцов
Dim ПараметрСтолбца() As Integer ' Массив под длину текстового поля
Dim Тип() As Integer ' Массив под тип поля
Dim ТипПоля As String
Dim КоличествоСтолбцов As Integer, Этап As Integer
Dim Строка As String, ПереченьСтолбцов As String, ЕстьИндентифкатор As Integer

Set База = Application.CurrentData 'Указание на то, что мы в текущей базе
КоличествоТаблиц = 0 ' Счетчик таблиц
Этап = 0 ' Счетчик преобразований
For Each ОбъектыБазы In База.AllTables 'Определение количества таблиц
КоличествоТаблиц = КоличествоТаблиц + 1 'Все это - для "украшетельства":
Next ОбъектыБазы ' для статусной строки в правой части экрана

SysCmd acSysCmdInitMeter, "Импорт", КоличествоТаблиц ' установка для статусной строки
For Each ОбъектыБазы In База.AllTables ' Пошли гулять по списку таблиц
Таблица = ОбъектыБазы.Name ' Имя текущей таблицы

Этап = Этап + 1 ' Счетчик статусной строки
SysCmd acSysCmdUpdateMeter, Этап ' Индикация в статусной строке - см. правый угол экрана
Set Данные = New ADODB.Recordset ' "Разборки с текущей таблицей"
With Данные
.Open " SELECT " & Таблица & ".* FROM " & Таблица & "", CurrentProject.Connection
КоличествоСтолбцов = .Fields.Count ' Посчитали количество столбцов
ReDim Столбец(.Fields.Count) ' Переопределили размер массива под имена столбцов
ReDim Тип(.Fields.Count) ' Переопределили размер массива, где хранятся Типы данных столбцов таблицы
ReDim ПараметрСтолбца(.Fields.Count) ' Переопределили размер массива, где хранятся размеры текстового столбца таблицы
For Счетчик = 0 To .Fields.Count - 1 'Собираем в массивы данные по столбацм таблицы
Столбец(Счетчик) = .Fields(Счетчик).Name
Тип(Счетчик) = .Fields(Счетчик).Type
If Тип(Счетчик) = 202 Then ' Если тип поля NVARCHAR - считываем его длину
ПараметрСтолбца(Счетчик) = .Fields(Счетчик).DefinedSize
End If
Next
Счетчик = 0
End With
Set Данные = Nothing

' Создаем строки для функции создания таблицы CREATE TABLE и Вставки в таблицу INSERT INTO
Строка = ""
ПереченьСтолбцов = ""
For Счетчик = 0 To КоличествоСтолбцов - 1
Select Case Тип(Счетчик) ' Определяем нужные нам типы данных создаваемой таблицы
Case 3
ТипПоля = " INT"
Case 4, 131
ТипПоля = " REAL"
Case 5
ТипПоля = " FLOAT"
Case 202
ТипПоля = " NVARCHAR (" & ПараметрСтолбца(Счетчик) & ")"
Case 203
ТипПоля = " NTEXT"
Case 7, 135
ТипПоля = " DATETIME"
Case 11, 2
ТипПоля = " BIT"
Case Else
End Select

If Счетчик = 0 And Строка = "" Then ' Устанваливаем параметры первого ключевого столбца таблицы
If Тип(0) = 3 Then
Строка = Столбец(0) & " INT NOT NULL IDENTITY PRIMARY KEY" ' Считаем, что если первое поле было INT, то на нужен счетчик (IDENTITY)
ЕстьИндентифкатор = 1
Else
Строка = Столбец(0) & ТипПоля & " NOT NULL PRIMARY KEY"
ЕстьИндентифкатор = 0
End If
ПереченьСтолбцов = Столбец(0)
Else
Строка = Строка & "," & Столбец(Счетчик) & ТипПоля ' Вот строка для CREATE TABLE
ПереченьСтолбцов = ПереченьСтолбцов & "," & Столбец(Счетчик) ' Вот строка для INSERT INTO
End If
Next

Set Данные = New ADODB.Recordset
With Данные
.Open " CREATE TABLE TEMP (" & Строка & ")", CurrentProject.Connection ' Создаем временную таблицу - близнец
If ЕстьИндентифкатор = 1 Then ' Если первое поле счетчик - врменно отключаем его
.Open " SET IDENTITY_INSERT TEMP ON ", CurrentProject.Connection
End If
' Загружаем во временную таблицу данные из исходной
.Open " INSERT INTO TEMP (" & ПереченьСтолбцов & ") " & _
" SELECT " & Таблица & ".* FROM " & Таблица & "", CurrentProject.Connection
If ЕстьИндентифкатор = 1 Then ' Возвращаем счетчик
.Open " SET IDENTITY_INSERT TEMP OFF ", CurrentProject.Connection
End If
.Open " DROP TABLE " & Таблица & " ", CurrentProject.Connection ' Прощаемся с таблицей MySQL
.Open " EXEC sp_rename 'TEMP', '" & Таблица & "'", CurrentProject.Connection ' Перименовываем новую временную таблицу под сохраненным заранее именем
End With
Set Данные = Nothing
Строка = ""
Next ОбъектыБазы ' Пошли разбираться со следующей таблицей
SysCmd acSysCmdRemoveMeter
MsgBox ("Завершено таблицей: " & Таблица) ' Все закончилось
' Примечание: Все это: CREATE TABLE, DROP, INSERT INTO по одной причине - в функции ALTER TABLE MS SQL не создать счетчик -
' функция IDENTITY не работает

Извиняюсь, что коряво написано, но работает
:-Q
Дата: 09.01.2012 13:24:14
Таких задач не решал, но вдруг кому пригодится.

До кучи: http://www.microsoft.com/download/en/details.aspx?id=26712