Реплікація бази даних, MS Office, Програмні керівництва, статті













Варіанти рішення 
Для роботи з базами даних Access (. Mdb) була розроблена модель, яка отримала назву Microsoft ® Jet and Replication Objects (JRO). У цій статті ми розглянемо, як за допомогою JRO зробити базу даних реплицируемой, навчимося створювати різні типи реплік, а також синхронізувати їх між собою.

Перший крок – Зробимо базу реплицируемой. Функція для цього може виглядати так:

Private Function MakeRecordLevelDesignMaster(strDBPath As String)
Dim repMaster As New JRO.Replica “визначаємо змінну з якої надалі будемо робити всі дії
repMaster.MakeReplicable strDBPath, False “робимо базу даних реплицируемой
Set repMaster = Nothing “видаляємо змінну з пам’яті
End Function
Метод MakeReplicable([ ConnectString ] [, ColumnTracking ])має два параметри. Перший – це шлях до бази даних, яку ми робимо реплицируемой. Другий параметр розглянемо докладніше. Він може приймати два значення True (по-замовчуванню) або False. В нашому прикладі встановлено значення False. Це означає, що при синхронізації реплік конфлікти будуть відслідковуватися на рівні запису. Якщо встановлено значення True, то конфлікти будуть відслідковуватися на рівні стовпця. Наприклад, два користувача в різних репліках змінюють різні поля запису. Якщо значення параметра встановлено False (рівень запису), то при синхронізації виникне конфлікт. Хоча насправді конфлікту немає, адже дані різних стовпців не пов’язані між собою. Уникнути такого конфлікту можна встановивши значення параметра True (рівень шпальти). Тоді конфлікт при синхронізації виникне тільки в тому випадку, якщо обидва користувачі змінять один і той же стовпець однієї і тієї ж записи. Таким чином, використання відстеження конфліктів на рівні стовпця дозволяє провести синхронізацію з найменшим кількістю помилок, хоча й додасть системі трохи роботи. Можливість відстеження конфліктів на рівні стовпця є тільки в JRO, в DAO її немає. Це треба врахувати при проектуванні бази даних.

За замовчуванням, всі об’єкти бази робляться реплицируемой, тобто при синхронізації будуть оновлюватися дані у всіх таблицях. Якщо ви хочете, щоб об’єкт бази даних був локальним (при синхронізації дані не оновлюються), треба поставити йому це властивість до оголошення бази реплицируемой. Це можна зробити так:


Private Function KeepObjectLocal(strDBPath As String, strObjectName As String, strObjectType As String)
Dim repMaster As New JRO.Replica “визначаємо змінну з якої надалі будемо робити всі дії

repMaster.ActiveConnection = strDBPath “Зв’язуємо змінну з базою даних
repMaster.SetObjectReplicability strObjectName, strObjectType, False “робимо об’єкт strObjectName, який має тип strObjectType локальним (False) або реплицируемой (True)

Set repMaster = Nothing “видаляємо змінну з пам’яті
End Function


Приклад виклику функції Call KeepObjectLocal (“C:<Шлях до бази даних> “,” Клієнти “,” Tables“)


Другий крок – Створення репліки. Для створення репліки використовуємо метод CreateReplica.
Function MakeNewReplica(strReplicableDBPath As String, strDescription As String) As Integer
Dim repReplicableDB As New JRO.Replica “визначаємо змінну з якої надалі будемо робити всі дії
Dim strNewReplicaDBPath As String “визначаємо змінну – ім’я нової репліки

   strNewReplicaDBPath = “C:<Шлях до бази даних> ““Отримуємо ім’я нової репліки
repReplicableDB.ActiveConnection = strReplicableDBPath “Зв’язуємо змінну з базою даних
repReplicableDB.CreateReplica strNewReplicaDBPath, strDescription, jrRepTypeFull, jrRepVisibilityGlobal “Створюємо репліку
Set repReplicableDB = Nothing “Видаляємо змінну з пам’яті
End Function


Метод CreateReplica ( ReplicaName , Description [, ReplicaType ] [, Visibility ]  [, Priority ] [, Updatability ]) має такі параметри:


