Збережені процедури є поганою практикою в одній з найбільших у світі консалтингових фірм з ІТ-програмного забезпечення?


148

Я працюю над проектом в одній з 3 найкращих світових фірм, що займаються інформаційними консалтингами, і DBA мені повідомили, що зберігаються в державі найкращі практики компанії не є "найкращою практикою". Це так суперечить усьому, що я дізнався.

Збережені процедури дають вам можливість повторного використання коду та інкапсуляцію (два стовпи розробки програмного забезпечення), захист (ви можете надати / відкликати дозволи на окремий збережений додаток), захистить вас від атак ін'єкцій SQL, а також допоможе зі швидкістю (хоча ця DBA сказала, що Починаючи з SQL Server 2008, навіть звичайні запити SQL складаються, якщо вони виконуються достатньо разів).

Ми розробляємо складне додаток, використовуючи методологію розробки програмного забезпечення Agile. Чи може хтось придумати вагомі причини, чому вони не хочуть використовувати збережені програми? Я здогадувався, що DBA не хотіли підтримувати ці збережені документи, але, мабуть, існує занадто багато негативів, щоб виправдати таке дизайнерське рішення.


3
Яке повторне використання коду додається? Що робити, якщо ваш клієнт використовує іншу базу даних. Доводиться виносити всі ці ВП і починати з нуля. Не захищайте вас від введення sql. Швидкість у більшості випадків мінімальна.
Ріг

32
Майте на увазі, що більшість великих консалтингових фірм з інформаційних технологій мають мотиви максимально збільшити кількість оплачуваних годин, зберігаючи при цьому свою дупу. Старожили з будь-якою приналежністю в цих фірмах також, як правило, є гравцями та бюрократами, а не техніками. Я б узяв подібні речі у консультаційної фірми з зерном солі - я не раз виводив консультаційні фірми з лайна, встановлюючи їхню "найкращу" практику.
ЗанепокоєнийOfTunbridgeWells

1
Повторне використання коду @Rig додається так само, як і для функцій будь-якої мови - шляхом загортання коду в контейнер для багаторазового використання. Безумовно, що збережені процедури насправді захищають вас від ін'єкції SQL, доки ви не виконаєте створену рядок. Сказати, що швидкість мінімальна, здається просто неосвіченою. Більшість випадків не потрапляють у одні і ті ж категорії за вигодами від продуктивності, але демонструють велику невідповідність.
Гарет Клаборн

1
@GaretClaborn Але набагато більше шансів змінити рівень програми, ніж роки та роки історичних даних бази даних. На будь-який нетривіальний додаток програми все одно. І якщо ви це зробите, ви витратите місяці, переносячи код, багатий на процедуру. Немає користі для того, щоб додати ще одну залежність до свого проекту, за винятком надзвичайних ситуацій. Вони існують, але більшість часу це лише додавання ще однієї перешкоди для спритності проекту та повторного використання коду.
Rig

2
Виходячи з фону, де ми використовували sps майже ексклюзивно, я можу вам сказати про перевагу відходу від них та використання ORM, як Entity Framework. Занадто багато разів ділова логіка потрапляє в процедуру. У той час як ви можете версії програм із деякими робочими та / або сторонніми інструментами. Це не так просто, як це було б зробити в таких рамках, як TFS або GIT. Ваш код бази даних, який випромінюється, є агностиком вашого постачальника RDBMS. Таким чином, ви можете пізніше відключити постачальників RDBMS з меншим болем у голові.
ewahner

Відповіді:


280

З мого досвіду роботи над дуже великими проектами, ви повинні чітко розуміти, де живе логіка бізнесу. Якщо ви дозволяєте середовищу, де окремі розробники можуть розміщувати бізнес-логіку в шарі бізнес-об'єкта або в збереженій процедурі, як вони вважають за потрібне, велике додаток стає ДУЖЕ важким для розуміння та обслуговування.

Збережені процедури чудово підходять для прискорення певних операцій з БД. Моє архітектурне рішення полягає в тому, щоб залишити всю логіку у бізнес-шарі програми та використовувати цільові процедури, що зберігаються, щоб покращити продуктивність, якщо тестування вказує, що це є обґрунтованим.


37
Я не бачу все так просто. Для мене це ВСЕ ділова логіка. База даних із збереженими процедурами або без них надає певні послуги та дає певні гарантії. В ідеалі має бути неможливим неправильний код програми перевести базу даних у невідповідний стан. Якщо для збереження такої консистенції потрібні збережені процедури, я їх використовую.
Кевін Клайн

12
@kevin cline: Визначте "непослідовний стан". Я погоджуюся, що такі функції БД, як референтна цілісність, є цінними та значно зменшують ймовірність помилки програми, що завдає серйозної шкоди. Однак, загалом кажучи, визначення "послідовних даних" залежить від правильного виконання ділових правил.
Ерік Дж.

16
додати мій мільйон до мільйонів Майо. Розподілена ділова логіка виводить вас з шосе хорошої практики, прямо у смугу безумства
Ніко

27
+1 Ділова логіка проникнення в DAL викликає велике занепокоєння при використанні збережених процедур.
Система вниз

30
@ChristopherMahan, я б ніколи не хотів використовувати базу даних, яку ви розробляєте. Це найгірша можлива практика з точки зору бази даних. Бази даних часто впливають безпосередньо на базу даних. Недовговічним є думка, що хтось використовуватиме бізнес-рівень для оновлення мільйона записів чи інших речей, які трапляються з часом. Імпорт типово не проходить через бізнес-рівень (так, я хочу обробити 21 мільйон записів імпорту по одній записи одночасно на бізнес-шарі). Шахрайство набагато простіше, коли у вас немає обмежень на рівні бази даних. Погані дані майже на 100% визначені.
HLGEM

163

Деякі спостереження

Збережені процедури дають можливість повторного використання коду та інкапсуляції (два стовпи розробки програмного забезпечення),

