Pull to refresh

Наболевшее об исходном коде объектов БД

Reading time 3 min
Views 5.3K
Представьте такую ситуацию: команда разработчиков работает над программой. При этом исходный код приложения нигде не хранится. Каждый программист с помощью специального декомпилятора выгружает нужный код из бинарника, работает с ним, а потом вновь собирает и отдает на дальнейшую разаработку коллегам.
Как вы думаете, это нормальная ситуация? Думаю, что нет.
Но почему-то такой подход довольно часто применяется при разработке приложений БД.

Объекты создаются и изменяются «наживую» прямо в БД. Большинство специализированных IDE предоставляют массу «удобных» инструментов для этого — поиск нужного объекта с помощью навигационного дерева, его модификация несколькими щелчками мыши и т.д. При этом об исходном коде мало кто задумывается — а при сборке версии часто используются утилиты, которые на основании кода текущей базы и кода базы продакшена генерируют диф-скрипт (для меня до сих остается загадкой как, т.к. альтер (таблицы например) можно сформировать множеством способов, все зависит от конкретного случая, от логики изменения и т.д.).
Получается, что исходного кода базы как бы и не существует, он считается неким машинным кодом, который трудно воспринимается человеком и полностью отдается на откуп визуальным средствам разаработки. Программист работает не с функционалом своей СУБД, а с функционалом конкретной IDE, неким красивым и (как кажется первое время) удобным промежуточным слоем. При этом приходится изучать именно IDE, а не саму СУБД.
Стоит помнить, что после того, как вы с помощью собственно написанного кода (выверенного, отформатированного по корпаративным стандартам, оформленного комментариями) создаете объект БД, этот код нигде не сохранится, вы потеряете его, а взамен получите то, что соберет за вас машина (IDE, специальные утилиты или библиотеки), опираясь на словарь данных БД. При этом теряется история изменения объектов (становится невозможным узнать/вспомнить кто, когда и зачем создавал/удалял/изменял тот или иной объект), могут возникать конфликты при совместной разработке и еще очень много чего.

Об этом можно почитать в «PLSQL Standards Developed for the PLSQL Starter Framework» в главе «Source Code Control»:

Remember to never modify the PL/SQL stored in the database. Work from the source code file instead. Yes, modifying the compiled code inside the database is technically feasible, but a really bad idea. It is comparable in some ways to modifying Java bytecode or C object files.

и в главе «Data Models and DDL»:

Most DDL is still created by hand. Make it clean, commented and readable, just like source code.

Напоследок приведу код создания простой таблицы в Oracle и то, что из него получается после выгрузки из БД различными утилитами.

Исходный код создания таблицы:
-- This is test_table
CREATE TABLE test_table (
id NUMBER(38), -- PK
value NUMBER(10,2), -- main value
width NUMBER(5,0) -- main width value
);


DBMS_METADATA:
CREATE TABLE "OBJECTMAN"."TEST_TABLE"
( "ID" NUMBER(38,0),
"VALUE" NUMBER(10,2),
"WIDTH" NUMBER(5,0)
)


Tora:
CREATE TABLE objectman.test_table
(
id NUMBER(38)
, value NUMBER(10,2)
, width NUMBER(5)
)


TOAD Eclpise plugin:
create table test_table
(
id number(38),
value number(10,2),
width number(5)
)

Как видно солянка полная, кто на что горазд.

Конечно это не значит, что нужно полностью отказаться от современных визуальных средств и работать в консольном редакторе. Самое главное — работать именно с исходным кодом вашего приложения БД, контролировать его самостоятельно, не отдавать на откуп машине. Исходный код приложений БД ничем не хуже кода Java или C++ приложений и требует к себе такого же обращения: форматирование, комментарии, контроль версий и т.д.

Несколько рекомендаций:
1. Весь код БД (DML, DDL, DCL, TCL и т.д.) необходимо хранить в репозитории (один объект = один файл);
2. Исходя из первого пункта, должна быть возможность собрать готовую к использованию «чистую» базу «с нуля», используя исходники из репозитория (нет необходимости делать дампы базы, вырезать ненужные(тестовые) данные и т.д.)
3. Править и компилировать код объекта БД нужно именно из файла (т.о. вместо навигатора по объктом БД вашей IDE станет актуален навигатор по файлам проекта в репозитории — найти файл, открыть на редактирование, накатить на базу).
Tags:
Hubs:
+15
Comments 29
Comments Comments 29

Articles