[SQL 2005]Dare permesso di sola lettura a singole tabelle per un accou...

martedì 09 febbraio 2010 - 10.21

symonx80 Profilo | Junior Member

Ciao,
ho necessità di creare un account SQL Server2005 con diritti di sola lettura per determinate tabelle e/o viste di uno schema db.
Son riuscito a crearlo e dargli i permessi di sola lettura per lo schema A e vorrei sapere se è possibile dargli i permessi di sola lettura solamente alla tabella A.anagrafica e non fargli vedere la tabella A.fatture.
Al momento lui può vedere tutte le tabelle..

lbenaglia Profilo | Guru

>ho necessità di creare un account SQL Server2005 con diritti
>di sola lettura per determinate tabelle e/o viste di uno schema
>db.
>Son riuscito a crearlo e dargli i permessi di sola lettura per
>lo schema A e vorrei sapere se è possibile dargli i permessi
>di sola lettura solamente alla tabella A.

Ciao Simone,

Uno schema puoi paragonarlo ad uno "scatolone" che contiene "cose".
Se assegni un permesso ad uno schema, implicitamente lo assegnerai a tutti gli oggetti in esso contenuti.

Quindi, se devi assegnare permessi a singoli oggetti di uno stesso schema, togli tutti i permessi allo schema e assegna quelli strettamente necessari agli oggetti di tuo interesse.

Questa operazione puoi farla utilizzando il comando GRANT:
http://msdn.microsoft.com/en-us/library/ms188371.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

symonx80 Profilo | Junior Member

Grazie.
In realtà io ho creato l'account tramite l'apposita finestra di creazione e nella schermata di USER MAPPING ho selezionato il database di interesse flaggando le voci db_datareader,db_denydatawriter e public.
Ma mi sta venendo il dubbio che l'account e l'user siano due cose differenti.. ho tolto il flag al database dall USER MAPPING del mio utente TESTER creato e ho provato ad eseguire il comando
GRANT SELECT ON DBSCHEMA.DBO.anagrafica TO TESTER
ma il risulatato è stato il seguente

'Msg 15151, Level 16, State 1, Line 1
Impossibile trovare l'oggetto 'TESTER' di tipo utente, perché inesistente o perché non si dispone dell'autorizzazione.'

dove sbaglio?

lbenaglia Profilo | Guru

>In realtà io ho creato l'account tramite l'apposita finestra
>di creazione e nella schermata di USER MAPPING ho selezionato
>il database di interesse flaggando le voci db_datareader,db_denydatawriter
>e public.

OK, hai dato accesso in lettura a TUTTE le viste/tabelle del db (la deny non serve in quanto non esistono permessi in scrittura, quindi perché negare una cosa che non c'è?)

>Ma mi sta venendo il dubbio che l'account e l'user siano due
>cose differenti.
Se con account ti riferisci alle login, si, user accounts e login sono due cose MOLTO differenti.
Leggi questo articolo di Luca:
http://technet.microsoft.com/it-it/library/cc645510.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

symonx80 Profilo | Junior Member

Ok ho creato l'user e gli ho assegnato il login relativo con i seguenti comandi

CREATE LOGIN TESTER2
WITH PASSWORD = 'qwerty';
CREATE USER USERTESTER FOR LOGIN TESTER2


Ora ho provato nuovamente a eseguire un grant
GRANT SELECT ON APP_TEST.DBO.anagrafica TO USERTESTER

ma il risultato è stato

'Msg 15151, Level 16, State 1, Line 1
Impossibile trovare l'oggetto 'USERTESTER' di tipo utente, perché inesistente o perché non si dispone dell'autorizzazione.'

Non capisco dove sia l'errore..

lbenaglia Profilo | Guru

>'Msg 15151, Level 16, State 1, Line 1
>Impossibile trovare l'oggetto 'USERTESTER' di tipo utente, perché
>inesistente o perché non si dispone dell'autorizzazione.'
>
>Non capisco dove sia l'errore..

1) Con che login sei autenticato all'istanza quando impartisci quei comandi? Hai le permission necessarie?
2) Lo User Account è locale al db. Sei sicuro di eseguire la GRANT nel db che contiene lo User Account appena definito?

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

symonx80 Profilo | Junior Member

Grazie, sono riuscito grazie ai tuoi link a fare quello che volevo. Alla fine ho però messo in datareader l'utente. Il problema è che così l'utente non riesce a vedere le stored procedure del db.
Sono andato allora nelle proprietà dell'user per il db relativo e nella sezione SECURABLES vorrei impostare che l'utente può solo leggere le stored procedure.Il problema è che le stored procedure sono un centinaio e non riesco a selezionarle tutte insieme in una volta ma sono costretto a flaggarle una ad una.
Come posso evitare questo?
Quale object_name hanno le stored procedur di un db?Esiste un elenco degli object_name di un db a cui fare riferimento?Non ho trovato nulla in rete di preciso...

lbenaglia Profilo | Guru

>Grazie, sono riuscito grazie ai tuoi link a fare quello che volevo.
>Alla fine ho però messo in datareader l'utente. Il problema è
>che così l'utente non riesce a vedere le stored procedure del
>db.
Occhio che "vederle" non significa avere i permessi per eseguirle!
Per garantire l'esecuzione di una sp ad un certo User Account devi eseguire il comando GRANT specificando il permesso di EXECUTE su OGNI stored procedure.
Volendo puoi far generare i comandi direttamente a SQL Server con una query simile a:

SELECT N'GRANT EXECUTE ON OBJECT::' + SCHEMA_NAME(schema_id) + N'.' + name + N' TO Lorenzo;' FROM sys.procedures;

Dove Lorenzo è il tuo User Account. A questo punto copia l'output generato ed eseguilo in una nuova finestra di query.

>Come posso evitare questo?
>Quale object_name hanno le stored procedur di un db?Esiste un
>elenco degli object_name di un db a cui fare riferimento?Non
>ho trovato nulla in rete di preciso...
Sui Books Online trovi tutte le risposte
http://msdn.microsoft.com/en-us/library/ms188371.aspx
http://msdn.microsoft.com/en-us/library/ms188737.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

symonx80 Profilo | Junior Member

Si ma infatti devo dare la possibilità di vederle e non di eseguirle. :)

lbenaglia Profilo | Guru

>Si ma infatti devo dare la possibilità di vederle e non di eseguirle.
A che pro?!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

symonx80 Profilo | Junior Member

Capisco che la cosa perde un po ' di senso.. ma ho necessità di creare questo utente che ha diritti di sola lettura per tabelle,viste e procedure..
Di conseguenza se al posto execute inserisco VIEW DEFINITION dovrebbe essere corretto.Ora provo.

lbenaglia Profilo | Guru

>Capisco che la cosa perde un po ' di senso.. ma ho necessità
>di creare questo utente che ha diritti di sola lettura per tabelle,viste
>e procedure..
OK per tabelle e viste, ma non esiste una permission di sola lettura (che io interpreto come SELECT) per le sp!

>Di conseguenza se al posto execute inserisco VIEW DEFINITION
>dovrebbe essere corretto.Ora provo.
La permission VIEW DEFINITION permette di visualizzare i metadati di un oggetto.
Che senso ha permettere ad un utente di poter visualizzare il codice T-SQL di una sp se poi non può né modificarla, né eseguirla?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5