Тільки якщо ви правильно їх використовуєте в контексті, в якому вони повинні використовуватись. Це ж твердження можна сказати про функції (в структурованому програмуванні) або методи (в об'єктно-орієнтованому програмуванні), і все ж ми бачимо функції 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 (це характерніше, що багато людей прагне визнати), це платить для переміщення бізнес-логіки для зберігання програм. Не дуже, і це може призвести до анемічних моделей домену ... але потім знову ... компромісний аналіз, що більшість програмного забезпечення зламається.

Незалежно від того, стає це постійним рішенням чи ні, це специфічно для обмежень, що спостерігаються в той конкретний момент.

Сподіваюся, це допомагає.


14
Це дійсно гарна відповідь.
yfeldblum

5
Гарна відповідь, але чи мав це бути іронічним? "Узагальнення - це мать усіх гвинтовиків".
bedwyr

2
Так і ні. Цей мій коментар був призначений для цього конкретного речення, на яке посилався ОП у своєму первісному запитанні ( збережені процедури не є "найкращою практикою" .) Приблизний опис процедур магазину як найкращої чи поганої практики є узагальненням. Ігноруючи контекст, в якому вони можуть бути хорошими АБО погані можуть (і часто призводять) до викрутки при архітектурі чи проектуванні рішень;)
luis.espinal

7
+1 для "Типове маркування речей як поганої практики зазвичай робиться в організаціях, що мають безліч некомпетентних програмістів." - Був там, пережив це, включаючи, що мені керівник розробників сказав мені на обличчя, що він вважає, що у мене є чудове рішення для однієї хитрої проблеми, але якщо його побачать, щоб дозволити мені його реалізувати, то це відкриє шлюзи для мальків.
Джулія Хейвард

1
@Shane Ви маєте рацію. Однак я вважаю, що ця відповідь намагається донести, це схильність деяких груп інженерів виправдовуватись їхніми незнаннями або аналізом, закликаючи на карту поганої практики. Однак у відповіді можна побачити певне покращення для більш недосвідчених із нас.
Сезар Ернандес

56

Обґрунтування полягає в тому, що покладання на збережений рівень процедури обмежує переносимість і зв’язує вас з певною БД. Додані витрати на обслуговування також наводяться як причина. Я також хотів прокоментувати цей пункт:

(збережені процедури) захищають вас від атак ін'єкцій SQL

Це насправді параметризований запит, який захищає вас, який ви можете легко виконати в простому текстовому запиті sql.


18
І якщо ваш збережений Proc використовує будь-який тип динамічного sql разом із параметром string, ви повернетесь туди, де ви почали.
JeffO

4
Різниця полягає в тому, що дозвіл доступу може бути встановлений для зберігаються процедур на основі процедури, для параметризованих SQL запитів ви повинні покладатися на те, що програмісти не повинні робити, + "blablabla"тому що ви повинні дозволити звичайний SQL, і на цьому управління закінчується.
Coder

19
Я ніколи не розумів аргумент "прив'язує вас до певного БД". Як часто ви берете програму та переносите її на зовсім іншу базу даних?
Мейсон Уілер

11
@MasonWheeler - +1 кожен раз. У будь-якому достатньо великому проекті ваша програма в кінцевому підсумку буде написана проти файлів певного продукту БД. Перетворення на інший БД стає головним завданням, незважаючи ні на що, оскільки нова БД матиме різні дивацтва!
Майкл Коне

6
@HLGEM - але у світі COTS на початку очікуються кілька БД (насправді ви вибираєте сумісні БД). Це не те, що ти порт, це те, що ти підтримуєш різні бек-енди, що зовсім інший звір, ніж робити порт.
Майкл Коне

46

Деякі причини, по яких я погоджуюся, що збережені документи не є найкращою практикою.

  • Логіка бізнесу та додатків повинна бути в коді, а не в базі даних. Введення логіки в БД викликає занепокоєння.
  • Ви не можете перевіряти збережені програми так само легко, як код у звичайних тестових проектах одиниць, з іншою логікою програми.
  • Я не знаходжу збережені програми як сприятливі для перевірки першого програмування під час написання коду.
  • Зберігати документи не так просто налагоджувати, як код програми, коли ви налагоджуєте програму в IDE.
  • Контроль версій / Контроль джерела SP щодо звичайного коду

7
Ви можете так само легко виконати тестування першого програмування на збережених процедурах.

5
Гммм, ну ... 1) Використання збережених db процедур не обов'язково означає, що в них вкладається бізнес-логіка. 2) збережені програми - це деякі з найпростіших речей для тестування. 3) Програми зберігання не обов'язково проводять тестові практики, але не все, що можна обчислити, можна перевірити спочатку. 4) налагодження не повинно бути проблемою, оскільки в програмах зберігання не повинно бути нічого іншого, як просто перевірити оператори SQL та курсори. Крім того, налагодження має відбуватися спочатку тестуванням та налагодженням операторів SQL у коді, а потім переміщенням у сховища програм ... просто IMO btw.
luis.espinal

6
Ви, очевидно, не розробник БД. Контроль джерела, IDE - чорт простий у відлагодженні SP, якщо ви використовуєте TOAD або подібний IDE, те ж саме з версією.
gbjbaanb

6
2) на блок тестування збережених проектів. idk про інші тестові рамки блоку, але, принаймні, з MS Test (VisualStudio.TestTools.UnitTesting), для запуску будь-якого методу Assert на збереженій програмі щонайменше потрібне з'єднання Db, що за визначенням робить його більше тестом інтеграції, ніж одиницею тест. І збережена програма може посилатися на стан про базу даних на глобальному рівні, на базі даних. Вони можуть не підробляти або мати інтерфейси.
Т. Вебстер

3
+1 Крім того, мови збережених процедур (pl / sql, t-sql, plpgsql тощо) дуже незграбні та багатослівні. Набагато простіше мені використовувати мову сценаріїв для підключення до бази даних та обробки бізнес-логіки поза базою даних.

22

Збережені процедури дають можливість повторного використання коду та інкапсуляції (два стовпи розробки програмного забезпечення),

Так, але ціною того, що зможеш досягти інших спритних цілей дизайну. Їх складніше утримувати, з одного боку. Якщо проект, на якому я вказую, є якоюсь ознакою, ви, швидше за все, отримаєте кілька, несумісних SP, які роблять по суті ту ж роботу, без жодної користі.

захистить вас від атак ін'єкцій SQL,

Ні, вони не. Я навіть не можу почати здогадуватися, звідки ця ідея могла взятися, як я чую, як це часто говорилося, і це просто неправда. Це може пом'якшити деякі типи атак на ін'єкцію SQL, але якщо ви не використовуєте в першу чергу параметризовані запити, це не має значення. Я все ще можу '; ЗРОБИТИ ТАБЛИЧНІ акаунти; -

