LEADERSOFT.ru Разработка на заказ программ и сайтов
ЕСЛИ БАЗА ВАМ НУЖНА В ЛИДЕРСОФТ ЗАЙДИ СПЕРВА!
Список всех статей ... Подписка на новости (рассылка через subscribe.ru)




































Выпуск 53. Сравнение баз данных Microsoft SQL Server

Подписка:    "Microsoft Access - программирование и готовые решения"
Дата:             29.12.2006
Сайт:             http://www.leadersoft.ru
Описание Дается задача для удаленного выполнения работы (аутсорсинг).
Источник
:    http://www.leadersoft.ru/russian/help/subscribe/sub53.htm
Автор:          Виктор Конюков
 

С Новым Годом и Рождеством
   Искренне, от всей души поздравляю Вас с наступающим Новым Годом и Рождеством. Желаю всем Вам и Вашим близким счастья, крепкого здоровья и благополучия. 

Введение в тему  
    Задача сравнения баз данных Microsoft SQL Server является достаточно актуальной. Предположим Вы разрабатываете adp проект на Access, используя SQL Server на своем компьютере, и Вам надо перенести базу данных на другой компьютер. Первый раз это легко сделать (используя backup файла), но что делать, если кто-то уже работает с базой данных. Например, вводит данные в базу данных, тогда этот вариант "отпадает"
    Выход только один. Надо провести сравнение баз данных и добавить отсутствующие таблицы, поля, индексы в базу данных. Конечно есть много серьезных разработок на эту тему. Например, у
Microsoft SQL Server Enterprise Manager есть функции репликации, т.е. путем создания публикаций и подписчиков синхронизовать базы данных. Но может быть и так, что Вы не будете иметь полный доступ к удаленному серверу и такой вариант тоже будет "отброшен" (этот вариант добавляет поля репликации в базу данных). Неплохой вариант - это создание sql скрипта и его выполнение на SQL сервере для конкретной базы. Но и у такого способа есть недостатки - это отдельная программа, потребует дополнительного изучения, финансовых затрат, и самое главное, что ее невозможно вставить в VBA программу (кроме sql скрипта).
   Что делать, если нужно добавить в базу данных всего несколько таблиц, полей и индексов. Попробуем решить эту задачу средствами
VBA. Ниже дается описание УПРОЩЕННОГО класса на VBA, который создает необходимые таблицы и поля. Адрес загрузки: http://www.leadersoft.ru/russian/download/freeware/CompareSQL.zip
   И так и Вы можете просто прочитать этот материал и положить "в корзину" или попытаться понять проблему более детально и найти более полное решение. Для того, чтобы было интересно выполнять задачу, она разделена на пункты и оплачивается через webmoney.ru. И так успехов Вам в этом решении.

Задача для удаленного выполнения. Бюджет 600 рублей
    Необходимо доработать данные класс для сравнения баз данных по 3 направлениям.
а) Нужно сравнить 2 базы данных, записать различия в таблицу и создать отчет для печати (300 рублей)
б) Добавить
/изменить в указанной базе данных недостающие таблицы, процедуры и представления (300 рублей)
   Свои заявки для участия в этой работе высылайте по адресу: support@leadersoft.ru

Описание класса для сравнения
     В примере используются в 2 базы данных: test1 и test2. Их надо создать вручную и разместить на SQL сервере. Базы данных могут быть созданы и в различных версия Microsoft SQL Server: MSDE, 2000, 2005, Express 2005. Это непринципиально. Класс получается достаточно простой. Открываем два каталога баз данных и начинаем выполнять сравнение и модификацию.

'--- Начало --
' Переменные 1 - шаблон, 2 - модифицированная база данных
Private adoxCat1 As ADOX.Catalog ' Первый каталог
Private adoxCat2 As ADOX.Catalog ' Второй каталог
Private adoxTbl1 As ADOX.Table
Private adoxTbl2 As ADOX.Table
Private adoxCol1 As ADOX.Column
Private adoxCol2 As ADOX.Column
Private adoxIdx1 As ADOX.Index
Private adoxIdx2 As ADOX.Index

