Дата последнего изменения: 23.09.2021
При работе нескольких разработчиков на собственных базах данных возникает проблема совмещение изменений от всех разработчиков на едином тестовом сервере.
Все изменения БД оформляются скриптом php. (Обновления самой системы Bitrix Framework реализованы подобным образом.) В скрипте проверяется текущая версия структуры БД (например, в опции COption). Если версия новая, то выполняется блок кода, модифицирующий БД, и устанавливается новое значение версии в опциях (инкремент). Скрипт коммитится наряду с "обычными" файлами. Каждый модуль подключает этот скрипт (на каждом хите, но клиентам этот вызов не уходит), и когда он приходит из репозитория, выполняются запросы и версии структуры БД выравниваются.
Скриптов может быть несколько, например, для каждого модуля отдельный. На проекте, также, могут быть разные области и удобнее будет несколькими скриптами вносить изменения. Примерный вид скрипта миграции:
$current_version = intval(COption::GetOptionInt("main", "~database_schema_version", 0)); if ($current_version < 5) // 11.5.7 { if (!$DB->Query("select TIME_ZONE_OFFSET from b_user WHERE 1=0", true)) { $updater->Query(array( "MySQL" => "ALTER TABLE b_user ADD TIME_ZONE_OFFSET int(18) null", "Oracle" => "ALTER TABLE b_user ADD TIME_ZONE_OFFSET number(18) NULL", "MSSQL" => "ALTER TABLE b_user ADD TIME_ZONE_OFFSET int NULL", )); } COption::SetOptionString("main", "~database_schema_version", 5); } if ($current_version < 6) // 11.5.7 { if (!$DB->IndexExists("b_event_message", array("EVENT_NAME"))) { $updater->Query(array( "MySQL" => "CREATE INDEX ix_b_event_message_name ON b_event_message (EVENT_NAME(50))", "Oracle" => "CREATE INDEX ix_b_event_message_name ON b_event_message (EVENT_NAME)", "MSSQL" => "CREATE INDEX IX_B_EVENT_MESSAGE_NAME ON B_EVENT_MESSAGE (EVENT_NAME)", )); } COption::SetOptionString("main", "~database_schema_version", 6); }
Возможна несколько иная реализация. Например, не подключать скрипт на каждом хите, а сделать хук в системе контроля версий на пулл.
Например создали таблицу в БД - опишите ее в Wiki, чтобы каждый программист при написании классов, обращающихся к БД знал имя таблицы, имена и параметры полей.
Решение не является разработкой компании 1С-Битрикс, все вопросы по его работе обращайте к разработчику.