а також допомогти зі швидкістю (хоча ця DBA сказала, що, починаючи з SQL Server 2008, навіть регулярні SQL запити складаються, якщо вони виконуються достатньо разів).

Вони також зазвичай компілюються під час використання підготовлених параметризованих висловлювань (принаймні, для декількох використовуваних БД). На той момент, коли ваша програма починає виконувати запит (або, особливо, коли ви виконаєте один і той самий підготовлений запит кілька разів), будь-яка перевага в продуктивності, на вашу думку, у вашого SP є абсолютно суперечливою.

Тільки причина використовувати збережену процедуру, ІМХІ, коли ви повинні зробити складний, мульти-ступінчастим запит , який витягує з декількох розбору джерел. SP не повинні містити логіку рішення низького рівня, і вони ніколи не повинні просто інкапсулювати інший простий запит. Немає переваг і є лише багато недоліків.

Слухайте свою DBA. Він знає, що сталося.


1
Red Gate мають продукт SQL Source Control для SQL Server, але я погоджуюся, що введення логіки у збережені програми є відмінним способом переконатися, що у вас є важлива логіка, яка не знаходиться під яким-небудь контролем версій.
Carson63000

17
@greyfade - "Мені ще не доводиться бачити контроль джерел для ІП" - ти жартуєш? Магазин Pro - це просто кривавий текстовий файл, який ви завантажуєте в механізм бази даних (який бере його, компілює та встановлює для виконання.) Кожне місце, де я працював, на якому зберігаються програми, ми зберігаємо вихідний код магазину proc у, скажімо, CVS, прозору книжку чи будь-який SCM, який використовувався. Скажімо, що програми зберігання не можуть бути контрольовані джерелами (тому що вони знаходяться в db) - це як сказати, що мій вихідний код програми (Java, C # або будь-який інший) не може бути контрольований джерелом, оскільки він компілюється і розгортається у виробництві.
luis.espinal

2
@ luis.espinal: Я не сказав, що вони не можуть бути в контролі джерел. Я просто сказав, що не знав про інструмент, спеціально для підтримки історії SP, маючи на увазі збереження цієї історії в базі даних. Будь ласка, не гнівайтесь на мене тільки тому, що ви щось неправильно прочитали.
greyfade

1
Усі документи, що зберігаються в опурі, знаходяться під контролем джерела, тому що ви бачили погані парктики в минулому, це не означає, що їм властиво використовувати збережені програми.
HLGEM

1
@ luis.espinal, типово, що джерело збереженої процедури можна буде отримати пізніше з бази даних? Якщо це так, ви можете просто мати інструмент, який регулярно витягує його, і мати інший інструмент, щоб відтворити інсталяцію з нуля. Зробіть це час від часу, щоб переконатися в точності.

17

Це була офіційна лінія, коли я кілька років тому працював на одній з Великих п’яти. Обґрунтуванням було те, що оскільки SP прив’язані до конкретних реалізацій (PL / SQL vs T / SQL vs ...), вони надмірно обмежують вибір технологій.

Переживши міграцію однієї великої системи з T / SQL в PL / SQL, я можу зрозуміти аргумент. Я думаю, що це трохи канард - скільки місць насправді переміщаються з однієї бази даних в іншу за примхом?


10
@DaveE: Для рішення підприємства ви, мабуть, праві. Якщо ви створюєте пакетне програмне забезпечення, як тільки ви відправляєте на MSSQL, ваша найбільша перспектива захоче запустити його на Oracle.
Ерік Дж.

3
@Eric: занадто вірно. Де я зараз перебуваю, ми використовуємо безліч SP і говоримо людям "ні", якщо вони не хочуть MSSQL. Приємно вміти це робити.
DaveE

3
@DaveE: Чи бажає команда продавців сказати "так"?
Ерік Дж.

2
Це не стільки переміщення однієї системи з однієї бази даних в іншу, а наявність однієї системи, здатної використовувати будь-яку систему баз даних, у якої вже є клієнт. Великі бази даних коштують дорого.

@EricJ: так, але, як тільки вони побачать, що коштуватиме їхня комісія, запит начебто відходить.
DaveE

17

Усі три компанії, в яких я працюю, використовували збережені процедури для логіки їх застосування із SQL Server. Я не дуже бачив речі по-іншому. Але для мене це великий безлад. Зазвичай не дуже хороші засоби поводження з помилками або засоби повторного використання коду із збереженими процедурами.

Скажімо, у вас є збережена процедура, яка повертає набір даних, який ви хочете використовувати, як ви можете використовувати їх у майбутніх збережених процедурах? Механізми на SQL Server для цього не дуже хороші. EXEC INTO ... працює лише на одному або двох рівнях гніздування (я зараз забуваю). Або вам потрібно заздалегідь визначити робочий стіл і ввести його в процес обробки. Або вам потрібно заздалегідь створити таблицю темпів та заповнити процедуру. Але що робити, якщо двоє людей називають тимчасовою таблицею одне і те ж у двох різних процедурах, які вони ніколи не планували використовувати одночасно? У будь-якій нормальній мові програмування ви можете просто повернути масив з функції або вказати на об'єкт / глобальну структуру, що поділяється між ними (за винятком функціональних мов, де ви б повернули структуру даних на відміну від простої зміни глобальної структури ... )

Як щодо повторного використання коду? Якщо ви почнете вводити загальні вирази в UDF (або ще гірші підзапити), ви уповільнить код. Ви не можете викликати збережену процедуру для обчислення для стовпця (якщо ви не використовуєте курсор, передайте значення стовпців по одному, а потім якось оновіть таблицю / набір даних). Таким чином, щоб отримати максимальну продуктивність, вам потрібно вирізати / вставити загальні вирази в усьому місці, який є кошмаром технічного обслуговування ... За допомогою мови програмування ви можете створити функцію для генерації загального SQL, а потім викликати його звідусіль під час створення рядок SQL Тоді, якщо вам потрібно відкоригувати формулу, ви можете внести зміни в одне місце ...

Як щодо обробки помилок? У SQL Server є багато помилок, які негайно зупиняють виконання збереженої процедури, а також деякі, які навіть змушують відключитись. З 2005 року існує спроба / ловити, але все ж є ряд помилок, які неможливо знайти. Також те ж саме відбувається і з дублюванням коду в коді обробки помилок, і ви дійсно не можете пропускати винятки так легко, або перекидати їх на більш високі рівні так само легко, як і більшість мов програмування .....

Також просто швидкість. Багато операцій над наборами даних не орієнтовані на SET. Якщо ви намагаєтеся робити речі, орієнтовані на рядки, або збираєтесь використовувати курсор, або ви будете використовувати "курсор" (коли розробники часто запитують кожну рядок по черзі і зберігають вміст у змінних @ так само, як курсор. .. Хоча це часто повільніше, ніж курсор FORWARD_ONLY). З SQL Server 2000 у мене було щось, що працювало протягом 1 години, перш ніж я його вбив. Я переписав цей код у Perl, і він закінчився за 20 хвилин. Коли мова сценаріїв на 20-80 разів повільніше, ніж C, димить SQL у продуктивності, у вас точно немає операцій із написання рядків, орієнтованих на бізнес у SQL.

Тепер у SQL Server є інтеграція CLR, і багато цих проблем усуваються, якщо ви використовуєте CLR-процедури, що зберігаються. Але багато DBA не знають, як писати .NET програми або вимикати CLR через проблеми безпеки та дотримуватися Transact SQL .... Також навіть у CLR у вас все ще є проблеми обміну даними між декількома процедурами ефективно .

Крім того, загалом, найважче масштабувати - це база даних. Якщо вся ваша бізнес-логіка знаходиться в базі даних, тоді, коли база даних стане надто повільною, у вас виникнуть проблеми. Якщо у вас є бізнес-рівень, ви можете просто додати більше кешування та більше бізнес-серверів для підвищення продуктивності. Традиційно інший сервер для встановлення Windows / linux та запуск .NET / Java набагато дешевший, ніж придбання іншого сервера баз даних та ліцензування більше SQL Server. Зараз у SQL Server є більш підтримка кластеризації, але спочатку її взагалі не було. Тож якщо у вас є багато грошей, ви можете додати кластеризацію або навіть зробити доставку журналу, щоб зробити кілька копій, які лише читаються. Але в цілому це буде коштувати набагато більше, ніж просто мати запис за кешем чи щось.

Також подивіться засоби Transact-SQL. Рядок маніпуляції? Я прийму заняття Java String Class / Tokenizer / Scanner / Regex в будь-який день. Таблиці хешу / пов'язані списки / тощо. Я візьму рамки колекції Java і т.д. ... І те саме для .NET ... І C #, і Java є значно розвиненішими мовами, ніж Transact SQL ... Хек-кодування з Transact-SQL змушує мене заздрити С. .

Крім того, збережені процедури є більш ефективними для роботи з великим набором даних та застосування декількох запитів / критеріїв, щоб зменшити їх перед поверненням до бізнес-рівня. Якщо вам доведеться надіслати купу величезних наборів даних до клієнтської програми та розбити дані у клієнта, це буде набагато неефективніше, ніж просто виконувати всю роботу на сервері.

Також збережені процедури корисні для безпеки. Ви можете вирізати весь доступ до базових таблиць і дозволити доступ лише через збережені процедури. З деякими сучасними методами, такими як XML, ви можете зберігати процедури, які виконують пакетне оновлення. Тоді весь доступ контролюється за допомогою збережених процедур, якщо вони захищені / виправлені, дані можуть мати більш цілісність.

Аргумент введення SQL насправді більше не застосовується так багато, оскільки ми параметризували запити на стороні мови програмування. Крім того, навіть до того, як параметризовані запити трохи замінили ("" "," ""), також працювали більшу частину часу (хоча є ще хитрощі, щоб пройти повз кінця рядка, щоб отримати те, що ви хочете).

В цілому, я думаю, що SQL і Transact SQL - це чудові мови для запитів / оновлення даних. Але для кодування будь-якого типу логіки, виконуючи маніпуляції з рядком (або маніпулюючи файлами маніпуляцій .... ви здивуєтеся, що ви можете зробити з xp_cmdshell ....), будь ласка, ні. Я сподіваюся знайти майбутнє місце, яке здебільшого не використовує збережені процедури. З точки зору ремонту коду, вони є кошмаром. Крім того, що станеться, якщо ви хочете перейти на платформи (хоча насправді, якщо ви заплатили за Oracle / DB2 / Sybase / Sql сервер / тощо.), Ви можете отримати все, що ви можете, використовуючи кожне власне розширення, яке вам допоможе. ..).

