2009-06-11 11 views
0

J'ai utilisateurs de table avec des colonnesquestion de procédure stockée avec IS_MEMBER

ID nvarchar(4000) 
GroupRank int 
Definition nvarchar(4000) 

ID peut être un userid (auquel cas groupRank est NULL), un groupe de domaine avec un rang (auquel cas grouprank est non nul) ou un groupe par défaut réservé appelé #DefaultGroup.

je besoin d'une procédure stockée qui:

Si ID = SYSTEM_USER, retour cette définition

Sinon - record foreach Utilisateurs avec GroupRank NOT NULL dans l'ordre de rang de groupe, si IS_MEMBER (ID) = 1, cette définition (le cas échéant)

Dans le cas contraire - la définition de #DefaultGroup (si elle est là)

retour Sinon NULL.

Y at-il un moyen facile de faire cela?

Répondre

0

Cela semble fonctionner en fonction de la table

CREATE FUNCTION dbo.GetDefinition() 
RETURNS @definition TABLE 
(
    Defn nvarchar(4000) NULL 
) 
AS 
BEGIN 
    DECLARE @sys_usr nvarchar(4000); 
    DECLARE @def_usr nvarchar(4000); 
    SET @sys_usr = SYSTEM_USER; 
    SET @def_usr = '#Default'; 

    IF(EXISTS(SELECT * FROM dbo.User WHERE ID = @sys_usr)) 
    BEGIN 
     INSERT @definition SELECT Definition FROM User WHERE ID = @sys_usr 
    END ELSE 
    BEGIN 
     IF(EXISTS(SELECT TOP 1 * FROM dbo.User WHERE IS_MEMBER(ID) = 1 AND GroupRank IS NOT NULL ORDER BY GroupRank)) 
     BEGIN 
      INSERT @definition SELECT TOP 1 Definition FROM dbo.User 
       WHERE IS_MEMBER(ID) = 1 AND GroupRank IS NOT NULL ORDER BY GroupRank 
     END ELSE 
     BEGIN 
      IF(EXISTS(SELECT * FROM dbo.User WHERE ID = @def_usr)) 
      BEGIN 
       INSERT @definition SELECT Definition FROM User WHERE ID = @def_usr 
      END 
     END 
    END 

    RETURN; 
END 
2

Si je vous comprends bien, vous pourriez être relevé en mesure d'utiliser une sorte de cas similaire à celui ci-dessous:

SELECT 
    ID, 
    GroupRank, 
    Definition = CASE 
       WHEN ID = SYSTEM_USER THEN Definition 
       WHEN GroupRank IS NOT NULL AND IS_MEMBER(ID) = 1 THEN Definition 
       WHEN ID = '#DefaultGroup' THEN Definition 
       ELSE NULL 
       END 
FROM 
    [YourTable] 
+0

Cela résoudrait-il le cas où un utilisateur est membre de plusieurs groupes? – WOPR