Системные таблицы Celesta

1. Структура системной схемы celesta

Помимо таблиц и схем, определённых пользователем, система Celesta добавляет в базу данных таблицы в собственной системной схеме celesta, структура которой представлена на диаграмме ниже.

Структура (в том числе состав полей) таблиц, относящихся к системной грануле "celesta", не подлежит изменению, а для доступа к их данным используются встроенные классы из пакета ru.curs.celesta.syscursors. Тем не менее, изменение данных в части из этих таблиц является частью штатной настройки системы.

Системные таблицы предназначены для:

  • Координирования автоматической миграции (таблица grains).

  • Распределения прав доступа к таблицам и представлениям (permissions, roles, userroles).

  • Настройки системы логирования (logsetup) и хранения логов (log, calllog).

systemtables

Назначение таблиц:

celesta.grains

перечень гранул со статусами. Ведётся автоматически, ручные изменения разработчиком решений сводятся к выставлению статуса "recover" на грануле после неудавшейся попытки автообновления и к удалению записи об удалённой грануле.

celesta.tables

перечень таблиц и представлений. Содержимое данной таблицы автоматически синхронизируется с перечнем таблиц и представлений, доступных в гранулах Celesta, пользователю не следует вмешиваться в данные этой таблицы (в любом случае изменения будут потеряны при следующей синхронизации). Поле tabletype указывает на то, является запись таблицей ("T") или представлением ("V").

celesta.roles

перечень ролей celesta. Сюда следует добавлять роли, в том числе здесь находятся роли с системными именами "reader", "editor" и т. д. (о ролях с системными именами см. в разделе «Распределение прав доступа»).

celesta.userroles

связь идентификаторов пользователей (логинов) с ролями. Заполняется администратором системы.

celesta.permissions

разрешения ролям на таблицы. Заполняется администратором.

celesta.logsetup

настройки логирования. Заполняется администратором.

celesta.log

лог изменений. Заполняется системой автоматически при каждом изменении данных, однако данные пишутся лишь по таблицам и действиям, указанным в celesta.logsetup.

celesta.calllog

лог вызовов методов. Заполняется в режиме профилирования.

2. Таблица celesta.grains

Данная таблица является важнейшей из системных таблиц Celesta, т. к. её содержимое управляет синхронизацией структуры базы данных с метаданными в момент запуска системы. Таблица содержит следующие поля:

Имя поля Тип поля Значение поля

id

VARCHAR(30)

имя (код) гранулы

version

VARCHAR(2000)

version tag гранулы

length

INT

длина CelestaSQL-скрипта гранулы в байтах

checksum

VARCHAR(8)

CRC32 CelestaSQL-скрипта гранулы

state

INT

статус гранулы:

  • 0 – ready — гранула развёрнута и готова к использованию (при этом её version tag и контрольная сумма записаны в полях version, length, checksum).

  • 1 – upgrading — гранула находится в процессе создания или апгрейда другим приложением Celesta, подключённым к базе данных.

  • 2 – error — последняя попытка автообновления завершилась неудачно, в этом случае в поле message находится сообщение об ошибке

  • 3 – recover (эквивалент — отсутствие записи в таблице grains при наличии гранулы в папке score) — гранула отсутствует или нуждается в регенерации (например, после ошибки апгрейда)

  • 4 – lock — гранула не нуждается в автоматическом обновлении структуры ни при каких обстоятельствах

lastmodified

DATETIME

дата и время последнего обновления статуса гранулы

message

TEXT

комментарий (например, сообщение об ошибке при последнем неудавшемся автообновлении)

3. Система распределения прав доступа

Как видно из структуры таблиц, права на таблицы раздаются ролям, прямой раздачи прав пользователям не предусмотрено.

В поле roleid указывается идентификатор роли, в полях grainid и tablename — ссылка на таблицу. В битовых полях r, i, m, d выставляются флаги, если необходимы права, соответственно, на чтение, вставку, модификацию и удаление.

Предусмотрены также специальные, системные имена ролей: reader и editor, а также роли вида <имя гранулы>.reader и <имя гранулы>.editor.

Роль reader даёт право на чтение всех без исключения таблиц, роль <имя гранулы>.reader (например, "foo.reader") даёт право на чтение всех таблиц в соответствующей грануле.

Роль editor даёт полные права (на чтение, вставку, модификацию и удаление) всех таблиц. Роль <имя гранулы>.editor (например, "foo.editor") даёт полные права на все таблиц в соответствующей грануле.

4. Система логирования

При любом изменении данных, производимых через курсоры Celesta, работает не только система распределения прав доступа, но также и система логирования изменений данных, записывая все изменения в таблицу celesta.log. Однако, чтобы celesta.log не засорялась потенциально огромным количеством ненужных данных, логируются лишь изменения на таблицах, явно указанных в таблице celesta.logsetup. Более того, имеется возможность отдельно включать логирование вставки, модификации и удаления записи.

Для того, чтобы включить логирование изменений данных таблиц, производимых через систему Celesta, необходимо занести соответствующие настройки в таблицу celesta.logsetup. При этом в полях grainid и tablename указывается ссылка на таблицу, а в битовых полях i, m, d выставляются флаги, если необходимо логирование, соответственно, вставки, модификации и удаления.

Таблица celesta.log состоит из следующих полей:

Имя поля Тип поля Значение поля

entryno

INT

автоинкрементируемый целочисленный номер записи в таблице лога

entry_time

DATETIME

время записи

userid

VARCHAR(250)

идентификатор пользователя, от имени которого произведено изменение

sessionid

VARCHAR(250)

идентификатор пользовательской сессии, в рамках которой произведено изменение

grainid

VARCHAR(30)

идентификатор гранулы

tablename

VARCHAR(30)

имя таблицы

action_type

VARCHAR(1)

тип действия (I для вставки, M для модификации, D для удаления)

pkvalue1

VARCHAR(100)

значение первого поля первичного ключа (сведённое к текстовому типу)

pkvalue2

VARCHAR(100)

значение второго поля первичного ключа (если есть, сведённое к текстовому типу)

pkvalue3

VARCHAR(100)

значение третьего поля первичного ключа (если есть, сведённое к текстовому типу)

oldvalues

VARCHAR(2000)

прежнее состояние записи (поля сведены к тексту и перечислены через запятую в формате CSV, информация обрезана по длине поля). Значение поля заполняется для действий M и D

newvalues

VARCHAR(2000)

текущее состояние записи в том же формате, что и в поле oldvalues. Заполняется для действий M и I

5. Система профилирования

Для поиска и устранения проблем, связанных с быстродействием, Celesta может работать в режиме профилирования, включаемом при помощи метода setProfilemode(true) экземпляра Celesta.

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

Имя поля Тип поля Значение поля

entryno

INT

автоинкрементируемый целочисленный номер записи в таблице лога

sessionid

VARCHAR(250)

идентификатор пользовательской сессии, в которой была запущена процедура

userid

VARCHAR(250)

идентификатор пользователя, от имени которого работала пользовательская сессия

procname

VARCHAR(250)

имя выполнявшейся процедуры

starttime

DATETIME

время начала выполнения процедуры

duration

INT

общее время выполнения процедуры (в миллисекундах)