2010-02-25 9 views
1

Je pris un certain code ici: Check if role consists of particular user in DB?Vérifiez que l'utilisateur appartient à db rôle

SELECT * 
      FROM sys.database_role_members AS RM 
      JOIN sys.database_principals AS U 
      ON RM.member_principal_id = U.principal_id 
      JOIN sys.database_principals AS R 
      ON RM.role_principal_id = R.principal_id 
      WHERE U.name = 'operator1' 
      AND R.name = 'myrole1' 

qui requête retourne 1 ligne. Cela signifie que l'utilisateur 'operator1' appartient au rôle 'myrole1'. Maintenant, je suis en train de créer une procédure stockée pour cela:

CREATE PROCEDURE [dbo].[Proc1] 
(
    @userName varchar, 
    @roleName varchar 
) 
AS 

IF EXISTS(SELECT * 
      FROM sys.database_role_members AS RM 
      JOIN sys.database_principals AS U 
      ON RM.member_principal_id = U.principal_id 
      JOIN sys.database_principals AS R 
      ON RM.role_principal_id = R.principal_id 
      WHERE U.name = @userName 
      AND R.name = @roleName) 
      RETURN 0 
ELSE RETURN -1 

J'utilise commande standard du serveur SQL 2008 « Exécuter la procédure stockée »

DECLARE @return_value int 

EXEC @return_value = [dbo].[Proc1] 
     @userName = N'operator1', 
     @roleName = N'myrole1' 

SELECT 'Return Value' = @return_value 

GO 

retourne toujours -1. POURQUOI ???

Répondre

2

Vous devez définir l'attribut de longueur pour chacun de vos paramètres de procédure. Si vous changez le début de votre déclaration de procédure stockée à la suivante, il renvoie la réponse correcte:

CREATE PROCEDURE [dbo].[Proc1] 
(
    @userName varchar(255), 
    @roleName varchar(255) 
) 
AS 

Sans les attributs de longueur, SQL Server automatique définit la longueur des variables telles que 1, l'utilisateur et rôle ont été comparés à "o" et "m", respectivement. SQL Server est incohérent dans son comportement de la façon dont il traite les variables sans le spécificateur de longueur - parfois ils ont une longueur de 30 et parfois ils ont une longueur de 1. Il est préférable de toujours spécifier les attributs de longueur sur les variables chaîne. Voir l'article de Blog SQL suivante pour plus d'informations:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx

+0

Merci pour une contribution, Templar. Désolé pour une réponse à long terme. Je ne savais pas que je devrais marquer votre réponse comme utile et d'autres choses ... –

0

Ce code n'est pas bon, car il peut revenir faux, si un utilisateur est membre d'un groupe, qui est alors membre d'un rôle.

User la fonction intégrée IS_MEMBER() - ceci est beaucoup plus simple et toujours précis.

Questions connexes