Per quanto riguarda la prevenzione dell'accesso, gli schemi di database potrebbero essere utili. Gli schemi possono essere creati e l'accesso può essere concesso a specifici utenti di database, che escludono account a livello di dominio come SA e così via. Quando viene creato il database, gli script di creazione potrebbero essere dinamici per consentirne.
Example: Database1.ClientX.Table1
Database2.ClientY.Table1
Se a un utente del database non è stato concesso l'accesso allo schema ClientX, non è stato possibile visualizzare alcun database, indipendentemente dal livello di privilegio del sistema DBMS. Ovviamente un utente aveva un alto privilegio poteva darsi accesso a quello schema, ma presumo che ci sia un po 'di fiducia data ai pochi DBA che hanno effettivamente queste autorizzazioni.
Per quanto riguarda la crittografia, probabilmente una sorta di strato middleware sicuro sarebbe la migliore. Ogni livello del middle ware potrebbe avere una chiave privata diversa, in modo che non possano decrittografare gli altri dati. In questo modo non dovresti memorizzare le chiavi su ciascun client, ma sul livello intermedio, magari in un file di configurazione o qualcosa del genere.
Le chiavi per crittografare i dati sarebbero state probabilmente crittografate, quindi se qualcuno avesse avuto accesso al server, le avrebbe potute semplicemente afferrare e collegare fino al livello intermedio e vedere tutto. Chi ha accesso a quelle chiavi, qualcuno di cui ci si fida.
Client X Data- MiddleWare Layer X Encrypt/Decrypt- Database X
Client Y Data- MiddleWare Layer Y Encrypt/Decrypt - Database Y
Un'istanza DB separata sarebbe la più sicura.