Також дивно часто логіка бізнесу неоднакова. В ідеальному світі ви вкладете всю логіку в збережені процедури і поділите її між додатками. Але досить часто логіка відрізняється залежно від застосувань, і ваші збережені процедури в кінцевому підсумку стають надмірно складними монолітами, які люди бояться змінити і не розуміють усіх наслідків. Тоді як з хорошою об'єктно-орієнтованою мовою ви можете кодувати рівень доступу до даних, який має деякий стандартний інтерфейс / гачки, які кожен додаток може перекрити для власних потреб.


6
Я не можу не запропонувати їжу для роздумів у всьому наборі, спрямованому на процедуру. Я бачив курсори баз даних, які використовуються у всіх випадках, коли такий підхід був просто горіхом. Я особисто замінив явний SQL на основі курсору (Oracle PL / SQL, в конкретному випадку) запитом, орієнтованим на набір, і побачив, що результати повертаються за секунду замість 8 хвилин. Мені знадобилося 30 хвилин, щоб розібрати цей код курсору 1000 рядків і "отримати" його. Отриманий SQL запит був стислим, елегантним, простим. Люди занадто часто і занадто швидко недооцінюють потужність серверів своїх баз даних.
Крейг

12

Як ви виконуєте версію збережених процедур на сервері?

Якщо ви повторно розміщуєте збережені процедури на сервері з управління версіями, ви вивантажуєте збережений план виконання.

Збережені процедури не можна змінювати безпосередньо на сервері, інакше як ви знаєте, що зараз працює _right? Якщо їх немає, інструмент розгортання потребує доступу для запису збережених процедур у базу даних. Вам доведеться розгортати кожну збірку (план виконання може бути іншим)

