2015-07-02 3 views
1

Мне нужно сравнить и синхронизировать несколько схем базы данных MySQL. Мне не нужно синхронизировать данные. Любые отличия отсутствовали бы в таблицах или полях в старых схемах.Сравнение нескольких схем

Я могу написать VBA для этого. Я имел в виду следующие действия:

SHOW TABLES 
for each table 
    SHOW CREATE TABLE {tablename} 
    Compare this to each other schema 
    If table doesn't exist, then create it. 
    If it does exist but different then do a DESCRIBE TABLE TO GET THE FIELDS 
     Loop though each field to find missing one then do an ALTER TABLE to add it 

В настоящее время есть 54 DBs с 106 таблицами каждый.

Поскольку новейшая БД будет иметь текущую схему, мне придется сравнивать ее только с БД. Что я хочу знать, если я делаю это самым эффективным способом. Или есть лучший способ? Сторонние инструменты также являются опцией, если они могут быть автоматизированы.

Благодаря

В случае, если вы хотите знать некоторые фон:
Каждых базы данных стоит месячного биллинговых данных, что мой клиент делает сложный анализ. Анализ выполняется в MS Access с большим количеством запросов и VBA. Доступ прилагается к 1 месяцу за раз и имеет код для переключения месяцев по мере необходимости.

Схемы могут выйти из синхронизации, когда мой клиент добавляет таблицу или поле в новую БД, чтобы помочь в его анализе. Когда он это делает, он вручную делает те же самые моды в предыдущих БД (предыдущие БД все еще используются месяцы и даже годы спустя), но иногда пропускает один, плюс это требует много времени.

+0

Любые внешние ключи между столами? –

+0

Хороший вопрос. Нет, нет. Тем не менее, множество индексов. –

ответ

0

Для проекта мне пришлось проанализировать структуру баз данных Access. То, как я пошел, заключалось в том, чтобы экспортировать определения в CSV-файл из каждого БД доступа, прочитать это в другой БД доступа и использовать БД-штырь для анализа таблиц и запросов. Я предоставляю вам процедуру экспорта. Если вам нужно больше, разместите комментарий. Общая кодовая база довольно полезна. Базы данных могут иметь ссылки на другие базы данных Access (связанные таблицы и запросы).

Подпрограмма 'listDBdef()' создает текстовый файл в каталоге базы данных с базовым именем базы данных, за которым следует '_dbdef.txt', например. 'MYDB_2015_04_dbdef.txt.

Public Sub listDBdef() 
Dim dbs As Database 
Dim tbl As TableDef 
Dim fld As Field 
Dim FileName As String 
Dim i, j, sVersion 

    sVersion = UCase(InputBox("Enter version", "Export definitions")) 
    If (sVersion = "") Then Exit Sub 

    Set dbs = CurrentDb 
    FileName = Mid(dbs.Name, 1, InStrRev(dbs.Name, ".") - 1) + "_" + sVersion + "_dbdef.txt" 

    Open FileName For Output As #1 
    Set dbs = CurrentDb 
    With dbs 
     Print #1, sVersion 
     Print #1, dbs.Name 
     ' List all tables and their link, target table and fields ' 
     For i = 0 To dbs.TableDefs.Count - 1 
      Set tbl = dbs.TableDefs(i) 
      If (Mid(tbl.Name, 1, 4) <> "MSys") Then 
       Print #1, "Table: """ + tbl.Name + """ {" 
       If (tbl.Connect <> "") Then 
        Print #1, Chr(9) + "Link: """ + Mid(tbl.Connect, Len(";DATABASE= ")) + """," + IIf(tbl.Fields.Count > 0, "1", "0") + " {" 
        Print #1, Chr(9) + Chr(9) + "Table: """ + tbl.SourceTableName + """" 
        Print #1, Chr(9) + "}" 
       End If 
       For j = 0 To tbl.Fields.Count - 1 
        Set fld = tbl.Fields(j) 
        Print #1, Chr(9) + "Field: """ + fld.Name + """" 
       Next j 
       If (tbl.Fields.Count > 0) Then 
        Print #1, Chr(9) + "Records: " + Trim(Str(tbl.RecordCount)) 
       End If 
       Print #1, "}" 
      End If 
     Next i 

    End With 
    Close #1 
    MsgBox "Ready." 
End Sub 

Вы должны создать модуль с этим кодом в каждой базе данных вы хотите проанализировать; возможно, можно подключиться к базе данных и запросить ее.