1. ReplicaName – Шлях і ім’я нової репліки


2. Description – Опис репліки


3. ReplicaType – Тип репліки. У нашому прикладі jrRepTypeFull – повна репліка. (Не обов’язковий параметр)


4. Visibility – Видимість репліки. У нашому прикладі jrRepVisibilityGlobal – глобальна репліка, тобто в репліці “видно” всі дані з головної репліки (не обов’язковий параметр)


5. Priority – Пріоритет репліки. У нашому прикладі цей параметр опущений. Це означає, що пріоритет надається автоматично. (Не обов’язковий параметр)


6. Updatability – Показує чи дозволяється користувачам міняти схему і записи реплицируемой об’єктів репліки. У нашому прикладі параметр опущений. Це означає, що дозволяються зміни. (Не обов’язковий параметр).


Давайте розглянемо які ще значення можуть приймати параметри методу CreateReplica.


ReplicaType може приймати значення















jrRepTypeNotReplicable  За замовчуванням. База даних не реплицируемой.
jrRepTypeDesignMaster  Репліка – власник проекту.
jrRepTypeFull  Повна репліка.
jrRepTypePartial  Часткова репліка.

При створенні повної репліки імпортуються всі дані з реплицируемой об’єктів головною репліки. При створенні ж часткової – згідно заданому фільтру. При синхронізації дані оновлюються також згідно цьому фільтру. Якщо в результаті поновлення дані помінялися таким чином, що перестають відповідати фільтру, запис при наступних синхронізації не оновлюється. Ось приклад функції, яка створює часткову репліку


Function CreatePartial(strReplicableDBPath As String, strDescription As String)

Dim repFull As New JRO.Replica
Dim repPartial As New JRO.Replica
Dim strPartialDBPath As String

  strPartialDBPath = “C:<Шлях до бази даних> ““Отримуємо ім’я нової репліки
 


“Створюємо порожню репліку
  repFull.ActiveConnection = strReplicableDBPath
  repFull.CreateReplica strPartialDBPath, strDescription, jrRepTypePartial, jrRepVisibilityGlobal

Set repFull = Nothing “Видаляємо змінну з пам’яті

“Єднаймося з створеної реплікою в ексклюзивному режимі
  repPartial.ActiveConnection = “Data Source=” & strPartialDBPath & “;Mode=Share Exclusive”

“Створюємо фільтр на основі таблиці (параметр jrFilterTypeTable)


repPartial.Filters.Append “Клієнти”, jrFilterTypeTable, “[Країна] =” США “”
repPartial.Filters.Append “Товари”, jrFilterTypeTable, “”

“Створюємо фільтр на основі зв’язків між таблицями (параметр jrFilterTypeRelationship)


repPartial.Filters.Append “Замовлення”, jrFilterTypeRelationship, “КліентиЗакази”

“Імпорітруем дані згідно фільтра в репліку


  repPartial.PopulatePartial strReplicableDBPath

Set repPartial = Nothing “Видаляємо змінну з пам’яті
End Function
 


  Visibility – Може приймати значення












JrRepVisibilityGlobal  Глобальна репліка.
JrRepVisibilityLocal  Локальна репліка.
JrRepVisibilityAnon  Анонімна репліка.

Глобальна репліка – це типова репліка. Вона синхронізується з іншими глобальними репліками, її можна використовувати як батьківського репліки для створення інших реплік.


Локальні і анонімні репліки можуть синхронізуватися тільки з батьківськими репліками. Їх пріоритет завжди дорівнює 0, тому, якщо виникає конфлікт при синхронізації, завжди приймаються зміни зроблені в батьківській репліці. Якщо ж конфлікту немає, то приймаються зміни зроблені в локальної або анонімної репліці. Відмінності між локальною і анонімної реплікою полягають у наступному. Шлях до локальної репліці завжди зберігається в головній репліці. Таким чином головна репліка може ініціювати синхронізацію з локальною реплікою. Про місце розташування анонімної репліки головною репліці нічого не відомо. Тому почати процес синхронізації може тільки анонімна репліка. Анонімні репліки найчастіше використовуються для синхронізації через інтернет, коли їх кількість велика, а місце розташування не фіксоване. Використання анонімної репліки також дозволяє зменшити розмір бази даних.


