jh
2008-09-23 21:53:36 UTC
Firebird 2.1, Delphi 2007 Pro
Mam pytanie do tych, co to więcej ode mnie potrafią i zechcieliby się
podzielić wiedzą. Pracując nad większym (jak na jednego developera)
projektem, gdybam, gdzie lepiej zaszyć logikę biznesową: co po stronie
aplikacji, a co w bazie i gdzie. Dwa przykłady:
1.
Chcę mieć minimalną długość łańcucha w określonym polu. Mogę więc dać check
dla pola, który korzysta z wbudowanej funkcji CHAR_LENGTH. Przy naruszeniu
zasady baza wyrzuca mi wyjątek z własnym anglojęzycznym komunikatem, który z
warunków został naruszony. Mogę wsadzić to sprawdzanie do triggera before
insert/update i po sprawdzeniu długości wywołać wyjątek, który może już
zawierać mój, zdefiniowany w bazie tekst (EXCEPTION). W aplikacji mogę
oczywiście przechwycić ten wyjątek i tam nadać mu odpowiednią treść.
Zakładając, że jedyną dostępową aplikacją będzie moja (Win32) mogę w
zasadzie przenieść tego typu zasady właśnie do aplikacji. Ale jeśli
chciałbym dorobić front-end webowy, to teoretycznie pozostawienie tej
obsługi w bazie da mi niezależność od tejże aplikacji. Piszę -
teoretycznie - bo, aż takiego doświadczenia nie mam i pewnie wielu rzeczy
nie przewidzę.
2.
Mam wlasny sposób logowania userów. W bazie użytkowników serwera
(security2.fdb) przewiduje trzech userów, każdy związany z różnymi
aplikacjami dostępowymi - user typu system dla narzędzi backupowych itp.,
admin i "zwykły" user, czyli dla normalnej pracy z bazą. W bazie mam obsługę
użytkowników zdefiniowaną jako tabele z loginami etc. Czyli użytkownicy
serwera to de facto konta dla aplikacji, a aplikacje mogą wywoływać
dodatkowy proces logowania na użytkownika bazy. To logowanie mam powiązane z
triggerami dla całej bazy, więc mam sesje i w ramach sesji logowania
użytkowników, co jest niezbędne dla wymogów systemu. I sedno sprawy: po
zalogowaniu aplikacji do serwera jako "zwykły user", użytkownik przed
dokonywaniem jakichkolwiek operacji powinien się zalogować na swoje konto.
No i tu podobne pytanie: czy lepiej to realizować po stronie aplikacji
(prościej blokować operacje, jeżeli user nie zalogował się) czy też
właściwie w każdym triggerze dla tabel i w procedurach dawać sprawdzanie,
czy użytkownik jest zalogowany. To drugie w pewnym sensie obliguje moje
"zalogowanie się", kiedy ktoś (np. lokalny admin systemu) chciałby na szybko
dokonać zmian bezpośrednio podłączając się do serwera chociażby IBExpertem
czy podobnym narzędziem. Oczywiście zabezpieczenie żadne, ale upierdliwe ;)
Dotąd, w prostych projektach wystarczyło (i było szybsze w implementacji)
zaszywać taką logikę w aplikacji. Ale po niedawnym kontakcie z dosyć dużym
systemem opartym na Oracle'u dowiedziałem się, że w zasadzie w bazie jest
zaszyta cała funkcjonalność aplikacji klienta, począwszy od nazw funkcji,
menu, przez całą logikę do wyglądu formatek i niemalże działania tejże
aplikacji. No i tak zastanawiam się, gdzie powinna leżeć ta granica podziału
logiki w aplikacji dwuwarstwowej między RDBMS a programem klienckim?
jh
Mam pytanie do tych, co to więcej ode mnie potrafią i zechcieliby się
podzielić wiedzą. Pracując nad większym (jak na jednego developera)
projektem, gdybam, gdzie lepiej zaszyć logikę biznesową: co po stronie
aplikacji, a co w bazie i gdzie. Dwa przykłady:
1.
Chcę mieć minimalną długość łańcucha w określonym polu. Mogę więc dać check
dla pola, który korzysta z wbudowanej funkcji CHAR_LENGTH. Przy naruszeniu
zasady baza wyrzuca mi wyjątek z własnym anglojęzycznym komunikatem, który z
warunków został naruszony. Mogę wsadzić to sprawdzanie do triggera before
insert/update i po sprawdzeniu długości wywołać wyjątek, który może już
zawierać mój, zdefiniowany w bazie tekst (EXCEPTION). W aplikacji mogę
oczywiście przechwycić ten wyjątek i tam nadać mu odpowiednią treść.
Zakładając, że jedyną dostępową aplikacją będzie moja (Win32) mogę w
zasadzie przenieść tego typu zasady właśnie do aplikacji. Ale jeśli
chciałbym dorobić front-end webowy, to teoretycznie pozostawienie tej
obsługi w bazie da mi niezależność od tejże aplikacji. Piszę -
teoretycznie - bo, aż takiego doświadczenia nie mam i pewnie wielu rzeczy
nie przewidzę.
2.
Mam wlasny sposób logowania userów. W bazie użytkowników serwera
(security2.fdb) przewiduje trzech userów, każdy związany z różnymi
aplikacjami dostępowymi - user typu system dla narzędzi backupowych itp.,
admin i "zwykły" user, czyli dla normalnej pracy z bazą. W bazie mam obsługę
użytkowników zdefiniowaną jako tabele z loginami etc. Czyli użytkownicy
serwera to de facto konta dla aplikacji, a aplikacje mogą wywoływać
dodatkowy proces logowania na użytkownika bazy. To logowanie mam powiązane z
triggerami dla całej bazy, więc mam sesje i w ramach sesji logowania
użytkowników, co jest niezbędne dla wymogów systemu. I sedno sprawy: po
zalogowaniu aplikacji do serwera jako "zwykły user", użytkownik przed
dokonywaniem jakichkolwiek operacji powinien się zalogować na swoje konto.
No i tu podobne pytanie: czy lepiej to realizować po stronie aplikacji
(prościej blokować operacje, jeżeli user nie zalogował się) czy też
właściwie w każdym triggerze dla tabel i w procedurach dawać sprawdzanie,
czy użytkownik jest zalogowany. To drugie w pewnym sensie obliguje moje
"zalogowanie się", kiedy ktoś (np. lokalny admin systemu) chciałby na szybko
dokonać zmian bezpośrednio podłączając się do serwera chociażby IBExpertem
czy podobnym narzędziem. Oczywiście zabezpieczenie żadne, ale upierdliwe ;)
Dotąd, w prostych projektach wystarczyło (i było szybsze w implementacji)
zaszywać taką logikę w aplikacji. Ale po niedawnym kontakcie z dosyć dużym
systemem opartym na Oracle'u dowiedziałem się, że w zasadzie w bazie jest
zaszyta cała funkcjonalność aplikacji klienta, począwszy od nazw funkcji,
menu, przez całą logikę do wyglądu formatek i niemalże działania tejże
aplikacji. No i tak zastanawiam się, gdzie powinna leżeć ta granica podziału
logiki w aplikacji dwuwarstwowej między RDBMS a programem klienckim?
jh