• 一个类似权限挂载的设计


    四个表,

    第一个 DECLARE @A TABLE 状态表

    DECLARE @A TABLE
        (
          [Aid] INT PRIMARY KEY NOT NULL ,
          [name] NVARCHAR(50) NOT NULL
        ) ;

    有id,有[name]表状态,假设@A表有三种状态

    INSERT  INTO @A( Aid, name )
    VALUES  ( 1, N'状态1')
    INSERT  INTO @A( Aid, name )
    VALUES  ( 2, N'状态2')
    INSERT  INTO @A( Aid, name )
    VALUES  ( 3, N'状态3')

    第二个 DECLARE @B TABLE 动作表

    DECLARE @B TABLE
        (
          [Bid] INT PRIMARY KEY NOT NULL ,
          [Aid] INT NOT NULL ,
          [Name] NVARCHAR(50) NOT NULL
        );

    有自己的Id,和表@A的Id,[name]表动作名称 假设@A表 状态1对应2个动作、状态2下对应3个动作、状态3下对应1个动作

    INSERT  INTO @B( Bid, Aid, Name )
    VALUES  ( 1, -- id - int name就可以说是状态1下的动作1
              1,  -- Aid - int
              N'状态1下的动作1' )
    INSERT  INTO @B( Bid, Aid, Name )
    VALUES  ( 2, -- id - int  name就可以说是状态1下的动作2
              1,  -- Aid - int
              N'状态1下的动作2' )
    INSERT  INTO @B( Bid, Aid, Name )
    VALUES  ( 3, -- id - int name就可以说是状态2下的动作1
              2,  -- Aid - int
              N'状态2下的动作1' )
    
    INSERT  INTO @B( Bid, Aid, Name )
    VALUES  ( 4, -- id - int  name就可以说是状态2下的动作2
              2,  -- Aid - int
              N'状态2下的动作2' ) 
    INSERT  INTO @B( Bid, Aid, Name )
    VALUES  ( 5, -- id - int name就可以说是状态2下的动作3
              2,  -- Aid - int
              N'状态2下的动作3' )     
    INSERT  INTO @B( Bid, Aid, Name )
    VALUES  ( 6, -- id - int name就可以说是状态3下的动作1
              3,  -- Aid - int
              N'状态3下的动作1' )  

    第三个 DECLARE @C TABLE 部门表

    DECLARE @C TABLE
        (
          [Cid] INT PRIMARY KEY NOT NULL ,
          [Aid] INT NOT NULL ,
          [Deptid] INT NOT NULL
        );

    有自己的Id,和表@A的Id,[Deptid]表部门Id,这里假设有2个部门

    INSERT  INTO @C( Cid, Aid, Deptid )
    VALUES  ( 1, -- id - int
              1, -- Aid - int  状态1
              1  -- Deptid - int
              )     
    INSERT  INTO @C( Cid, Aid, Deptid )
    VALUES  ( 2, -- id - int
              2, -- Aid - int  状态2      
              1  -- Deptid - int
              )
    INSERT  INTO @C( Cid, Aid, Deptid )
    VALUES  ( 3, -- id - int
              3, -- Aid - int   状态3
              1  -- Deptid - int
              )
    ------50321
    INSERT  INTO @C( Cid, Aid, Deptid )
    VALUES  ( 4, -- id - int
              1, -- Aid - int   状态1
              50321  -- Deptid - int
              )     
    INSERT  INTO @C( Cid, Aid, Deptid )
    VALUES  ( 5, -- id - int
              2, -- Aid - int   状态2
              50321  -- Deptid - int
              )
    INSERT  INTO @C( Cid, Aid, Deptid )
    VALUES  ( 6, -- id - int
              3, -- Aid - int   状态3
              50321  -- Deptid - int
              )

    第四个 DECLARE @D TABLE 部门表动作表

    DECLARE @D TABLE
        (
          [Did] INT PRIMARY KEY IDENTITY(1, 1)NOT NULL ,
          [Bid] INT NOT NULL ,
          [Cid] INT NOT NULL
        );

    有自己的Id,和表@B的Id,表@C的Id

    INSERT  INTO @D( Bid, Cid )
    VALUES  ( 1, -- Bid - int    状态1下的动作1
              1  -- Cid - int     部门1  和状态1
              ) 
    
    INSERT  INTO @D( Bid, Cid )
    VALUES  ( 2, -- Bid - int     状态1下的动作2
              1  -- Cid - int      部门1  和状态1
              ) 
    
    INSERT  INTO @D( Bid, Cid )
    VALUES  ( 4, -- Bid - int      状态2下的动作2
              2  -- Cid - int      部门1  和状态2
              ) 
    
    INSERT  INTO @D( Bid, Cid )
    VALUES  ( 5, -- Bid - int       状态2下的动作3
              1  -- Cid - int        部门1  和状态2
              ) 

     

    :总共有6个动作,已知为部门1配置的动作有4个,现在需要你copy一份部门1的动作个另一个部门50321

    /*
    A表就是状态列表 
    B表就是每个状态下对应的动作列表
    C就是每个状态拥有那些部门     或者说部门下拥有那些状态
    D就是部门下拥有的状态的动作
    */
    --现在要往  D表复制一份 部门1的数据
    /*

    根据表@C,@A我们可知道  ,150321 部门已配置的状态,可配置的动作

    /*已配置的状态,可配置的动作*/
    SELECT  b.Bid ,
            c.Cid ,
            A.name AS '状态' ,
            B.NAME AS '动作'
    FROM    @C AS c
            LEFT JOIN @A AS a ON C.Aid = a.Aid
            LEFT JOIN @B AS b ON a.Aid = b.Aid
    WHERE   c.Deptid = 1
    
    SELECT  b.Bid ,
            c.Cid ,
            A.name AS '状态' ,
            B.NAME AS '动作'
    FROM    @C AS c
            LEFT JOIN @A AS a ON C.Aid = a.Aid
            LEFT JOIN @B AS b ON a.Aid = b.Aid
    WHERE   c.Deptid = 50321

    根据表@D、@C、@B 可得知 @C表1部门已配置的四个动作

    /*1部门已配置的4个动作*/
    SELECT  b.bid ,c.cid ,b.Name
    FROM    @D AS d
            LEFT JOIN @C AS c ON d.Cid = c.Cid
            LEFT JOIN @B AS b ON d.Bid = b.Bid
    WHERE   c.Deptid = 1

    然后就是根据50321部门可以配置的动作与1部门相链接,得出可被50321部门配置的并且1部门已配置的动作的集合,将其插入 @D 表 ,

    INSERT  INTO @D( Bid ,Cid )
            SELECT  v1.Tbid ,v1.Tcid
            FROM    ( SELECT    b.bid AS Tbid ,c.cid AS Tcid
                      FROM      @B AS b
                                LEFT JOIN @A AS a ON a.aid = b.Aid
                                LEFT JOIN @C AS c ON a.aid = c.Aid
                      WHERE     c.Deptid = 50321
                    ) v1
                    INNER JOIN ( SELECT b.bid AS bid ,c.cid AS cid
                                 FROM   @B AS b
                                        LEFT JOIN @A AS a ON a.aid = b.Aid
                                        LEFT JOIN @C AS c ON a.aid = c.Aid
                                        RIGHT JOIN @D AS d ON b.bid = d.bid
                                 WHERE  c.Deptid = 1
                               ) V2 ON v1.Tbid = V2.bid

    然后查询出,50321部门的动作配置

    SELECT  b.bid ,c.cid ,b.Name
    FROM    @D AS d
            LEFT JOIN @C AS c ON d.Cid = c.Cid
            LEFT JOIN @B AS b ON d.Bid = b.Bid
    WHERE   c.Deptid = 50321
  • 相关阅读:
    LINQ/EF/Lambda 比较字符串日期时间大小
    WinForm RDLC SubReport Step by step
    centos7安装7-zip
    centos修改命令提示符颜色
    更换官方zabbix.repo为阿里云镜像
    利用shell脚本清理nginx日志
    docker
    centos 建立静态 IP 与 IP 地址丢失的解决办法
    构建lnmp高可用架构
    keepalived高可用
  • 原文地址:https://www.cnblogs.com/Jolinson/p/3517847.html
Copyright © 2020-2023  润新知