2010-10-28 14 views
5

Ho due basi di dati sulla stessa SQL Server:Come configurare una stored procedure per accedere a una tabella in un altro database

database Un

  • tabella 1
  • tabella 2
  • sproc x

Database B

  • tabella 3
  • tabella 4
  • sproc y
  • sproc z

Voglio dare accesso user1 al database, ma solo attraverso il permesso di esecuzione sulle sprocs.

  • sproc x ha un join tra la tabella 1 & 2, e user1 può eseguire.
  • sproc y fa un join tra le tabelle 3 & 4 e user1 può essere eseguito.
  • sproc z ha un join tra le tabelle 1 & 4, e user1 non è in grado di eseguire, a meno che non autorizzo SELECT per tabella 1. Perché è questo?

Non voglio concedere il permesso di selezione, perché questo rompe il modello di sicurezza di "accedere solo al database tramite sprocs"

risposta

3

Potrebbe essere necessario abilitare cross database ownership chaining per entrambi i database.

per vedere se è abilitato:

select name, is_db_chaining_on 
    from sys.databases 

per attivare l'impostazione:

EXEC sp_dboption 'DatabaseA', 'db_chaining', 'true'; 
GO 

EXEC sp_dboption 'DatabaseB', 'db_chaining', 'true'; 
GO 
+0

Non è stato abilitato ... Ho abilitato per i database i miei sprocs in cui tentare di accedere e sembra funzionare. Grazie! –

+0

Da quando mi sono imbattuto in questo con alcuni database recenti, alcuni elementi aggiuntivi da verificare.1) Rendi il proprietario del database uguale per entrambi i database 2) Assicurati che lo stesso utente/gruppo esista in entrambi i database –

1

Ho avuto esattamente questo problema, ma nel mio caso la soluzione era quella di aggiornare i due database per avere lo stesso proprietario.

Se i database appartengono allo stesso proprietario, non è necessario attivare esplicitamente il concatenamento della proprietà (poiché i proprietari sono la stessa cosa).

Grande articolo su questo qui: [http://www.sommarskog.se/grantperm.html][1]

È possibile aggiornare la proprietà di un database utilizzando sp_changedbowner o la "ALTER autorizzazione" economico versione più recente.

+0

Questo è successo solo con alcuni database recenti che abbiamo creato - abbiamo dimenticato di cambiare il proprietario in SA e le opzioni db_chaining nel l'altro esempio non ha funzionato. Non appena abbiamo cambiato il proprietario in SA, ha funzionato. Nota abbiamo ancora bisogno di impostare db_chaining su true –

Problemi correlati