Kilka uwag
Procedury przechowywane zapewniają ponowne użycie kodu i enkapsulację (dwa filary rozwoju oprogramowania),
Tylko jeśli użyjesz ich poprawnie w kontekście, w którym mają być używane. To samo twierdzenie można powiedzieć o funkcjach (w programowaniu strukturalnym) lub metodach (w programowaniu obiektowym), a jednak widzimy funkcje 1K i obiekty mega-ass.
Artefakty nie dają tych korzyści. Właściwe użycie tych artefaktów daje te korzyści.
bezpieczeństwo (możesz udzielić / cofnąć uprawnienia dla pojedynczego przechowywanego proc),
Tak. To dobra uwaga i jeden z głównych powodów, dla których lubię procedury składowane. Zapewniają bardziej szczegółową kontrolę dostępu niż to, co zwykle można osiągnąć za pomocą samych widoków i kont użytkowników.
chronić cię przed atakami iniekcyjnymi SQL,
Nie jest to specyficzne dla SP, ponieważ można osiągnąć ten sam poziom ochrony dzięki sparametryzowanym instrukcjom SQL i czyszczeniu danych wejściowych. Chciałbym jednak używać SP oprócz tych, ponieważ jest to kwestia „głębokiego bezpieczeństwa” .
a także pomoc w szybkości (chociaż DBA powiedział, że począwszy od SQL Server 2008, nawet regularne zapytania SQL są kompilowane, jeśli są uruchamiane wystarczająco dużo razy).
Jest to ściśle zależne od dostawcy bazy danych, ale ogólnie rzecz biorąc, Twój DBA ma rację. Instrukcje SQL (statyczne lub parametryzowane) są kompilowane. SP pomagają, jeśli chcesz / potrzebujesz agregować i obliczać dane, których nie możesz zrobić za pomocą prostych instrukcji SQL, ale są ściśle zintegrowane z SQL i nie gwarantują powrotu do serwera aplikacji.
Dobrym przykładem jest zapytanie danych do tymczasowego kursora (lub kursorów), z którego można uruchomić inny sam SQL. Możesz to zrobić programowo na serwerze aplikacji lub możesz zapisać wiele podróży w obie strony, robiąc to w db.
Nie powinno to jednak być normą. Jeśli masz wiele takich przypadków, oznacza to, że projekt bazy danych jest zły (lub pobierasz dane z niezbyt zgodnych schematów bazy danych w różnych działach).
Tworzymy złożoną aplikację przy użyciu metodologii tworzenia oprogramowania Agile.
Zwinność dotyczy procesów inżynierii oprogramowania i zarządzania wymaganiami, a nie technologii.
Czy ktoś może wymyślić dobre powody, dla których nie chciałby korzystać z przechowywanych procesów?
Złe pytanie
Pytanie jest błędne i równoznaczne z pytaniem „czy istnieją dobre powody, aby nie używać GOTO”? Popieram ten temat z Niklausem Wirthem bardziej niż z Dijkstrą. Rozumiem, skąd się wziął sentyment Dijkstry, ale nie sądzę, aby miał on zastosowanie w 100% we wszystkich przypadkach. To samo dotyczy procedur sklepowych i dowolnej technologii.
Narzędzie jest dobre, gdy jest dobrze używane zgodnie z przeznaczeniem i jest najlepszym narzędziem do określonego zadania. Używanie go w inny sposób nie oznacza, że narzędzie jest złe, ale że posiadacz nie wie, co robi.
Prawidłowe pytanie brzmi: „jakiego rodzaju wzorców użycia procedur składowanych należy unikać”. Lub „pod jakimi warunkami powinienem (lub nie powinienem) stosować procedur przechowywanych” . Szukanie powodów, dla których nie należy korzystać z technologii, to po prostu obwinianie narzędzia, a nie odpowiedzialność inżyniera dokładnie tam, gdzie należy - inżyniera.
Innymi słowy, jest to przekręt lub oświadczenie o ignorancji.
Domyślam się, że DBA nie chcieli utrzymywać tych przechowywanych proc, ale wydaje się, że istnieje zbyt wiele negatywów, aby uzasadnić taką decyzję projektową.
To, co robią, to rzutowanie wyników złych decyzji inżynieryjnych na narzędzia, których źle używali.
Co robić w twoim przypadku?
Moje doświadczenie polega na tym, że w Rzymie postępujcie tak, jak Rzymianie .
Nie walcz z tym. Jeśli ludzie w Twojej firmie chcą oznaczyć procesy sklepowe jako złą praktykę, pozwól im. Należy jednak pamiętać, że może to być czerwona flaga w ich praktykach inżynierskich.
Typowe etykietowanie rzeczy jako złych praktyk jest zwykle wykonywane w organizacjach z mnóstwem niekompetentnych programistów. Umieszczając na czarnej liście niektóre rzeczy, organizacja stara się ograniczyć szkody wyrządzone wewnętrznie przez własną niekompetencję. Nie gówno mnie.
Uogólnienia są matką wszystkich wpadek. Mówienie, że przechowywane procy (lub jakikolwiek rodzaj technologii) to zła praktyka, to uogólnienie. Uogólnienia są wyłudzeniami dla niekompetentnych. Inżynierowie nie pracują z rażącymi uogólnieniami. Wykonują analizy indywidualnie dla każdego przypadku, dokonują analizy kompromisów i wykonują decyzje i rozwiązania inżynierskie zgodnie z faktami, w kontekście, w którym mają rozwiązać problem.
Dobrzy inżynierowie nie określają rzeczy jako złej praktyki w tak uogólniony sposób. Patrzą na problem, wybierają odpowiednie narzędzia, dokonują kompromisów. Innymi słowy, zajmują się inżynierią.
Moja opinia o tym, jak ich nie używać
Nie umieszczaj w nich złożonej logiki poza gromadzeniem danych (i być może niektórymi transformacjami). Można w nich umieścić logikę masowania danych lub zsumować z nimi wynik wielu zapytań. Ale to jest o tym. Cokolwiek poza tym kwalifikuje się jako logika biznesowa, która powinna znajdować się gdzie indziej.
Nie używaj ich jako jedynego mechanizmu obrony przed wstrzyknięciem SQL. Zostawiasz je tam na wypadek, gdyby coś złego im się przydarzyło , ale przed nimi powinna być logika obronna - walidacja / szorowanie po stronie klienta, walidacja / szorowanie po stronie serwera, ewentualnie transformacja w typy, które mają sens w twoim model domeny, a na koniec przekazywane do sparametryzowanych instrukcji (które mogą być sparametryzowanymi instrukcjami SQL lub sparametryzowanymi przechowywanymi proc.)
Nie rób baz danych jedynym miejscem zawierającym informacje o sklepach. Procesy sklepu powinny być traktowane tak samo, jak traktujesz kod źródłowy C # lub Java. Oznacza to, że kontroluj źródła tekstową definicją Twojego sklepu. Ludzie twierdzą, że procesy sklepowe nie mogą być kontrolowane przez źródło - byk, po prostu nie wiedzą o czym, do diabła, mówią.
Moja opinia o tym, jak / gdzie ich używać
Twoja aplikacja wymaga transponowania lub agregacji danych z wielu zapytań lub widoków. Możesz odciążyć to z aplikacji do bazy danych. W tym przypadku musisz wykonać analizę wydajności, ponieważ a) silniki baz danych są bardziej wydajne niż serwery aplikacji, ale b) serwery aplikacji są (czasami) łatwiejsze do skalowania w poziomie.
Kontrola dostępu do drobnych ziaren. Nie chcesz, żeby jakiś idiota prowadzący połączenia kartezjańskie w twojej bazie danych, ale nie możesz po prostu zabronić ludziom wykonywania dowolnych instrukcji SQL w ten sposób. Typowym rozwiązaniem jest dopuszczanie dowolnych instrukcji SQL w środowiskach programistycznych i UAT, przy jednoczesnym zabronieniu ich w środowisku systest i produkcyjnym. Każde oświadczenie, które musi przejść do systestu lub produkcji, przechodzi do procedury sklepu, sprawdzanej zarówno przez programistów, jak i dbas.
Każda ważna potrzeba uruchomienia instrukcji SQL spoza procesu sklepu przechodzi przez inną nazwę użytkownika / konto i pulę połączeń (użycie jest wysoce monitorowane i odradzane).
- W systemach takich jak Oracle można uzyskać dostęp do LDAP lub tworzyć dowiązania symboliczne do zewnętrznych baz danych (np. Wywoływanie proc. Sklepu na db partnera biznesowego przez vpn.) Łatwy sposób na zrobienie kodu spaghetti, ale dotyczy to wszystkich paradygmatów programowania, a czasem masz określone wymagania biznesowe / środowiskowe, dla których jest to jedyne rozwiązanie. Procesy sklepu pomagają zawrzeć tę nieprzyjemność w jednym miejscu, blisko danych i bez konieczności przechodzenia do serwera aplikacji.
To, czy uruchomisz to na db jako procesorze sklepu, czy na serwerze aplikacji, zależy od analizy kompromisowej, którą musisz wykonać jako inżynier. Obie opcje muszą zostać przeanalizowane i uzasadnione pewnym rodzajem analizy. Idąc w tę lub inną stronę, po prostu oskarżając inną alternatywę jako „złą praktykę”, jest to po prostu kiepska inżynieria.
- W sytuacjach, w których po prostu nie można skalować serwera aplikacji (np. Brak budżetu na nowy sprzęt lub wystąpienia w chmurze), ale z dużą ilością miejsca na zapleczu db (jest to bardziej typowe, że wiele osób chce to przyznać), opłaca się przenieść logikę biznesową do przechowywania proc. Nie ładna i może prowadzić do anemicznych modeli domen ... ale z drugiej strony ... analiza kompromisowa, rzecz, do której wciąga większość hacków oprogramowania.
Niezależnie od tego, czy stanie się to trwałym rozwiązaniem, czy nie, jest to specyficzne dla ograniczeń zaobserwowanych w danym momencie.
Mam nadzieję, że to pomoże.