Normalmente evito gli sProcs il più possibile. Non mi piace che il linguaggio sia TSQL o PL / SQL; sembrano arcaici contro Java / Dot-Net che uso. Vado per loro quando una routine ha bisogno di recuperare un sacco di dati, crunch e generare un piccolo insieme di output. Sedersi all'interno del DB rende il processo di recupero molto veloce, senza successo di rete. Ma questo è tutto.
Recentemente mi sono imbattuto in un progetto DAL in cui tutte le operazioni CURD erano state implementate in Stored Procedures. In realtà uno sProc gigante per essere precisi. Ecco lo scheletro:
PROCEDURE myGenericProc(int QueryNo, varchar genericParam1, ..., varchar genericParamN)
BEGIN
SWITCH queryNo
CASE 1
SELECT * FROM table1 INNER JOIN table 2 ON ...
CASE 2
DELETE FROM table 3 WHERE ...
...
CASE n
UPDATE table4 SET a=b WHERE ...
END
La logica del progettista dietro questo è: se faccio queste cose nel codice, quindi la connessione al database deve avere pieni diritti su tutte le tabelle. Le credenziali di connessione sono generalmente nella stringa di connessione, che si trova sul server delle applicazioni. Se il server delle applicazioni viene compromesso, inevitabilmente anche l'intero DB viene compromesso.
In alternativa, disponi di tutte le query nello sProc, quindi concedi a sProc i diritti completi. Chiama solo che sProc. In questo modo, anche se il server delle applicazioni è compromesso, solo l'interfaccia sProc può essere attaccata. Nessuno può fare DROP users_master
.
Mentre sono d'accordo con il principio, odio l'implementazione. Sfortunatamente, alcuni clienti paranoici di sicurezza (banche) vogliono che facciamo esattamente questo. Inoltre, i DBA odiano i privilegi di accesso di ottimizzazione su 200+ sProcs, vogliono articoli il più possibile non verificabili.
Domanda:
Esiste un'altra implementazione che fornisce lo stesso livello di sicurezza, ma è più più pulita ?