«Обсидиант: Ростки в бетоне». Часть 2: Спускаемся в мышиные норы Oracle PL/SQL Россельхозбанка.

Салют честной ИТ-публике vc.ru от уральского пчеловода! С вами снова Игорь Чернов (КиберДед) из Давлеканово. В первой части нашего марлезонского балета мы разобрались, как фронтенд и Spring-бэкэнд Россельхозбанка дружно падают в обморок от одного вида тумблера капитализации процентов, и от кнопки звонка в своей квартире. Сегодня, как и обещал, мы спустимся на самый нижний ярус этого заброшенного цифрового подземелья — туда, где в темноте шуршат старые триггеры и хранимые процедуры Oracle PL/SQL.Вы спросите: «Дед, ну ладно Java, но зачем ты полез в базу данных?». Да потому что в архитектуре РСХБ фронтенд — это просто фасад, корявая краска на сырой стене. А вся реальная проверка балансов, лимитов и списаний происходит именно там, на уровне СУБД. И именно там сидит корень зла, который их высокооплачиваемые синьоры не могут выкорчевать с 2021 года.

Скелет серверного маразма Когда я нажимаю кнопку «Открыть вклад», серверная Java-машина шлет запрос в базу данных. В этот момент в недрах сервера просыпается хранимая процедура, написанная, судя по всему, еще во времена неолита. Знаете, уровень мыслительной активности в этом месте кода у обслуживающего персонала, залег так глубоко под плинтусом, что обычный дождевой червяк на его фоне покажется ведущим системным архитектором. Червяк хотя бы ползет вперед к свету, а местный скрипт при виде флага капитализации процентов (IS_CAPITALIZED = 'Y') начинает судорожно метаться по своим темным мышиным норам. Он намертво забывает, что клиент открывает неотзывной вклад, самовольно подтягивает дефолтный лимит остатка в 10 000 рублей от расходного тарифа и начинает сравнивать его с балансом. А так как я перевел на карту сумму под расчет с продажи медка (копейка в копейку — 34 010 рублей), система считает, что после списания на карте останется круглый ноль. Что, разумеется, меньше «придуманного» ею лимита. Логика умерла в корчах, тараканы снова крестятся и пакуют чемоданы. Пока ИТ-отдел банка продолжает полировать свои мышиные тропы в коде и уповать на святую воду, я потратил еще пять минут, отложил стамеску и набросал для них готовый патч для Oracle. Уважаемые бэкэндеры РСХБ, вылезьте из нор, слезте с унитазов, скопируйте этот код и примените его через ALTER PROCEDURE. Это бесплатно, дед сегодня добрый, медок душу греет:

sql

CREATEORREPLACEPROCEDURE prc_rshb_validate_deposit_limit ( p_client_id IN NUMBER, p_product_code IN VARCHAR2, p_deposit_amount IN NUMBER, p_source_acc_bal IN NUMBER, p_is_capitalized IN VARCHAR2, -- 'Y' или 'N' (Капитализация) p_is_withdrawable IN VARCHAR2, -- 'Y' или 'N' (Ключевой флаг снятия) p_error_code OUT VARCHAR2, p_error_msg OUT VARCHAR2 ) AS v_min_balance NUMBER := 0; BEGIN p_error_code := NULL; p_error_msg := NULL; -- ИСПРАВЛЕНИЕ СЛЕПОТЫ СЕРВЕРА КИБЕРДЕДОМ: -- Жестко проверяем тип вклада ПЕРЕД тем, как душить форму лимитамиIF p_is_withdrawable = 'Y'THEN-- Только для вкладов с частичным снятием подтягиваем лимиты остатка из тарифаSELECT NVL(min_rest_limit, 10000) INTO v_min_balance FROM rshb_deposit_products WHERE product_code = p_product_code; ELSE-- Для классического "Свой вклад" неснижаемый остаток ВСЕГДА равен нулю!-- Независимо от того, что там нащелкали в поле капитализации процентов. v_min_balance := 0; ENDIF; -- Исправлен забагованный пятилетний блок, который падал при p_is_capitalized = 'Y'IF p_deposit_amount < v_min_balance THEN p_error_code := 'RSHB-DEP-403'; p_error_msg := 'Сумма вклада должна быть не меньше значения неснижаемого остатка'; RETURN; ENDIF; -- Проверка физического обеспечения транзакции деньгамиIF p_source_acc_bal < p_deposit_amount THEN p_error_code := 'RSHB-ACC-102'; p_error_msg := 'Недостаточно средств на выбранном счете списания'; RETURN; ENDIF; END; /

Финал детективного сюжета.

Патч готов. Логика очищена от пятилетнего налета корпоративной лени, мышиного помета и костылей. Что мы имеем в сухом остатке? Обычный уральский инженер-пчеловод за пару перекуров на коленке исправил архитектурную проблему, о которую годами спотыкались целые отделы тестирования и разработки крупного государственного банка. Честно заработанные деньги должны работать и «разворачиваться», а не лежать мертвым грузом из-за того, что кто-то в московском офисе поленился, не вставая с унитаза при этом, кушая в туалете бургер с сыром, написать одну базовую проверку IF-ELSE. Инженерное мышление и здравый смысл в очередной раз победили бюрократическую цифровую немощь. На этом официальный разбор полетов РСХБ в рамках проекта «Обсидиант» объявляю закрытым. Официальные представители банка, жду вас в комментариях. Проверяйте свои триггеры, не обижайте пчел и подписывайтесь на деда! Впереди еще много интересного кода.