Коли не використовувати ORM і віддавати перевагу збереженим процедурам?


13

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

Я хочу знати, коли не використовувати ORM за збереженими процедурами / тригерами і навпаки.


6
Особисто моя проблема тригерів (зокрема, не стосується збережених процедур) полягає в тому, що вони намагаються "здогадатися", що таке "ділова дія" сталася з того, як обробляються дані в БД. Якщо ви модифікуєте стовпець PRICE у таблиці "ARTICLES", то ви не знаєте, чому це так. Користувач просто виправляє помилкове значення? Це націнка? Це спеціальна пропозиція, яка триває лише добу? Тригери повинні все це здогадатися .
Йоахім Зауер

Відповіді:


16

ORM (Об'єктно-реляційне відображення) не є взаємовиключними із збереженими процедурами. Більшість ORM можуть використовувати збережені процедури. Більшість ORM генерують збережені процедури, якщо ви вирішите. Тож це питання не є або.

ORM можуть генерувати неприйнятний SQL (з точки зору продуктивності), а іноді, можливо, ви захочете замінити цей SQL на створений вручну SQL. Один із способів досягти цього - за допомогою SP (збережених процедур).

У DotNet не використовуйте збережені процедури, якщо:

  • Якщо ви не знайомі зі збереженими процедурами (не ваш випадок, але включені для повноти).

  • Якщо ви не хочете вносити у свій проект шар складності та перекладу.

  • Ви створюєте додаток, який повинен працювати з різними базами даних або мав би бути тиражований на декількох серверах баз даних (останнє обмеження може застосовуватися лише для деяких баз даних).

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

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

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


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

@MainMa, дякую за ваш коментар Я розумію, що за допомогою SP-файлів можна знизити ризик ін'єкції SQL, використовуючи параметризовану збережену процедуру із вбудованими параметрами, як пропонує ця стаття: palpapers.plynt.com/isissue/2006Jun/injection-stored-procedures
NoChance

2
Збережені процедури практично не впливають на вразливість до sql ін'єкційних атак. Старі міфи важко вмирають.
Риг

@ Rig 1, дякую за ваш коментар, я хочу дізнатися більше про те, що ви думаєте про це. Моє розуміння випливає з цього тексту (принаймні): "Ви можете перешкодити атакам ін'єкцій SQL Server, використовуючи збережені процедури та параметризовані команди, уникаючи динамічного SQL та обмежуючи дозволи для всіх користувачів." що з'являється у msdn.microsoft.com/en-us/library/bb669057.aspx
NoChance

@EmmadKareem Параметризований sql - це великий крок до того, щоб зробити його безпечним. Я думаю, що цей хлопець робить розумний випадок palpapers.plynt.com/issues/2006Jun/injection-stored-procedures . Пошук на ньому "Зберігання процедури SQL Injection" призведе до багатьох звернень. Завжди добре санітувати свої вкладення, і багато платформ забезпечують вбудований спосіб зробити це досить добре.
Rig

13

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

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

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

Остерігайтеся інтерфейсу командного рядка dbms, якщо ви використовуєте "непроникний" DAL.


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

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


-2

Тригер повинен використовуватися як інваріант запису або складатися з життєво важливих правил бізнесу, IMHO.

Проблеми орм:

  1. Ви повинні встановлювати дозволи на таблиці, а не на "Дія" (я маю на увазі SP)
  2. Щоб змінити логіку свого рішення, вам потрібно змінити код всередині програми та перерозподілити його по мережі для клієнтів

-5

Не згоден. ORM запит лише простіший, якщо ви знаєте ORM краще, ніж ви знаєте SQL. ORM призводить до набагато більшого коду, набагато складніше у підтримці ІМО. Єдиними людьми, які отримують вигоду від ORM, є акціонери компанії, що продає ORM (наприклад, Microsoft).


1
Дуже шкода, що думка, висловлена ​​у цій відповіді, не підкріплена ні посиланнями, ні досвідом. Як результат, читачеві, який може натрапити на "обернену" заяву, схоже, що зберігаються процедури приносять користь лише постачальникам БД . Змушує згадати , чому керівництво в реальних питання є відповіді держави: «реальні питання є відповіді , а НЕ предмети або ідеї або думки ... »
комар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.