Хоча збережені процедури не є портативними, взагалі немає SQL (коли-небудь бачила обробку дат Oracle - uggghhh).

Отже, якщо ви хочете портативність, побудуйте внутрішній API доступу до даних. Ви можете називати це як виклики функцій, а внутрішньо ви можете вбудовуватися в будь-який лінгго, за допомогою параметризованих запитів, і це може контролюватися версіями.


6
Як ви виконуєте версію збережених процедур на сервері? - Ви керуєте вихідним кодом магазину proc. Коли настає час розгортання, ви захоплюєте програми магазину (із заданої базової лінії) і ви (або ваш dba) розгортаєтеся до виробництва. Перерозподіл (будь то тестування чи виробництво), безумовно, вибухає збережений план виконання, але це відбудеться незалежно від того, ви керуєте джерелом своїх SP-програм.
luis.espinal

1
@BarryBrown Це не працює, якщо люди мають доступ до сервера безпосередньо і можуть змінити збережені процедури. Мені довелося б провести процес, який слідкує за SP, або перевірити перед кожним використанням ...
Крістофер Махан

2
Якщо у вас люди просто змінюють відростки вольово-невільно на серверах, не здійснюючи їх змін у керуванні джерелами, у вас є проблема процесу, яка майже напевно впливає на вашу імперативну розробку коду, навіть якщо ви не знаєте, що це є.
Крейг

1
Однією з речей, які я робив у минулому, було встановити екземпляр розробки сервера баз даних на робочих станціях окремих розробників, або якщо це було неможливо, то, принаймні, мати "dev" та "production" екземпляри баз даних , і всі сценарії DDL та DML, а також зразки даних та сценарії завантаження жили у власному каталозі у дереві джерел, і база даних звичайно будувалася з цих скриптів, використовуючи файл MAKE. Devs також могли використовувати nmake для створення єдиних збережених програм. Якби вони не поставили його під контроль джерел, це зникне на них, і вони це знали.
Крейг

1
... Я не хотів звучати зневажливо в своєму попередньому коментарі фразою "..., навіть якщо ви не знаєте ...". Я мав намір передати, що якщо така річ відбувається із збереженими процедурами, це, мабуть, відбувається і в інших частинах проекту. Мені особисто не подобається інтегрований контроль над джерелами в IDE, частково тому, що я думаю, що це робить людей ледачими в плані думати про те, що це насправді означає для команди та проекту в цілому, щоб внести зміни та здійснити ці зміни в контролі джерела. сховище. На мою думку, ці речі не повинні бути "автоматичними".
Крейг

9

Це так суперечить усьому, що я дізнався.

Можливо, вам доведеться вийти більше. [усмішка] Серйозно, що зберігаються програми припадають принаймні 10 років. Практично з тих пір, як n-ярус замінив клієнт-сервер. Занепад прискорився лише прийняттям таких мов OO, як Java, C #, Python тощо.

Це не означає, що зберігаються програми все ще не мають своїх прихильників та прихильників - але це тривала дискусія та дискусія. Це не нове, і, ймовірно, все ще триватиме довгий час; IMO, супротивники збережених програм явно перемагають.

Збережені процедури дають можливість повторного використання коду та інкапсуляції (два стовпи розробки програмного забезпечення)

Дуже правильно. Але це так само пристойно зорієнтований шар OO.

безпека (ви можете надати / відкликати дозволи на окремі збережені програми)

Хоча ви можете це зробити, мало хто робить це через серйозні обмеження. Безпека на рівні БД недостатньо деталізована для прийняття контекстних рішень. Через ефективність роботи та управління накладними можливостями також є підключення для кожного користувача - тому вам все одно потрібен певний рівень авторизації у коді додатка. Ви можете використовувати вхідні дані на основі ролей, але вам потрібно буде створити їх для нових ролей, підтримувати, яку роль ви виконуєте, перемикати з'єднання, щоб виконувати роботу на "системному рівні", як ведення журналів тощо. І, врешті-решт, якщо ваша програма є власністю - таким є і ваше з'єднання з БД.

захистить вас від атак ін'єкцій SQL

Не більше, ніж робити параметризовані запити. Що вам все одно потрібно робити.

а також допомогти зі швидкістю (хоча ця DBA сказала, що, починаючи з SQL Server 2008, навіть регулярні SQL запити складаються, якщо вони виконуються достатньо разів).

Я думаю, що це почалося в MSSQL 7 або 2000 р. Було багато дискусій, вимірювань та дезінформації щодо збережених процесорів проти вбудованої продуктивності SQL - я збиваю це все під YAGNI. І, якщо вам це потрібно, протестуйте.

Ми розробляємо складне додаток, використовуючи методологію розробки програмного забезпечення Agile. Чи може хтось придумати вагомі причини, чому вони не хочуть використовувати збережені програми?

Я не можу думати про багато причин , ви хочете , щоб. Java / C # / будь-яка мова 3-го GL - все набагато більш здатні, ніж T-SQL, при інкапсуляції, повторному використанні та чутливості тощо. Більшість з них безкоштовно надаються напівпристойним ORM.

Також, даючи пораду "розповсюджувати по мірі необхідності, але не більше" - я думаю, що тягар доказування в наші дні лежить на захисниках СП. Поширеною причиною того, що зберігати складний процес важко, є те, що T-SQL простіше, ніж OO, і магазин має кращі розробники T-SQL, ніж OO. Або, що DBA зупиняється на рівні бази даних, а збережені програми є інтерфейсом між розробником та DBA. Або ви доставляєте напівфантазований продукт, і збережені документи можуть бути налаштовані користувачем. Якщо немає таких міркувань, я думаю, що за замовчуванням для будь-якого проекту Agile SW в наші дні буде ORM.


1
Є ЛОТ для підвищення продуктивності, якщо вам не потрібно передавати гігантські набори даних із бази даних, щоб робити прості речі. Виміряйте та оптимізуйте за потреби.

Точно. Збережені процедури можна використовувати як скальпель. Це абсолютна гарантія того, що введення / виведення всередині сервера бази даних має більшу пропускну здатність, ніж введення / виведення між сервером бази даних та вашим середнім рівнем. І ви не збираєтеся писати швидший, ефективніший код приєднання даних у своєму середньому рівні, ніж розробники бази даних, написані на сервері баз даних. Якщо ви переносите 1 000 000 рядків даних у свій середній рівень, щоб зробити з'єднання, що я, звичайно, бачив, ви просто повинні бути розбиті ... Це як хлопці, які заявляють, що ви повинні "написати свій відкатний код". Божевілля.
Крейг

