Рекомендации по использованию SQL Server GUID из MS Access - PullRequest
1 голос
/ 26 декабря 2008

Я расширяю существующий бэкэнд MS Access до SQL Server 2008 и, поскольку мы хотим использовать Репликация SQL Server Merge , мне придется изменить все текущие первичные ключи (в настоящее время стандартные целые числа автоинкремента) к GUID.

Итак, вот вопросы:

  • Есть ли какие-либо рекомендации по изменению первичных ключей с целого на GUID?
  • Любые рекомендации по использованию и манипулирования GUID из кода в клиентах Access?
  • Какой тип GUID для SQL Server мне следует использовать?

Ответы [ 2 ]

3 голосов
/ 26 декабря 2008

Крис прав, когда говорит, что (1) вам не нужны GUIDS для репликации слиянием и (2) существует только один тип GUID, но вы должны знать, что:

  1. GUIDS могут генерироваться по разным правилам. Вы можете проверить это здесь
  2. При настройке репликации SQL будет систематически добавлять GUID (генерируется как newsequentialid) для каждая таблица, если она еще не существует и назовет его rowguid. Конечно, если у вас уже есть такой GUID / newSequentialId в каждой таблице, SQL будет использовать его. Но я не советую вам «смешивать» GUID репликации с PK GUID: вы можете объявить все ваши первичные ключи типа GUID как «newSequentialIds», но (a) тогда вы потеряете возможность генерировать значения GUID на стороне клиента - см. ниже - и (б) ваши ПК будут «предсказуемыми», и эта идея заставляет меня чувствовать себя некомфортно ...
  3. Хранение целых чисел автоинкремента и управление их диапазоном посредством репликации означает большие накладные расходы (необходимо выделить диапазоны для каждой таблицы / каждой публикации) и потенциальный источник конфликтов при репликации из разных источников.
  4. Более того, некоторые ошибки SQL, такие как this , характерные для распределения диапазонов, все еще не решены должным образом: применение накопительного пакета 5 не решило нашу проблему, и нам пришлось искать другой способ перезапустить наш процессы репликации.
  5. В любом случае, я глубоко убежден, что переключение с целых чисел на GUID в качестве первичных ключей является обязательным. Для этого есть много причин, и одна из них связана с управлением диапазоном в качестве потенциального источника для сессий головокружения и ночных проблем.

Что касается перехода с целых чисел на GUIDS, я советую вам написать пошаговый модуль, который будет:

  • Сделайте резервную копию всех существующих таблиц перед их изменением
  • Добавить поле GUID для каждой таблицы
  • Добавить соответствующие поля FK, где запрошено
  • Обновление полей FK с помощью представлений, построенных на основе существующих отношений (построенных на целочисленных полях)
  • разрыв отношений
  • Изменить PK с целочисленных полей на поля GUID
  • Воссоздать отношения

Не торопитесь, чтобы написать этот код. Вы будете использовать его много раз, прежде чем он будет работать правильно. Вы должны получить прибыль от объекта DAO, таблиц, индексов и т. Д. Имейте в виду, что вы всегда должны иметь возможность вернуться к начальной точке, поэтому не забывайте о начальном процессе резервного копирования.

А как насчет манипулирования GUID из VBA? Об этом нужно знать несколько вещей:

  • GUID типа Variant
  • Можно и просто сгенерировать GUID в качестве первичного ключа на стороне клиента приложения, как я однажды предложил здесь .
  • При попытке получить значение GUID из элемента управления в форме (обычно в виде связанного поля в выпадающем списке) вы получите «?????», но никакого значения. Вы должны обратиться к значению поля в наборе записей, чтобы получить правильные данные. Вы можете открыть такую ​​форму в своем приложении, перейти к окну «немедленное» и попробовать это:

? myForm.myControl
?????

? myForm.recordset.fields("myFieldName")
{000581EB-9CBF-418C-A2D9-5A7141A686CC}
  • Возможно, вам придется преобразовывать направляющие в строки при навигации по наборам записей с помощью выражений, таких как recordset.findfirst:

myFirstRecordset.FindFirst "stringFromGUID(myGuidId) = " & StringFromGUID(mySecondRecordset.Fields("myGuidId").Value)
1 голос
/ 26 декабря 2008

Это может быть немного не по теме. Однако вы НЕ ДОЛЖНЫ использовать GUID для репликации слиянием. Вы по-прежнему можете использовать целые числа с автоинкрементом и распределять разные диапазоны для разных экземпляров базы данных. Таким образом, строки с одинаковыми идентификаторами не будут генерироваться.

Кроме того, в SQL 2008 есть только одно поле типа GUID - uniqueidentifier

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...