2010-02-11 5 views
17

je reçois l'erreur suivante lors de l'appel d'une procédure stockée qui a un paramètre d'une valeur de table comme l'un des paramètresTableau des paramètres d'une valeur dans une procédure stockée obtient des autorisations d'exécution erreur niée par

L'autorisation EXECUTE a été refusée sur l'objet « validationErrors '

validationErrors est un PVT créé avec la déclaration suivante:

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

l'utilisateur exécute la procédure stockée a des privilèges d'exécution sur la procédure stockée. Cependant, j'ai toujours l'erreur ci-dessus. Des idées?

Répondre

32

Je pense que vous devrez peut-être également accorder des autorisations d'utilisateur au type.

Références pour les autorisations OCTROI aux types:
SQL 2005
SQL 2008

Mise à jour:
Re: pourquoi vous devez accorder des autorisations sur le type lorsque vous disposez des autorisations sur le sproc. Je ne sais pas la raison définitive, mais BOL dit:

Contrairement types définis par l'utilisateur créés par en utilisant sp_addtype, la base de données publique rôle est pas automatiquement accordée l'autorisation REFERENCES sur les types qui sont créés par en utilisant CREATE TYPE. Cette autorisation doit être accordée séparément.

Mise à jour 2: Pour accorder les autorisations EXECUTE, vous souhaitez exécuter ceci dans SSMS:

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

J'ai accordé la permission "contrôle" à l'objet et cela semble fonctionner correctement maintenant. L'ajout de "références" et de "définition de la vue" n'a pas aidé. Personnellement, je ne comprends pas l'exigence car il s'agit d'un type et généralement lorsque l'exécution de la procédure stockée est accordée, les objets référencés n'ont pas besoin d'autorisations spécifiques à accorder. Cependant, cela peut avoir quelque chose à voir avec le fait que l'utilisateur est dans le rôle "public". Des pensées? – chiefbrownbotom

+0

Avez-vous essayé d'accorder des autorisations EXECUTE (au lieu du contrôle)? Peut-être vaut la peine d'essayer cela avant de recourir au contrôle – AdaTheDev

+2

Je n'ai vu aucun endroit à accorder exécuter à partir du studio de gestion sql. J'ai seulement vu ceux que j'ai énumérés ci-dessus. Dois-je utiliser t-sql pour l'accorder? – chiefbrownbotom

2

Comme dit @chiefbrownbotom, la raison pour laquelle vous avez besoin des autorisations d'exécution sur le type de table est que la table est créée avant (et donc en dehors de) l'appel à la proc. Pour illustrer cela, exécutez une trace SQL Profiler et appelez votre proc. Vous verrez quelque chose comme ça qui pourrait vous surprendre ...

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

contrôle Grant sur le type :: schema.mytabletype à RoleOrMember

Cela a fonctionné pour moi; merci beaucoup @chiefbrownbotom dans le commentaire ci-dessus.

Questions connexes