1
Не варто недооцінювати сервер вашої бази даних. Дізнайтеся, як правильно ним користуватися.
Крейг

1
FWIW, для з'єднання на стороні бази даних вам не потрібна збережена програма. І якщо ви використовуєте курсор для процедурної логіки, ви, ймовірно, вже втратили ефективність війни. Відмовитись від збережених процедур, звичайно, не те саме, що відмовитися від SQL або встановити на основі рішення.
Марк Брекетт

1
Цілком вірно, і я насправді сперечався на користь SQL більше, ніж сперечався спеціально для паростків. Але тоді вбудований SQL у ваш імперативний код не обов'язково є ключем до щастя, правда? Що часто призводить до цілої дискусії щодо ORM, що призводить до того, що я вказує на порівняння продуктивності між керованим ORM доступом до db та просто навчитися використовувати SQL. Я і бачив, і чув про системи, де, скажімо, консультанти Oracle рекомендували тримати все можливе навантаження від сервера баз даних, що призводить до великого (і надзвичайно дорогого!) Програмного забезпечення з бездоганною роботою.
Крейг

4

Враховуючи всі вищезазначені випадки, я хотів би додати ще один. Вибір ІП може залежати і від вибору людей.

Я особисто відчуваю розчарування, коли люди вкладають в ІП дуже складну логіку, і я вважаю, що такі ІП дуже складні для підтримки та налагодження. Навіть у багатьох випадках сам розробник стикається з проблемою, коли налагодження коду позаду (скажімо, мовна частина) набагато простіше, ніж у SP.

SP слід використовувати лише для простих операцій. Ну, це мій вибір.


4

Я хочу висвітлити як деякі проблеми, так і проблеми зі збереженими документами. Ми широко їх використовуємо з LedgerSMB , і наше правило полягає в декількох дуже специфічних розширеннях, "якщо це запит, зробіть його збереженим процесом".

Наша причина для цього полягала в тому, щоб полегшити повторне використання мовних запитів. Немає кращого способу зробити це чесно.

Зрештою, питання завжди в деталях. Добре використовувані, зберігаються процедури значно полегшують роботу, а погано використовувані - значно ускладнюють.

Тож на протилежну сторону.

  1. Як традиційно використовують, зберігаються процедури крихкі. Використовуючи їх окремо, вони створюють можливість додавання помилок до вашого коду в місцях, яких ви не очікували з будь-якої причини, крім того, що синтаксис виклику змінився. Використовується окремо - це проблема. Існує занадто велика згуртованість між шарами, і це спричиняє проблеми.

  2. Так, можливо зробити ін'єкцію внутрішньо-sproc sql, якщо робити будь-який динамічний sql. Погано бути надмірно впевненим у цій галузі, і, отже, потрібно мати значний досвід у галузі безпеки в цій галузі.

  3. Зміни інтерфейсів дещо проблематичні із збереженими процедурами з причини № 1 вище, але це може стати дуже великим кошмаром, якщо задіяна велика кількість клієнтських додатків.

Вищезазначене досить важко заперечити. Вони бувають. У всіх, про-СП та анти-СП, мабуть, були страшилки щодо цього. Проблеми не є нерозв’язними, але якщо ви не звертаєте на них уваги, їх не вдається вирішити (у LedgerSMB ми використовуємо сервіс-локатор для динамічного збирання SP-дзвінків під час виконання, повністю уникаючи вказаних вище проблем. Поки ми PostgreSQL лише щось подібне можна було б зробити для інших db).

Про позитиви. Припускаючи, що ви можете вирішити вищезазначені проблеми, ви отримуєте:

  1. Можливість підвищення чіткості в заданих операціях. Це особливо вірно, якщо ваш запит дуже великий або дуже гнучкий. Це також призводить до посилення перевірки.

  2. Якщо у мене вже є локатор сервісів, що працює в цій галузі, я знаходжу збережені процедури, що прискорюють темпи розвитку, оскільки вони звільняють розробника додатків від проблем, пов'язаних з db, і навпаки. У цьому є певні труднощі в правильному виконанні, але це не так важко зробити.

  3. Повторне використання запиту.

О та кілька речей, які ви майже ніколи не повинні робити на ІП:

  1. не транзакційна логіка. Ви надіслали електронний лист про те, що замовлення було відправлено, але транзакція повернута назад ... або тепер ви чекаєте продовження, коли сервер електронної пошти вийде в Інтернет .... або ще гірше, ви скасуєте свою транзакцію лише тому, що не можете досягти сервер електронної пошти ....

  2. багато маленьких запитів, що з’єднуються, посипані процедурною логікою ....


Погодьтеся сильно, повторне: утримуйте поза транзакційні барахли зі зберігаються процедур. У цьому прикладі електронної пошти повідомлення електронної пошти має бути залишене у чергу та обслуговуватися асинхронно, у будь-якому разі. Поговоріть про те, як налаштувати себе на масштабний хіт продуктивності та прикольну поведінку під навантаженням, зробивши транзакції вашої бази даних залежними від реакції вашого поштового сервера? Yikes!
Крейг

3

на кого ти працюєш?

Відповідь може залежати від того, в кого ви працевлаштовані, консалтингової фірми або самої компанії. Найкраще для компанії це дуже часто не найкраще для консалтингової фірми чи іншого постачальника програмного забезпечення. наприклад, Розумна компанія бажає мати постійну перевагу перед конкурентами. На противагу цьому постачальник програмного забезпечення хоче мати можливість здійснити одне і те ж рішення для всіх підприємств певної галузі, за найменшу вартість. Якщо вони будуть успішними у цьому, чиста конкурентна перевага для клієнта не буде.

У цьому конкретному випадку програми приходять і виходять, але дуже часто корпоративна база даних працює вічно. Одна з головних речей, яку робить RDBMS, - це утримувати непотрібні дані від введення в базу даних. Це може включати збережені процедури. Якщо логіка є доброю логікою і малоймовірна, що вона змінюватиметься з року в рік, чому вона не повинна бути в базі даних, зберігаючи її внутрішньо узгодженою, незалежно від того, яку програму написано для використання бази даних? Через роки у когось виникне запитання, яке він хоче задати базі даних, і воно буде відповідати, якщо ушкодження буде заборонено входити в БД.

