Тонкости при подключении внешних баз данных MS SQL

Как известно, сервер данных по умолчанию настроен на работу с базами у кот. таблица правил сортировки соответствует Cyrillic_General_CI_AS или SQL_Latin1_General_CP1251_CI_AS (для MS SQL 7.0). Это так называемые Collation name. Данный вид настройки Collation гласит, что сервер регистронечувствителен, но чувствителен к спец. символам.

Когда подключается внешняя база, у которой Collation другой, то сервер данных начинает строить свою таблицу правил сортировки с помощью специальных служебных запросов и помещает её в паку \BIN с расширением .SOF. Но на некоторых Collation, например Cyrillic_General_BIN, данная процедура может привести к ошибке, которая проявляется в том, что при открытии картотеки на внешнюю запись Вы получите сообщение типа:

«Ошибка при создании таблицы сортировки «MSSQL2k_cp1251_Cyrillic_General_BIN»:
Ошибка при создании таблицы 'SortOrderTempTable', содержащей структуры: SortOrderTempTable Текст сообщения: Invalid object name 'SYSOBJECTS'».

Для решения данной проблемы придётся создать новый драйвер в файле ..\Settings\TB7dbTypes.ini (..\Config\DBTypes.ini в Turbo9). Если данного файла в папке нет, то создайте его. Ни в коем случае не копируйте одноимённый файл из папки ..\BIN.

В зависимости от того, к какой версии MS SQL производится подключение внешней базы, новый драйвер будет наследоваться от соответсвующего из базовых драйверов: MSSQL2005_ADO, MSSQL2000_ADO или MSSQL7_ADO. Изменения можно продемонстрировать на примере MS SQL 2000 c Collation name - Cyrillic_General_BIN, для которой необходимо опустить регистр в служебных запросах для объектов. Ниже приводится пример описания драйвера с поддержкой данного Collation:

[DriversInfo]
MSSQL2000_CyrBIN_ADO=Default,Alias=MS SQLServer 2000 (Cyrillic_General_BIN)

[DriversInfo.CheckInstalled]
MSSQL2000_CyrBIN_ADO=[SOFTWARE\Microsoft\Microsoft SQL Server\80]

;—————————– MSSQL2000_CyrBIN_ADO ———————————–

[MSSQL2000_CyrBIN_ADO]
Inherited=MSSQL2000_ADO

[MSSQL2000_CyrBIN_ADO.SQLStrings]
sctGetTableIndexNamesSQL=SELECT aIndexNames.name AS IndexName FROM sysobjects aTableNames, sysindexes aIndexNames WHERE aTableNames.xtype = 'U' and aTableNames.name = '%0:s' and aTableNames.id = aIndexNames.id and (aIndexNames.status & 64 = 0) and (aIndexNames.status & 2048 = 0) ORDER BY aIndexNames.name

Жирным шрифтом отмечены правки, которые необходимо было сделать, перекрывая параметр SQL-запроса sctGetTableIndexNamesSQL базового драйвера.

Надо отметить, что при описании внешних таблиц в базах с нестандартным Collation необходимо соблюдать регистр для физических объектов в базе.

 
doc/add_external_bases2.txt · Последние изменения: 2016/04/15 15:26 (внешнее изменение)
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki