Деякі спостереження
Збережені процедури дають можливість повторного використання коду та інкапсуляції (два стовпи розробки програмного забезпечення),
Тільки якщо ви правильно їх використовуєте в контексті, в якому вони повинні використовуватись. Це ж твердження можна сказати про функції (в структурованому програмуванні) або методи (в об'єктно-орієнтованому програмуванні), і все ж ми бачимо функції 1К та об'єкти мегапопки.
Артефакти не дають вам цих переваг. Правильне використання цих артефактів - це те, що дає ці переваги.
безпека (ви можете надати / відкликати дозволи на окрему збережену програму),
Так. Це хороший момент і одна з головних причин, які мені подобаються збережені процедури. Вони забезпечують більш точний контроль доступу, ніж те, що зазвичай можна досягти за допомогою лише переглядів та облікових записів користувачів.
захистить вас від атак ін'єкцій SQL,
Це не характерно для SP-серверів, оскільки ви можете досягти однакового рівня захисту за допомогою параметризованих операторів SQL та скраб введення даних. Однак я б використовував ІП на додаток до таких, що стосується "глибокої безпеки" .
а також допомогти зі швидкістю (хоча ця DBA сказала, що, починаючи з SQL Server 2008, навіть регулярні SQL запити складаються, якщо вони виконуються достатньо разів).
Це дуже залежить від постачальника баз даних, але загалом ваша DBA є правильною. Виписки SQL (статичні або параметризовані) збираються. SP допомагають, якщо ви хочете / вам потрібно агрегувати та обчислювати дані, які ви не можете зробити з простими операторами SQL, але тісно інтегровані з SQL і не гарантують зворотну поїздку на сервер додатків.
Хороший приклад - запит даних у тимчасовий курсор (або курсори), з якого можна запустити ще один SQL. Ви можете це робити програмно на сервері додатків, а також можете зберегти безліч об’їзних поїздок, виконавши це в db.
Однак це не повинно бути нормою. Якщо у вас багато таких випадків, це є ознакою поганого дизайну баз даних (або ви витягуєте дані з не дуже сумісних схем баз даних по відділах.)
Ми розробляємо складне додаток, використовуючи методологію розробки програмного забезпечення Agile.
Спритність пов'язана з інженерними процесами та управління вимогами, а не з технологіями.
Чи може хтось придумати вагомі причини, чому вони не хочуть використовувати збережені програми?
Неправильне запитання
Питання неправильне та рівнозначне запитуванню: "Чи є вагомі причини не використовувати GOTO"? Я з цим питанням більше ставлюсь до Ніклауса Вірта, ніж до Дікстри. Я можу зрозуміти, звідки беруться настрої Дейкстри, але я не вірю, що він на 100% застосований у всіх випадках. Те саме з магазинами програм та будь-якими технологіями.
Інструмент хороший, коли він добре використовується за призначенням і коли він є найкращим інструментом для конкретного завдання. Використання його в іншому випадку не є ознакою того, що інструмент неправий, але що вальдер не знає, що він робить.
Правильне запитання полягає в тому, "якого типу використання збережених процедур слід уникати". Або "за яких умов я повинен (або не повинен) використовувати збережені процедури" . Шукати причин не використовувати технологію - це просто покласти провину на інструмент, а не накладати відповідальність на інженер прямо на місце, де воно належить - інженеру.
Іншими словами, це вигнання чи заява про незнання.
Я здогадувався, що DBA не хотіли підтримувати ці збережені документи, але, мабуть, існує занадто багато негативів, щоб виправдати таке дизайнерське рішення.
То, що вони роблять тоді, - це проектувати результати своїх поганих інженерних рішень на інструменти, якими вони погано користувалися.
Що робити у вашому випадку?
Мій досвід, коли я перебуваю в Римі, роби так, як роблять римляни .
Не боройтеся з цим. Якщо люди, що працюють у вашій компанії, хочуть позначити програми магазину як погану практику, дозвольте їм. Зауважте, що це може бути червоним прапором у їхній інженерній практиці.
Типове маркування речей як поганої практики зазвичай робиться в організаціях, що мають безліч некомпетентних програмістів. Шляхом перерахування певних речей організація намагається обмежити шкоду, заподіяну внутрішньо, власною некомпетентністю. Я тебе не лаю.
Узагальнення є матір'ю всіх гвинтів. Скажімо, що збережені документи (або будь-який тип технології) є поганою практикою, це узагальнення. Узагальнення - це коп-коти для некомпетентних. Інженери не працюють з кричущими узагальненнями. Вони роблять аналіз у кожному конкретному випадку, аналізують компроміси та виконують інженерні рішення та рішення відповідно до наявних фактів у контексті, в якому вони повинні вирішити проблему.
Хороші інженери не позначають речі як погану практику в таких узагальнюючих способах. Вони розглядають проблему, вибирають відповідний інструмент, здійснюють компроміси. Іншими словами, вони займаються інженерією.
Моя думка про те, як їх не використовувати
Не перекладайте складну логіку за межі збору даних (і, можливо, деяких перетворень). Добре вводити в них деяку логіку масажування даних або збирати з ними результат декількох запитів. Але саме про це. Все, що виходить за рамки цього, може кваліфікуватися як бізнес-логіка, яка повинна знаходитися десь в іншому місці.
Не використовуйте їх як єдиний механізм захисту від ін'єкцій SQL. Ви залишаєте їх на випадок, якщо щось погане це робить для них , але перед ними має бути ціла захисна логіка - перевірка / вичісування на стороні клієнта, перевірка / скрабінг на стороні сервера, можливо перетворення на типи, які мають сенс у вашому доменна модель і, нарешті, передається параметризованим операторам (які можуть бути параметризованими операторами SQL або параметризованими збереженими документами.)
Не робіть бази даних єдиним місцем, де містяться документи вашого магазину. До ваших облікових записів магазину слід ставитися так само, як і до вихідного коду C # або Java. Тобто джерело контролює текстове визначення ваших програм магазину. Люди звикають, що магазини програм не можуть бути контрольовані джерелами - булкрап, вони просто не знають, про яке криваве пекло вони говорять.
Моя думка про те, як / де їх використовувати
У вашій програмі потрібні дані, які потрібно перемістити або агрегувати з декількох запитів або переглядів. Ви можете вивантажити це з програми в db. Тут ви повинні зробити аналіз продуктивності, оскільки: a) двигуни баз даних ефективніші, ніж сервери додатків у цьому, але б) сервери додатків (іноді) простіше масштабувати по горизонталі.
Точний контроль доступу зерна. Ви не хочете, щоб у вашому db приєднувались ідіоти, які працюють декартовими, але ви також не можете просто заборонити людям виконувати довільні заяви SQL так само. Типовим рішенням є дозволити довільні заяви SQL у середовищах розробки та UAT, забороняючи їх у системних та виробничих середовищах. Будь-яке твердження, яке повинне зробити його систематизованим або виготовленим, переходить у процедуру магазину, переглядається кодом як розробниками, так і dbas.
Будь-яка дійсна необхідність запускати оператор SQL, який не знаходиться в магазині Pro, проходить через інше ім'я користувача / обліковий запис та пул з'єднань (із використанням, яке дуже відстежується та відсторонено)
- У таких системах, як Oracle, ви можете отримати доступ до LDAP або створити посилання на зовнішні бази даних (скажімо, виклик магазину Pro на db ділового партнера через vpn.) Простий спосіб зробити код спагетті, але це справедливо для всіх парадигм програмування, а іноді у вас є конкретні вимоги щодо бізнесу / середовища, для яких це єдине рішення. Програми магазину допомагають інкапсулювати цю неприємність лише в одному місці, близько до даних та без необхідності переходити на сервер додатків.
Незалежно від того, чи будете ви це запускати на db в магазині або на сервері додатків, залежить аналіз компромісу, який ви, як інженер, повинні зробити. Обидва варіанти мають бути проаналізовані та обґрунтовані деяким типом аналізу. Так чи інакше, просто звинувачуючи іншу альтернативу як "погану практику", це лише кульгавий технічний коп.
- У ситуаціях, коли ви просто не можете збільшити масштаб свого сервера додатків (наприклад, немає бюджету на нові апаратні чи хмарні екземпляри), але з великою кількістю ємності на задній панелі db (це характерніше, що багато людей прагне визнати), це платить для переміщення бізнес-логіки для зберігання програм. Не дуже, і це може призвести до анемічних моделей домену ... але потім знову ... компромісний аналіз, що більшість програмного забезпечення зламається.
Незалежно від того, стає це постійним рішенням чи ні, це специфічно для обмежень, що спостерігаються в той конкретний момент.
Сподіваюся, це допомагає.