То, можливо, це має щось спільне з тим, що ваша DBA працює в консалтинговій фірмі. Чим портативніше вони можуть зробити свій код, тим більше вони можуть повторно використовувати код від клієнта до клієнта. Чим більше логіки вони зможуть зв’язати у своєму додатку, тим більше компанія вручена постачальнику. Якщо вони залишать після себе великий безлад, вони будуть отримувати гроші, щоб очистити його, або більше ніколи не побачать безлад. У будь-якому випадку це виграш для них.

введіть тут опис зображення

Для (багато) більшої дискусії з обох боків огорожі читайте дискусію на кодування жаху . FWIW Я схиляюся на бік тих, хто виступає за СП.


1
Ця відповідь зосереджена на прив’язці питання до того, використовувати чи не використовувати збережені процедури до питання, для кого ви працюєте, і які їх мотивації. Downvote. Натомість відповідь має зосереджуватись на зв’язуванні питання щодо того, використовувати чи не використовувати збережені процедури плюси та мінуси збережених процедур. Якби відповідь була зосереджена на ідеї, що SP-файли не дають бажанням входити в базу даних, я б не спростував. Я б не погоджувався в інтересах розголошення, але я б не виступав проти.
yfeldblum

Також ви пов’язали статтю від 2004 року, IMHO ландшафт з цього часу досить змінився. АБО / М стали набагато звичнішими. Ruby / Rails ActiveRecord, MS вийшли з linq & EF, Django для python тощо.
Брук

@ Джустіс, він має рацію, залежно від того, чи найкраща практика зберігання проектів залежить від того, хто є, і яку роль вони відіграють. Наприклад, збережені програми дозволяють вам встановлювати дозволи на програму, а не безпосередньо на таблиці. Якщо ви займаєтесь будь-якою фінансовою роботою та маєте враховувати внутрішній контроль, це єдиний життєздатний варіант захисту ваших даних від користувачів. Але якщо ви створюєте COTS продукти з можливими кількома копіями, вони занадто специфічні для бази даних. Якщо ви консалтингова фірма, можливо, вам доведеться розглянути кілька різних підходів як найкращі для обставин.
HLGEM

3
@HLGEM Я не заперечую проти жодного з пунктів, які ви порушили. Але я заперечую тезу відповіді, що головна причина, по якій DBA може ввести логіку в програму, полягає в тому, що він консультант і має намір накрутити замовника. Це пов'язує моральну позицію людини з його вибором, чи слід використовувати збережені процедури. На мою думку, існують технічні аргументи з обох сторін, і аргументи обох сторін будуть відрізнятися від застосування до застосування, технології до технології, від компанії до компанії, від галузі до галузі. І я спочатку шукатиму заслуги перед тим, як оскаржувати мотив.
yfeldblum

Він сказав, що працює в консалтинговій фірмі. Підтримка більшого контролю над кодом та збереженими процедурами, що розгортаються на сайті замовника, є цілком законною причиною, що це може бути їх "найкращою практикою". Можливо, це не "закрутити клієнта", але це може бути проблемою більшого контролю.
Джессі

3

Дуже важко перемикати бренди баз даних та використовувати однакові збережені процедури.

У вашої команди або немає DBA, і ніхто більше не хоче мати нічого спільного з sql.

Це не що інше, як змагання програмістів v DBA.


2

ІМО це залежить. Збережені процедури мають своє місце, але вони не є найкращою практикою, і не варто чогось уникати будь-якою ціною. Розумний розробник знає, як правильно оцінити дану ситуацію і визначити, чи є відповідь на збережену процедуру. Особисто я прихильник використання ORM якихось типів (навіть базових, таких як необроблений Linq до Sql), а не збережених процедур, за винятком, можливо, попередньо визначених звітів чи подібних, але знову ж таки це дійсно в кожному конкретному випадку.


Спортсмени коментують.
SandRock

2

Завжди є джерелом проблем, коли бізнес-логіка розбивається між різними шарами, використовуючи різні мови програмування. Відстежувати помилку або впроваджувати зміни набагато складніше, коли вам доведеться перемикатися між світами.

Однак, я знаю, що компанії, які працюють дуже добре, вкладають всю бізнес-логіку в PL / SQL пакети, що живуть у базі даних. Це не дуже великі програми, але теж не банальні; скажімо, 20K-100K LOC. (PL / SQL краще підходить для такої системи, ніж T-SQL, тому, якщо ви знаєте лише T-SQL, ви, ймовірно, хитаєте головою в невірі зараз ...)


2

Це ще один момент, про який ще не говорилося:

Інструменти генерації коду та інструменти зворотного інжинірингу справді не справляються із збереженими процедурами. Інструмент, як правило, не може сказати, що робить прок. Чи повертає програму набір результатів? Кілька наборів результатів? Чи отримує його набір результатів з декількох таблиць і тимчасових таблиць? Чи є Proc просто інкапсульованою заявою оновлення і нічого не повертає? Чи повертає він набір результатів, значення повернення та деякий "консольний вихід"?

Отже, якщо ви хочете використовувати інструмент для автоматичного створення об'єкта DTO і DAO-об'єкта для передачі даних (як, наприклад, "конструктор служб" liferay), ви не можете це легко зробити.

Більше того, такі ORM, як Hibernate, не можуть працювати належним чином, коли джерелом даних є SP. Доступ до даних у кращому випадку лише для читання.


Цікаво, що інструменти генерації коду, мабуть, важко розібратися, чи повертає збережена процедура набір результатів, коли сама збережена процедура з цим не має жодних проблем.
Крейг

2

Програмуючи соло, я не можу протистояти написанню збережених процедур.

Я в основному використовую MySQL. Я раніше не використовував об'єктно-орієнтовані бази даних, як, наприклад, PostGreSQL, але те, що я в змозі зробити з SP в MySQL, це трохи відтягнути структуру таблиці. SP дозволяють мені розробити ці примітивні дії, входи та виходи яких не зміняться , навіть якщо база даних, що знаходяться під ним , змінюється.

Отже, у мене називається процедура logIn. Коли ви входите в систему, ви завжди просто проходите usernameі password. Результат, переданий назад, - ціле число userId.

