2010-02-11 10 views
17

negati ottengo l'errore seguenti quando si chiama una stored procedure che ha una tabella valutata parametro come uno dei parametrivalori di tabella di parametri in una stored procedure ottiene i permessi di esecuzione errore

Il permesso EXECUTE è stato negato in ValidationErrors oggetto' '

ValidationErrors è una TVP creata con la seguente dichiarazione:

CREATE TYPE [dbo].[ValidationErrors] AS TABLE(
    [ErrorMessage] [varchar](255) NOT NULL 
) 

l'utente che esegue la stored procedure ha eseguito privilegi sul stored procedure. Tuttavia, ottengo ancora l'errore sopra riportato. Qualche idea?

risposta

32

Penso che potrebbe essere necessario concedere all'utente le autorizzazioni per il tipo.

Riferimenti per la concessione di autorizzazioni per i tipi:
SQL 2005
SQL 2008

Aggiornamento:
Re: perché si deve concedere le autorizzazioni del tipo quando si dispone di autorizzazioni per lo sProc. Non so la ragione definitiva, ma BOL dice:

A differenza di tipi definiti dall'utente creati da utilizzando sp_addtype, il database pubblico ruolo non è concessa automaticamente l'autorizzazione RIFERIMENTI sui tipi che sono creati da usando CREATE TYPE. Questa autorizzazione deve essere concessa separatamente.

Aggiornamento 2: Per concedere permessi di esecuzione, dovrete eseguire questo in SSMS:

GRANT EXECUTE ON TYPE::dbo.ValidationErrors TO SomeUser; 
+0

Ho concesso il permesso di "controllo" all'oggetto e ora funziona correttamente. La semplice aggiunta di "riferimenti" e "definizione vista" non ha aiutato. Personalmente, non capisco il requisito poiché si tratta di un tipo e generalmente quando viene concessa l'esecuzione della stored procedure, gli oggetti di riferimento non necessitano di autorizzazioni specifiche da concedere. Tuttavia, questo potrebbe avere qualcosa a che fare con il fatto che l'utente è nel ruolo "pubblico". Qualche idea? – chiefbrownbotom

+0

Hai provato a concedere autorizzazioni EXECUTE (invece di controllo)? Potrebbe valere la pena provare che prima di ricorrere al controllo – AdaTheDev

+2

non ho visto nessun luogo da concedere all'esecuzione dallo studio di gestione sql. Ho visto solo quelli che ho elencato sopra. Devo usare t-sql per garantire questo? – chiefbrownbotom

2

Come @chiefbrownbotom dice, il motivo per cui è necessario eseguire autorizzazioni sul tipo di tabella è che la tabella viene creata prima (e quindi all'esterno) della chiamata al proc. Per illustrare questo esegui una traccia di SQL Profiler e chiama il tuo proc. Si vedrà qualcosa di simile che potrebbe sorprendervi ...

DECLARE @p1 TABLE AS YourTableType 
INSERT INTO @p1 (col1, col2, col3) VALUES ('val1','val2','val3') 
INSERT INTO @p1 (col1, col2, col3) VALUES ('val1','val2','val3') 
... 
EXEC usp_YourStoredProc @p1 
1

controllo Grant TIPO :: schema.mytabletype a RoleOrMember

Questo ha funzionato per me; molte grazie a @chiefbrownbotom nel commento sopra.

Problemi correlati