SQL Tips & Tricks, permessi tra database
Quando si crea un database di warehouse, che consolida informazioni da varie sorgenti, può essere richiesto di impostare dei criteri di sicurezza per l’accesso ai dati. Se le informazioni si trovano in database differenti è necessario che l’utente abbia accesso esplicito a tutte le tabelle che saranno interrogate.
Ma, se si vuole proteggere una tabella di un database esponendola tramite una vista filtrata in un altro database, l’attribuzione dei permessi crea un problema di sicurezza. L’utente infatti può vedere tutti i dati (anche quelli non filtrati) semplicemente accedendo alla tabella originale.
Immaginiamo di avere la tabella “Entries” nel database “DB1” e di esporla come vista “Your Entries” nel database “DB2”:
1 2 |
CREATE VIEW [Your Entries] AS SELECT * FROM [DB1].dbo.[Entries] WHERE [username] = SYSTEM_USER |
SQL Server permette di evitare il controllo di accesso tra database che hanno lo stesso proprietario. Questa tecnica consente di attribuire permessi alla vista “Your Entries” senza doverli concedere anche alla tabella “Entries” da cui dipende.
Per prima cosa è necessario attivare l’ownership chaining sul server:
1 2 3 4 |
EXECUTE sp_configure 'show advanced', 1; RECONFIGURE; EXECUTE sp_configure 'cross db ownership chaining', 1; RECONFIGURE; |
Infine si attiva l’ownership chaining su ogni database:
1 2 |
ALTER DATABASE DB1 SET DB_CHAINING ON; ALTER DATABASE DB2 SET DB_CHAINING ON; |
Nel caso in cui il proprietario dei database sia diverso, lo si può cambiare con questa stored procedure:
1 |
EXEC sp_changedbowner 'MyName'; |