Коли logInце збережена процедура, тепер я можу додати додаткову роботу, яка повинна бути виконана при вході в систему, що відбувається одночасно з початковим входом. Я знаходжу серію SQL-операторів із вбудованою логікою у збереженій процедурі, простішою для запису, ніж (виклик середовище FETCH) -> (отримати результат) -> (викликає середовище FETCH) серії, що вам потрібно зробити, коли ви пишете свою сторону логічного сервера.


1

Хочу також зазначити, що збережені процедури дійсно використовують час процесора на сервері. Не багато, але деякі. Деякі роботи, виконані в робочій процедурі, можна виконати в додатку. Простіше масштабувати рівень програми, ніж рівень даних.


3
Важко масштабувати базу даних?
JeffO

1
Це принаймні значно дорожче (якщо не ваш MySQL), і в багатьох місцях я працював над тим, щоб отримати ще одну ліцензію на SQL Server Enterprise Edition - це як витягнути зуби
ben f.

База даних масштабування не складніше, ніж масштабування кінця історії на рівні програми
Брайан Огден

1

Я погоджуюся з Марком, що громада вже досить давно відходить від збережених процедур. Незважаючи на те, що багато пунктів, на яких піднімався оригінальний плакат, чому ми, можливо, хочемо використовувати SP, були дійсними свого часу, минуло досить багато часу, і, як сказав інший плакат, середовище змінилося. Наприклад, я пам’ятаю, що одним із аргументів ЗА використання СП «назад у той день» було досягнуто підвищення продуктивності, оскільки їх плани виконання були «заздалегідь складені», тоді як динамічний SQL з нашого коду повинен був «перекомпілюватися» при кожному виконанні. Це вже не так, оскільки основні бази даних змінювалися, вдосконалювалися, адаптувалися тощо.

Але це означає, що ми використовуємо SP в моєму поточному проекті. Причина полягає лише в тому, що ми будуємо нові програми на основі існуючої бази даних, яка все ще підтримує застарілі програми. Як результат, змінити схему дуже важко, поки ми не вимкнемо застарілі програми. Ми прийняли свідоме рішення розробити наші нові програми на основі поведінки та правил, необхідних для програми, та використовувати SP для тимчасового взаємодії з базою даних так, як ми хотіли б, і дозволимо SP-серверам адаптуватися до існуючих SQL . Це стосується попереднього плаката, що SP-програми полегшують внесення змін на рівні бази даних, не вимагаючи змін до коду програми. Використання SP-файлів як реалізації шаблону адаптера, безумовно, має для мене сенс (особливо, враховуючи мій поточний проект),

Fwiw, ми маємо намір видалити SP, коли схема оновлюється. Але, як і у всьому іншому в корпоративному розвитку, ми побачимо, чи це станеться! [усмішка]


0

Я просто хотів зробити короткий огляд того, як я б рекомендував використовувати збережені процедури. Я не думаю, що вони взагалі є поганою практикою, і, як інші казали, їх слід використовувати у відповідних ситуаціях.

Я бачу проблеми, коли процедури написання для різних додатків можуть заплутатися у функціональності та відокремити ділову логіку програми та призвести до того, що база даних також стане більш неорганізованою та обмежуючою.

Тому я використовував би збережену процедуру у реляційних завданнях, орієнтованих на дані, специфічні для бази даних. Іншими словами, якщо для операцій з базою даних є логіка, яка відповідає даним для будь-якої програми, для збереження даних, що зберігаються, має сенс використовуватись збережена процедура. Я думаю, що добрими прикладами цього є: послідовне ведення журналів, послідовне обслуговування, робота з конфіденційною інформацією тощо.

Інші завдання - маніпулювати даними, щоб відповідати потребам програми, що слідує за сильною моделлю даних бази даних, я думаю, потім слід зберігати в іншому шарі, що містить бізнес-логіку. Коротше кажучи, маніпулювання конкретними базами даних для узгодженості може використовувати збережені процедури, коли узгодженість поширюється на повну модель схеми цілісності бази даних.


-1

Збережені процедури "для мене" підходять для операцій OLAP "лише для читання", рідкісне використання.

Для бізнес-правил, операцій з читання / запису OLTP я віддаю перевагу серверам додатків Java. Для зручності кодування та максимального зменшення завантаження процесора та пам'яті з майстер-серверів db. У цьому налаштуванні весь код на серверах прикладних програм не є складним для перегляду або реєстрації та його масштабування.

Важливим для мене є простіше налагодження в бізнес-шарі, ніж налагодження збережених процедур.


Ви зробили кілька припущень: що ОП потребує ОЛАП (не зазначено у запитанні); що платформа, що використовується, має сервери додатків Java (малоймовірно, оскільки тег стосується SQL Server). Ви відповідаєте також не приносить нічого, що інші 22 відповіді вже не охоплювали
Адам Цукерман

Я просто говорив, що якщо я запускаю новий проект, використовую збережену процедуру рідко для операцій лише для читання, лише для особистого вибору. Мені зручніше робити більшість кодувань на рівні бізнес-логіки замість рівня даних.
jaizon lubaton

це, здається, не пропонує нічого суттєвого щодо питань, викладених та пояснених у попередніх 24 відповідях, навряд чи вміст, на який варто натрапити на 4-річне запитання
gnat

-2

Окрім того, що без потреби поширювати бізнес-логіку та прив’язувати вас до конкретного постачальника баз даних, я також твердо вірю у використання технології для того, що було призначено. База даних - саме це, реляційний сховище даних. Використовуйте його для зберігання даних, нічого іншого.

Вибирайте свої інструменти розумно, і ви врятуєте себе в світі рани з часом.


якщо ви збираєтесь брати участь у голосі, тоді зробіть це, але принаймні поясніть, чому.
Ніко

ймовірно, тому, що ви помиляєтесь. SP не означає, що ви пишете код там, просто записуєте запити щодо доступу до даних (я думаю, що в 99% випадків). Крім того, просто встановлення тригерів і обмежень на модель даних вважається «кодом» - тобто оперативною логікою, а не даними. Звідси мій погляд, що ви помиляєтесь.
gbjbaanb

Де ви встановлюєте перетворення ваших збережених даних, окрім бази даних?
Кріс Траверс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.