L'autorizzazione EXECUTE è negata sui tipi di tabella definiti dall'utente?


87

Ho una domanda sui tipi di tabella definiti dall'utente in SQL Server 2008.

Per la necessità di una delle applicazioni ASP.NET abbiamo definito i nostri tipi di tabella su SQL Server 2008 per usarli come parametri nelle procedure memorizzate (durante l'esecuzione del comando sql nell'applicazione ASP.NET passiamo l'oggetto DataTable come parametro per la procedura memorizzata vedi qui per un esempio )

Il problema è che quando eseguiamo il comando Sql (eseguiamo stored procedure) da ASP.NET otteniamo un errore:

L'autorizzazione EXECUTE è stata negata sull'oggetto "ourTableType", database "ourDatabase", schema "ourSchema".

Perchè è così? Perché è necessario impostare l'autorizzazione sui tipi di tabella definiti dall'utente? Perché non è sufficiente avere l'autorizzazione impostata solo sulla stored procedure che la utilizza? E se dobbiamo impostare non importa cosa, perché non v'è alcun EXECUTEtipo di autorizzazione a mettere in finestra delle proprietà di sorta (posso solo vedere Control, References, Take Ownership, View Definition)?

Quello che inoltre non capisco è che l'impostazione dell'autorizzazione su Controlnella finestra delle proprietà risolve il problema e la procedura memorizzata viene eseguita senza problemi.


4
possibile duplicato del parametro con valore
Damien_The_Unbeliever

grazie! Ho cercato ma chiaramente non abbastanza: /
Janez

Prova a mettere AS dboalla fine. Come questo: GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo. Ha funzionato per me.
Jonathan

Possibile duplicato del parametro con valore
LCJ

Risposte:


197

Spero davvero che tu abbia risolto questo problema ormai, visto che la domanda ha quasi 4 mesi, ma nel caso non lo avessi fatto, ecco quella che penso sia la risposta.

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO

9
I miei 2 centesimi: a seconda del meccanismo di autenticazione della connessione, potrebbe essere necessario concedere l'exec al gruppo pubblico. Quindi la tua sovvenzione sarebbe simile a questa: GRANT EXEC ON TYPE :: [schema]. [Typename] TO [Public] GO
Sudhanshu Mishra

@dotnetguy grazie mille, nessuna delle soluzioni ha funzionato per me tranne la tua.
Mazen el Senih

3

Se la procedura memorizzata utilizza sql dinamico, ovvero @sqlviene generato e quindi eseguito tramite exec @sql, sarà necessaria l'autorizzazione concessa per le tabelle sottostanti.

Una soluzione consiste nel modificare la stored procedure affinché venga eseguita come un utente diverso . Se lo fai funzionare come SELF, verrà eseguito sotto il creatore del proc memorizzato, che è estremamente pericoloso. Tuttavia, se non hai altra opzione:

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF

1
Grazie per averlo sottolineato. Ma la stored procedure non contiene SQL dinamico. Solo le INSERT INTOistruzioni di tabella generali e ´UPDATE´ per le quali l'utente dispone di tutte le autorizzazioni necessarie. Anche questo utente / login è appositamente riservato / creato per questa applicazione ASP.NET per essere in grado di connettersi a questo database ed eseguire solo stored procedure (non creare ecc., Il creatore è sempre 'sa').
Janez

Grazie, questo era il problema per me. Altri lettori con questo problema possono fare riferimento alle autorizzazioni di SQL Server su Stored Procs con SQL dinamico per ulteriori suggerimenti.
Nickolay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.