Priority – Це параметр який дозволяє встановити пріоритет репліки. Пріоритет репліки – ще одне нововведення JRO. Цей параметр введений для того, щоб показати відносне перевагу одній з реплік під час синхронізації: завжди приймаються зміни, зроблені в репліці з великим пріоритетом. Чому відносне перевагу? Тому що, хоча зміни і приймаються, конфлікт фіксується і якщо він не оброблений програмно, при подальшому зверненні до репліці викликається майстер вирішення конфліктів. Він дозволяє користувачеві прийняти зроблені зміни або скасувати їх.


Пріоритет репліки може приймати значення від 0 до 100 і встановлюється при створенні репліки. Власник проекту має пріоритет 100. Далі, якщо при створенні глобальної репліки пріоритет не вказано явно (Як у нашому прикладі) то він приймається рівним 90% від пріоритету батьківської. Як говорилося вище, пріоритет локальної та анонімної репліки завжди дорівнює 0. При синхронізації реплік з однаковим пріоритетом приймаються измения, зроблені в тій репліці, у якій найнижчий ReplicaID – Властивість, яка присвоюється репліці автоматично при створенні.


Updatability – Може приймати значення









jrRepUpdFull  Репліка може бути оновлена.
jrRepUpdReadOnly  Репліка тільки для читання.

За замовчуванням приймається значення jrRepUpdFull. Якщо встановлено значення jrRepUpdReadOnly то користувачеві не дозволяється змінювати дані в репліці. Однак при синхронізації з іншими репліками зміни даних приймаються.


Третій крок – Синхронізація двох реплік.

 

Private Function TwoWayDirectSync(strReplica1 As String, strReplica2 As String)
Dim repReplica As New JRO.Replica “визначаємо змінну з якої надалі будемо робити всі дії

repReplica.ActiveConnection = “Data Source =” & strReplica1 & “; Mode = Share Exclusive” “пов’язуємо змінну з реплікою strReplica1

repReplica.Synchronize strReplica2, jrSyncTypeImpExp, jrSyncModeDirect “синхронізуємо репліку strReplica1 з реплікою strReplica2

Set repReplica = Nothing “Видаляємо змінну з пам’яті
End Function
 

Метод Synchronize( Target [, SyncType ] [, SyncMode ]) має такі параметри:

 

1.   Target – шлях до репліці з якою проводимо синхронізацію.

2. SyncType – тип синхронізації (не обов’язковий параметр).

3. SyncMode режим синхронізації (не обов’язковий параметр).

 

Розглянемо другий і третій параметри докладніше.


SyncType – може приймати значення












jrSyncTypeExport 

Відправляти зміни зроблені в поточній репліці.


Зміни, зроблені в репліці


Target ігноруються.

jrSyncTypeImport  Приймати зміни зроблені в репліці Target.

Зміни, зроблені в поточній репліці ігноруються

jrSyncTypeImpExp  За замовчуванням. Вживаються зміни зроблені в обох репліках.

SyncMode може приймати значення












jrSyncModeIndirect  За замовчуванням. Непряма синхронізація.
jrSyncModeDirect  Пряма синхронізація.
jrSyncModeInternet  Непряма синхронізація через інтернет.

Під час прямої синхронізації двох реплік вони відкриваються одночасно і дані передаються безпосередньо з однієї репліки в іншу. При непрямої синхронізації відкривається одна репліка, зміни збираються і поміщаються в окремий файл. Потім відкривається друга репліка і читає ці зміни. Пряму синхронізацію використовують коли обидві репліки знаходяться в одній локальній мережі. При додзвоні та інших ненадійних з’єднаннях, коли зв’язок може раптово обірватися необхідно використовувати непряму репліку. Також, непряму синхронізацію застосовують через інтернет (значення jrSyncModeInternet). При цьому параметр Target має вигляд наприклад такий: “www.mycompany.myserver.com/files/Orders.mdb


Таким чином, кошти реплікації широко представлені в Access і дають великі можливості творцям баз даних для використання реплікації в своїх проектах.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*