' Функция создания каталога
Public Function fcCreateCatalog(strConnection1 As String, strConnection2 As String) As Long
Set adoxCat1 = New ADOX.Catalog
Set adoxCat2 = New ADOX.Catalog
adoxCat1.ActiveConnection = strConnection1
adoxCat2.ActiveConnection = strConnection2
End Function

' Сравниваем объекты
Public Function fcCompareObjects(Optional strType)
fсAdoxCreateObjects ' Сравниваем все объекты
End Function

' Закрываем каталоги
Public Function fcCloseCatalog() As Boolean
On Error GoTo 999
' Освобождаем память
adoxCat1.ActiveConnection.Close
adoxCat2.ActiveConnection.Close
Set adoxCat1 = Nothing
Set adoxCat2 = Nothing
fcCloseCatalog = True
Exit Function
999:
fcCloseCatalog = False
Err.Clear
End Function

' Закрываем класс
Private Sub Class_Terminate()
fcCloseCatalog
End Sub

Public Sub fсAdoxCreateObjects()
fсAdoxCreateTables ' Ссоздание таблиц
End Sub

' Перебираем все таблицы
Public Function fсAdoxCreateTables()
On Error GoTo 999
For Each adoxTbl1 In adoxCat1.Tables
If adoxTbl1.TYPE = "TABLE" Then fсAdoxCreateTable
Next
Exit Function
999:
MsgBox Err.Description
Err.Clear
Exit Function
End Function

' Создание таблицы
Public Function fсAdoxCreateTable() As Boolean
Dim adoxCol As ADOX.Column
On Error GoTo 999
If fсAdoxFindTable(adoxTbl1.Name) = True Then
' Для тестирования новых таблиц снимите комментарий ниже
' adoxCat2.Tables.Delete adoxTbl1.Name ' Удаляем таблицу
Else
Set adoxTbl2 = New ADOX.Table
With adoxTbl2
.Name = adoxTbl1.Name 'имя создаваемой таблицы
.ParentCatalog = adoxCat2
fсAdoxCreateTableColumns
fсAdoxCreateTableIndexes
End With
adoxCat2.Tables.Append adoxTbl2 'добавляем таблицу в БД
End If
Set adoxTbl2 = Nothing
Exit Function
999:
MsgBox Err.Description
Err.Clear
Exit Function
End Function

' Создание полей таблицы
Public Function fсAdoxCreateTableColumns() As Boolean
On Error GoTo 999
For Each adoxCol1 In adoxTbl1.Columns
adoxTbl2.Columns.Append adoxCol1.Name, adoxCol1.TYPE, adoxCol1.DefinedSize
Next
Exit Function
999:
MsgBox Err.Description
Err.Clear
Exit Function
End Function

' Создание индексов таблицы
Public Function fсAdoxCreateTableIndexes() As Boolean
Dim Col As ADOX.Column
On Error GoTo 999
For Each adoxIdx1 In adoxTbl1.Indexes
Set adoxIdx2 = New ADOX.Index
adoxIdx2.Name = adoxIdx1.Name
For Each Col In adoxIdx1.Columns
adoxIdx2.Columns.Append Col.Name
Next
adoxIdx2.PrimaryKey = adoxIdx1.PrimaryKey
adoxIdx2.UNIQUE = adoxIdx1.UNIQUE
adoxTbl2.Indexes.Append adoxIdx2
Next
Exit Function
999:
MsgBox Err.Description
Err.Clear
Exit Function
End Function


' Находим в каталоге нужную таблицу
Public Function fсAdoxFindTable(strName As String) As Boolean
Dim adoxTbl As ADOX.Table
On Error GoTo 999
fсAdoxFindTable = False
For Each adoxTbl In adoxCat2.Tables
If adoxTbl.Name = strName Then
fсAdoxFindTable = True
Exit Function
End If
Next
Exit Function
999:
MsgBox Err.Description
Err.Clear
Exit Function
End Function
'--- Конец класса ---