# Словари

Файлы *.xdic (словари) каталога DB содержат описание форматов всех таблиц баз данных, SQL функций, триггеров и представлений. Формат словаря xml.

# Main.xdic (главный словарь)

является основным файлом каталога DB

Главный тег <Dic> - содержит атрибут "Версия", в котором указывается номер версии (числа через точку), соответствующие версии stack.exe.

Общий вид словаря:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Dic Версия="20.06.200826">
    <DataBases>
       <Base Имя=""/>
    </DataBases>
    <Tables>
       <Table\>
             <Поля\>
             <Индексы\>
             <Индексы базы\>
             <Триггеры\>
       </Table>
    </Tables>
    <Views>
       <View\>
    </Views>
    <Functions>
       <Function\>
    </Functions>
</Dic>

# Основные теги (разделы)

<DataBases> - список баз

<Tables> – описание таблиц базы данных.

<Table> – описание таблицы.

<Поля> - cписок полей таблицы и их свойства

<Поле> - описание поля и его свойства

<Индексы> - раздел предназначен только для сортировки в интерфейсе

<Индексы_базы> - индексы, которые содержатся в базе

<Триггеры> – список триггеров (описание триггеров в Stack.Srv\DB\Triggers

<Ограничения> - список ограничений

<Views> - содержит описание представлений

<Functions> - содержит описание функций

# Раздел FilterMesDrv

<FilterMesDrv> состоит из подразделов <FilterMes>, содержащих атрибут "Фильтр", в котором указывается регулярное выражение, по которому будут отсекаться ошибки, возникающие на sql сервере.

# Раздел DataBases

<DataBases> состоит из подразделов <Base> или <База>, содержащих атрибут "Имя", в котором указывается суффикс баз. Этот суффикс подставляется к основному имени БД.

# Раздел Tables

<Tables> описывает таблицы БД. <Tables> состоит из подразделов <Tаble>, который может содержать следующие атрибуты:

* Имя - имя таблицы
* Файл - имя файла для таблицы обмена (для синхронизации распределенной БД)
* Опции - флаги, не используется
* Вид - тип таблицы, может принимать следующие значения "Служебная", "Временная". Если не указано или указано иное, таблица будет обычной
* Категория - можно указать произвольную категорию таблицы. Применяется только при проверке БД с определённой категории таблиц
* Filegroup - файловая группа, в которой будет создана таблица.
* Filestream - имя файлового потока.
* Таблица_в_памяти - для создания таблицы оптимизированной для памяти надо указать параметр создания таблицы. Работает только для SQL сервера 2014 и выше

# Раздел Table

описывает таблицу Каждый из разделов <Tаble> может содержать подразделы:

* <Поля> - список полей таблицы и их свойства
* <Индексы> – Данный раздел предназначен только для сортировки и его использовать нельзя! Он оставлен для совместимости со старыми версиями программы.
* <Индексы_базы> - индексы, которые содержатся в базе
* <Полнотекстовый_индекс>
* <Триггеры> – список триггеров
* <Ограничения> - список ограничений

Пример описания таблицы

 <Table Имя="Свойства" Опции="0" Файл="PARAMS">
     <Поля>
         <Поле Имя="Виды-Параметры" Тип="Многие к одному" Размер="0" Таблица="Виды параметров" Опции="NoDelete "/>
         <Поле Имя="ДатКнц" Тип="Дата" Размер="2" Шаблон="дд.мм.гггг" Опции="NotDisplayForFolders "/>
         <Поле Имя="ДатНач" Тип="Дата" Размер="2" Шаблон="дд.мм.гггг" Опции="NotDisplayForFolders "/>
         <Поле Имя="Документ-Параметры" Тип="Многие к одному" Размер="0" Таблица="Документ" Опции="CascadeDelete "/>
         <Поле Имя="Знач2" Тип="Вещественное" Размер="0" Мин="0" Макс="0" Точность="15" Опции="NotDisplayForFolders CtrlC "/>
         <Поле Имя="Знач3" Тип="Вещественное" Размер="0" Мин="0" Макс="0" Точность="15" Опции="NotDisplayForFolders CtrlC "/>
         <Поле Имя="Значение" Тип="Вещественное" Размер="0" Мин="0" Макс="0" Точность="15" Опции="NotDisplayForFolders CtrlC "/>
         <Поле Имя="ОС-Параметры" Тип="Многие к одному" Размер="0" Таблица="Основные средства" Опции="CascadeDelete "/>
         <Поле Имя="Объекты-Параметры" Тип="Многие к одному" Размер="0" Таблица="Список объектов" Опции="CascadeDelete "/>
         <Поле Имя="Организация-Параметры" Тип="Многие к одному" Размер="0" Таблица="Организации" Опции="BreakDelete "/>
         <Поле Имя="Параметры-Договор" Тип="Многие к одному" Размер="0" Таблица="Договор" Опции="CascadeDelete "/>
         <Поле Имя="Параметры-УКДоговор" Тип="Многие к одному" Размер="0" Таблица="УК Договоры" Опции="CascadeDelete "/>
         <Поле Имя="Примечание" Тип="Строка"/>
         <Поле Имя="Структура-Параметры" Тип="Многие к одному" Размер="0" Таблица="Возможная структура" Опции="CascadeDelete "/>
         <Поле Имя="Счет-Параметры" Тип="Многие к одному" Размер="0" Таблица="Лицевые счета" Опции="CascadeDelete "/>
         <Поле Имя="Объект-Параметры" Тип="Многие к одному" Размер="0" Таблица="Объекты договора" Опции="CascadeDelete "/>
     </Поля>
     <Индексы>
         <Индекс Имя="Виды-Параметры" Список="Виды-Параметры asc(4) \nСчет-Параметры asc(4) \nДатКнц desc(2) "/>
         <Индекс Имя="Документ-Параметры" Список="Документ-Параметры asc(4) \nВиды-Параметры asc(4) \nДатКнц desc(2) "/>
         <Индекс Имя="Знач2" Список="Виды-Параметры asc(4) \nОбъекты-Параметры asc(4) \nЗнач2 asc(8) "/>
         <Индекс Имя="Объекты-Параметры" Список="Объекты-Параметры asc(4) \nВиды-Параметры asc(4) \nДатНач desc(2) "/>
         <Индекс Имя="Параметр на объекте" Список="Структура-Параметры asc(4) \nВиды-Параметры asc(4) "/>
         <Индекс Имя="Проверка уникальности" Список="Счет-Параметры asc(4) \nВиды-Параметры asc(4) \nОбъекты-Параметры asc(4) \nДокумент-Параметры asc(4) \nДатНач desc(2) \nДатКнц desc(2) "/>
         <Индекс Имя="Счет-Параметры" Список="Счет-Параметры asc(4) \nДатКнц desc(2) "/>
     </Индексы>
     <Индексы_базы>
         <Индекс Имя="Счет" Поля="Счет-Параметры, ДатНач, ДатКнц, Виды-Параметры"/>
         <Индекс Имя="Объект" Поля="Объекты-Параметры, ДатНач"/>
         <Индекс Имя="УКДоговор" Поля="Параметры-УКДоговор, Виды-Параметры"/>
         <Индекс Имя="Документ-Параметры" Поля="Документ-Параметры"/>
         <Индекс Имя="Договор" Поля="Параметры-Договор"/>
         <Индекс Имя="Объект-Параметры" Поля="Объект-Параметры, ДатНач, ДатКнц"/>
     </Индексы_базы>
     <Триггеры>
         <Триггер Имя="Свойства_LOG_DELTRIG" Версия="6" Файл="Свойства_LOG_DELTRIG.sql"/>
         <Триггер Имя="Свойства_LOG_INSTRIG" Версия="6" Файл="Свойства_LOG_INSTRIG.sql"/>
         <Триггер Имя="Свойства_LOG_UPDTRIG" Версия="6" Файл="Свойства_LOG_UPDTRIG.sql"/>
         <Триггер Имя="Свойства_BF_DELTRIG" Версия="2" Файл="Свойства_BF_DELTRIG.sql"/>
         <Триггер Имя="Свойства_BF_INSTRIG" Версия="2" Файл="Свойства_BF_INSTRIG.sql"/>
         <Триггер Имя="Свойства_BF_UPDTRIG" Версия="2" Файл="Свойства_BF_UPDTRIG.sql"/>
     </Триггеры>
 </Table>

# Раздел Views

<Views> описывает представления БД. Cодержание представлений находятся в одноименных файлах каталога Stack.Srv\DB\Views.

<Views> состоит из подразделов <View>, которые могут содержать следующие атрибуты:

  • Имя - имя таблицы.
  • Файл - имя файла для таблицы обмена.
  • Версия - версия элемента. Нужно только для конвертации. Если версия больше, чем в БД, представление будет пересоздано.
  • Заблокировано - признак того, что с элементом ничего делать не нужно (TRUE).
  • Filegroup - файловая группа, в которой будет создан кластерный индекс.

Каждый из разделов <View>, ровно так же как и раздел <Tаble> может содержать подразделы:

  • <Поля> - список полей представлений и их свойства
  • <Индексы> – Данный раздел предназначен только для сортировки и его использовать нельзя! Он оставлен для совместимости со старыми версиями программы.
  • <Индексы_базы> - индексы, которые содержатся в базе
  • <Полнотекстовый_индекс>

Пример:

 <View Имя="УК лицевого" Файл="УК лицевого.sql" Версия="1">
     <Поля>
         <Поле Имя="ДатНач" Тип="Дата" Размер="2" Шаблон="дд.мм.гггг" Опции="NotDisplayForFolders "/>
         <Поле Имя="ДатКнц" Тип="Дата" Размер="2" Шаблон="дд.мм.гггг" Опции="NotDisplayForFolders "/>
         <Поле Имя="Счет" Тип="Целое"/>
         <Поле Имя="ДоговорУК" Тип="Целое"/>
         <Поле Имя="УК" Тип="Целое"/>
     </Поля>
     <Индексы_базы>
         <Индекс Имя="Cl_УК" Поля="Счет, ROW_ID" Опции="UNIQUE CLUSTERED"/>
     </Индексы_базы>
 </View>

# Раздел Functions

содержащит описание функций. Описание - в Stack.Srv\DB\Функции. <Functions> состоит из подразделов <Function>, которые могут содержать следующие атрибуты:

  • Имя - имя группы.
  • Файл - имя файла с телом функции.
  • Заблокировано - признак того, что с элементом ничего делать не нужно (TRUE).
  • Версия - версия элемента. Нужно только для конвертации. Если версия больше, чем в БД, функция будет помечена как изменённая.
  • Агрегат - признак того, что это агрегат (TRUE).
  • Процедура - признак того, что это процедура (TRUE). Примеры:
 <Function Имя="AddrLs" Файл="AddrLs.func" Версия="2"/>
 <Function Имя="uspPrepareLS" Файл="uspPrepareLS.func" Процедура="true" Версия="5"/>

# Раздел Индексы

предназначен только для сортировки и его использовать нельзя! Он оставлен для совместимости со старыми версиями программы. Сортировку надо указывать в ресурсе. Раздел содержит теги <Индекс>, содержащие описание формата индексов и состоящие из следующих атрибутов:

  • Имя – название индекса
  • Список – перечисление полей индекса через запятую. Пример: Список="Счет-Параметры, ДатНач, ДатКнц". Так же здесь указывается сортировка, например "asc(5)".

# Раздел Индексы_базы

содержит описание формата индексов БД. Данный раздел содержит теги <Индекс>, состоящие из следующих атрибутов:

  • Имя – название индекса
  • Поля - список полей индекса через запятую
  • ДопПоля -список дополнительных полей индекса
  • Опции - Тип индекса "UNIQUE" или "CLUSTERED"
  • HASH - для указания хэшированных ключей, надо указывать "true".
  • Контейнеров - количество контейнеров для хэшированных ключей.
  • Коэффициент_заполнения - коэффициент заполнения индекса
  • Выражение - условие для фильтрованного индекса. Поля надо указывать в скобках [], иначе при сравнении индексов получится расхождения, т.к. к полям автоматически добавляются [], если их нет.
  • Filegroup - Имя файловой группы, где хранится индекс.

В обычной таблице всегда создаётся кластерный индекс на поле ROW_ID.

# Раздел Полнотекстовый_индекс

состоит только из атрибутов, описывающих создание одного полнотекстового индекса:

  • Ключ - уникальный ключ, может быть "", тогда будет использовано имя кластерного индекса на таблице.
  • Каталог - каталог полнотекстовых индексов
  • Поля - список полей полнотекстового индекса.

# Раздел Триггеры

содержит описание формата триггеров. Данный раздел содержит теги <Триггер>, состоящие из следующих атрибутов:

  • Имя – название триггера
  • Версия – количество изменений данного триггера
  • Файл – название файла из подкаталога “Triggers”, в котором находится данный триггер

# Раздел Ограничения

содержит описание формата ограничений. Данный раздел содержит теги <Ограничение>, состоящие из следующих атрибутов:

  • Тип - тип ограничения CHECK, PRIMARY KEY или FOREIGN KEY.
  • Имя - уникальное для базы имя ограничения.
  • Поля - список полей ограничения через запятую.
  • Выражение - вычисляемое выражение
  • Цель_таблица - целевая таблица, на которую ссылается FOREIGN KEY.
  • Цель_поля - поля целевой таблицы.
  • При_удалении - действие при удалении записи. Синтаксис точно такой же как в БД для FOREIGN KEY после ON DELETE.
  • При_обновлении - действие при обновлении записи. Синтаксис точно такой же как в БД для FOREIGN KEY после ON UPDATE.
  • HASH - для указания хэшированных ключей, надо указывать "true" (используется для таблиц, оптимизированных для памяти).
  • Контейнеров - количество контейнеров для хэшированных ключей (используется для таблиц, оптимизированных для памяти).

# Раздел Поле

содержит описание формата поля, состоящее из следующих атрибутов:

  • Имя – название поля
  • Выражение - sql выражение для вычисляемого (расчётного) поля на стороне sql сервера
  • Тип – тип данных хранящихся в поле
  • MSSQL - тип поля в MS SQL
  • ORACLE - тип поля в ORACLE SQL
  • POSTGRE - тип поля в POSTGRE SQL Значение_по_умолчанию - значение по-умолчанию может быть как простым типом, так и выражением. Причём если вызывается sql функция, то её необходимо писать в нужном для сервера формате (регистр, наличие обрамляющих скобок) для правильной конвертации таблицы.
  • Размер - максимальный размер хранилища в байтах. Если равен 0, то неограничен.
  • Длина - максимальное количество десятичных разрядов числа (как слева, так и справа от десятичной запятой), которые будут храниться. (В терминах MS SQL - Точность).
  • Точность - максимальное количество хранимых десятичных разрядов числа справа от десятичной запятой. (В терминах MS SQL - Масштаб). Только_чтение - если есть данный атрибут поле будет доступно только на чтение. Использовать_в_селекте - если есть данный атрибут то такие поля будут извлекаться вместе с Row_ID в одном запросе Таблица – имя таблицы, с которой осуществляется связь по данному полю (только для полей связи)
  • Опции – дополнительные свойства, накладываемые на поле, которые можно указать в виде строки (может быть комбинацией из нескольких свойств):
    • NotDisplayForFolders - для групп не отображается
    • Identity - поле автоинкрементируемое
    • NoEmpty - поле не может быть пустым
    • Upper - все символы в верхнем регистре
    • Int - ввод числовых значений
    • ZeroAsSpace - ноль отображается пробелом
    • CtrlC - суммируется по Ctrl+C
    • Width - ширина поля при отображении
    • Denom - подвергается деноминации
    • Filestream - поле файлового потока, такому полю будет присвоен тип varbinary(max). Эта опция используется только совместно с такой же опцией у таблицы.
    • NotNULL - поле не NULL
    • Sparse - SPARSE поле
    • PERSISTED - принудительное создание поля в таблице (для sql вычисляемых полей)
    • CascadeDelete - все листья удаляются (для иерархии)
    • CascadeDelete - Все связанные записи удаляются (для полей связи)
    • NoDelete - если есть листья, то не удалять (для иерархии)
    • NoDelete - нельзя удалять, если есть связь (для полей связи)
    • DelWithoutCheck - удалять без предварительной проверки (для иерархии)
    • Differ - узлы и листья различаются (для иерархии)
  • Мин – минимальное значение возможное в данном поле
  • Макс – максимальное значение возможное в данном поле
  • Шаблон – в каком формате задается поле (для поля даты)
  • Поля - список возможных вариантов для перечисляемых полей, хранящиеся в базе числовые значения заменяются на соответствующий текстовый вариант. Список разделяется через \n
  • Ограничение - если указан не пустой атрибут и тип поля "Внешний ключ", автоматическое создание ограничения будет отключено, для его создания надо прописать его в соответствующем разделе При_удалении - действие при удалении записи (только для типа "Внешний ключ"). Синтаксис точно такой же как в БД для FOREIGN KEY после ON DELETE. При_обновлении - действие при обновлении записи (только для типа "Внешний ключ"). Синтаксис точно такой же как в БД для FOREIGN KEY после ON UPDATE.

Используемые типы полей

Тип Тип в БД MS SQL
Целое, Флаги, Переключатель, Перечисляемое tinyint, smallin, int
Длинное целое bigint
Вещественное float
Деньги, smallmoney float
Целое, Флаги, Переключатель, Перечисляемое tinyint, smallin, int
Длинное целое bigint
Вещественное float
Деньги, smallmoney float
Строка, Текст varchar
ДатаВремя, Дата datetime
Двоичные данные varbinary(1-8000),varbinary(max)
Указатель, Один к одному, Многие к одному, Иерархия int
Гуид GUID
xml xml

Описание некоторых типов

  • Флаги - используется для визуального элемента с отметками (CheckBox)
  • Перечисляемое - используется для визуального элемента с выбором значения из списка (ComboBox)
  • Переключатель - используется для визуального элемента Переключатель (RadioButton)
  • Многие к одному - поле хранит ROW_ID записи связанной таблицы
  • Иерархия - это связь «многие-к-одному», но в пределах одной таблицы. Поле связи на SQL сервере представлено двумя целочисленными полями (типа int). Первое поле хранит ROW_ID записи, которой данная запись подчинена. Если запись никакой другой не подчинена, хранится число -10 (это называется «корень»). Второе поле хранит признак, могут ли у данной записи быть подчиненные записи (они не обязательно будут присутствовать). Если да, запись называется «узлом», поле хранит 0. Если нет, запись называется «листом», поле хранит 1. Имя второго поля получается из имени первого поля путем добавления суффикса «_ADD»

Примеры описания полей

    <Поля>
       <Поле Имя="real"             Тип="Вещественное"    Размер="4"               />
       <Поле Имя="float"            Тип="Вещественное"                             />
       <Поле Имя="money"            Тип="Деньги"          Размер="8"               />
       <Поле Имя="smallmoney"       Тип="Деньги"          Размер="4"               />
       <Поле Имя="bit"              Тип="Целое"           Размер="1"    Длина="1"  />
       <Поле Имя="smallint"         Тип="Целое"           Размер="2"               />
       <Поле Имя="varchar1000"      Тип="Строка"          Размер="1000"            />
       <Поле Имя="varchar20"        Тип="Строка"          Размер="0"    Длина="20" />
       <Поле Имя="varchar255"       Тип="Строка"          Размер="0"               />
       <Поле Имя="varcharMax"       Тип="Строка"          Размер="8001"            />
       <Поле Имя="binary20"         Тип="Двоичные данные" Размер="20"              />
       <Поле Имя="binaryMax"        Тип="Двоичные данные" Размер="0"               />
       <Поле Имя="datetime"         Тип="Дата"                                     />
    </Поля>