Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包含用户、角色和权限的SQL SELECT语句_Sql_Sql Server_Select - Fatal编程技术网

包含用户、角色和权限的SQL SELECT语句

包含用户、角色和权限的SQL SELECT语句,sql,sql-server,select,Sql,Sql Server,Select,假设我有桌子: 使用者 角色中的用户 角色 角色中的权限 权利 键是标准键(UserFk、RoleFk、RightFk) 问题是:如何让角色中的所有用户都具有正确的X(id=100) 我不知道如何解决这个问题。请帮助我,对不起我的英语 SELECT [dbo].[System_Users].[Id] ,[UserName] ,[FirstName] ,[LastName] ,[Email] ,RoleFk ,[dbo].[System_Roles].Name FROM

假设我有桌子:

  • 使用者
  • 角色中的用户
  • 角色
  • 角色中的权限
  • 权利
  • 键是标准键(UserFk、RoleFk、RightFk)

    问题是:如何让角色中的所有用户都具有正确的X(id=100)

    我不知道如何解决这个问题。请帮助我,对不起我的英语

    SELECT [dbo].[System_Users].[Id]
      ,[UserName]
      ,[FirstName]
      ,[LastName]
      ,[Email]
      ,RoleFk
      ,[dbo].[System_Roles].Name
      FROM [dbo].[System_Users]
    INNER JOIN [dbo].[System_Roles_System_Users]
    ON [dbo].[System_Roles_System_Users].UserFk = [dbo].[System_Users].Id
    INNER JOIN [dbo].[System_Roles]
    ON [dbo].[System_Roles].Id = [dbo].[System_Roles_System_Users].RoleFk
    
    WHERE ?
    

    我试过那样的事,你能告诉我怎么了吗

    SELECT 
    DISTINCT System_Users.Id,
    System_Users.FullName
    FROM System_Users
    INNER JOIN Dict_Rights_System_Users
    ON System_Users.Id = Dict_Rights_System_Users.UserFk
    INNER JOIN System_Roles_System_Users
    ON System_Roles_System_Users.UserFk = System_Users.Id
    WHERE
    RightFk = 136
    OR
    136 IN (SELECT Dict_Rights_System_Roles.RightFk FROM Dict_Rights_System_Roles WHERE             
    Dict_Rights_System_Roles.RoleFk = System_Roles_System_Users.RoleFk)
    ORDER BY System_Users.FullName ASC
    

    您需要
    连接键关系上的表。基本结构将是:

    select u.Id, 
      u.UserName,
      u.FirstName,
      u.LastName,
      u.Email,
      r.RoleFk,
      r.Name RoleName,
      rt.Name RightName
    from users u
    inner join users_in_roles ur
      on u.id = ur.userfk
    inner join roles r
      on ur.rolefk = r.id
    inner join rights_in_roles rr
      on r.rolefk = rr.rolefk
    inner join rights rt
      on rr.rightfk = rt.id
    where rt.id = 100
    
    如果您需要学习
    JOIN
    语法的帮助,这里有一个很好的参考:

    您可以尝试以下方法:

    SELECT  *
    FROM    Users u
    WHERE   EXISTS (
            SELECT  ur.RoleFk
            FROM    Users_in_Roles ur
            WHERE   u.UserPk = ur.UserFk
            AND     EXISTS
                    (
                        SELECT  1
                        FROM    Rights_in_Roles rr
                        WHERE   rr.RoleFk = ur.RoleFk
                        AND     rr.RightFk = 100
                    )
    )
    OR  EXISTS (
    
            SELECT  1
            FROM    Users_Rights uri
            WHERE   u.UserPk = uri.UserFk 
            AND     uri.RightFk = 100
    )
    
    请注意,上述查询不会返回角色的
    RoleFk
    Name

    另一种办法是:

    SELECT   u.Id
            ,u.UserName
            ,u.FirstName
            ,u.LastName
            ,u.Email
            ,rr.RoleFk
            ,r.Name
    FROM    Users u
    
            -- get users that are in role that has right
    LEFT JOIN   
            Users_in_Roles ur ON
            ur.UserFk = u.UserPk
    LEFT JOIN   
            Rights_in_Roles rr ON
            rr.RoleFk = ur.RoleFk
    AND     rr.RightFk = 100
    LEFT JOIN   
            Rights r ON
            r.RolePk = rr.RoleFk
    
            -- get users that have a right granted to them directly
    LEFT JOIN
            Users_Rights uri ON
            u.UserPk = uri.UserFk 
    AND     uri.RightFk = 100
    
    WHERE   rr.RoleFk IS NOT NULL OR uri.UserFk IS NOT NULL
    

    StackOverflow不是代码编写服务。请阅读并展示。你能告诉我们桌子的布局吗?好的,我会发布我的尝试:)我以前没有说过,但还有一个条件。用户必须具有权限,或者用户必须具有权限(id=100)。还有一个具有权限的表联接用户。您可以通过联接实现此操作吗?一切正常,我使用了您的第一个解决方案。谢谢:)不客气:)我很高兴它有帮助,我删除了我的第一个解决方案,因为它没有返回角色字段的
    RoleFk
    Name
    。我返回这些列只是为了测试,我只需要用户Id和用户名;]