J'ai une question sur les types de table définis par l' utilisateur dans SQL Server 2008.
Pour le besoin de l'une des applications ASP.NET, nous avons défini nos propres types de table sur SQL Server 2008 pour les utiliser comme paramètres dans les procédures stockées (lors de l'exécution de la commande sql dans l'application ASP.NET, nous transmettons l'objet DataTable en tant que paramètre de la procédure stockée voir ici pour un exemple )
Le problème est que lorsque nous exécutons la commande Sql (exécutons la procédure stockée) à partir d'ASP.NET, nous obtenons une erreur:
L'autorisation EXECUTE a été refusée sur l'objet 'ourTableType', base de données 'ourDatabase', schéma 'ourSchema'.
Pourquoi est-ce si? Pourquoi avons-nous besoin de définir l'autorisation sur les types de table définis par l'utilisateur? Pourquoi ne suffit-il pas d'avoir une autorisation définie uniquement sur la procédure stockée qui l'utilise? Et si nous devons le régler , peu importe quoi, pourquoi il n'y a pas de EXECUTE
type d'autorisation à mettre en fenêtre des propriétés que ce soit (je ne vois que Control
, References
, Take Ownership
, View Definition
)?
Ce que je ne comprends pas non plus, c'est que la définition de l'autorisation Control
dans la fenêtre des propriétés résout le problème et la procédure stockée s'exécute sans problèmes.
AS dbo
à la fin. Comme ceci:GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo
. A travaillé pour moi.Réponses:
J'espère vraiment que vous avez résolu ce problème maintenant, étant donné que la question a presque 4 mois, mais au cas où vous ne l'auriez pas fait, voici ce que je pense être la réponse.
GRANT EXEC ON TYPE::[schema].[typename] TO [User] GO
la source
Si votre procédure stockée utilise SQL dynamique, ce qui signifie que le
@sql
est généré puis exécuté viaexec @sql
, vous aurez besoin d'une autorisation accordée sur les tables sous-jacentes.Une solution consiste à modifier la procédure stockée pour qu'elle s'exécute en tant qu'utilisateur différent . Si vous le faites fonctionner en tant que SELF, il sera exécuté sous le créateur du processus stocké, ce qui est extrêmement dangereux. Pourtant, si vous n'avez pas d'autre option:
CREATE PROCEDURE dbo.usp_Demo WITH EXECUTE AS SELF
la source
INSERT INTO
instructions de table générales et "UPDATE" pour lesquelles cet utilisateur a toutes les autorisations dont il a besoin. De plus, cet utilisateur / login est spécialement réservé / créé pour que cette application ASP.NET puisse se connecter à cette base de données et exécuter uniquement des procédures stockées (pas de création, etc., le créateur est toujours'sa'
).