首页 > 其他 > 详细

一个类似权限挂载的设计

时间:2014-02-28 10:27:10      阅读:501      评论:0      收藏:0      [点我收藏+]

四个表,

第一个 DECLARE @A TABLE 状态表

bubuko.com,布布扣
DECLARE @A TABLE
    (
      [Aid] INT PRIMARY KEY NOT NULL ,
      [name] NVARCHAR(50) NOT NULL
    ) ;
bubuko.com,布布扣

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

bubuko.com,布布扣
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)
bubuko.com,布布扣

第二个 DECLARE @B TABLE 动作表

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

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

bubuko.com,布布扣
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 )  
bubuko.com,布布扣

第三个 DECLARE @C TABLE 部门表

bubuko.com,布布扣
DECLARE @C TABLE
    (
      [Cid] INT PRIMARY KEY NOT NULL ,
      [Aid] INT NOT NULL ,
      [Deptid] INT NOT NULL
    );
bubuko.com,布布扣

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

bubuko.com,布布扣
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
          )
bubuko.com,布布扣

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

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

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

bubuko.com,布布扣
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
          ) 
bubuko.com,布布扣

 bubuko.com,布布扣

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

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

 

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

bubuko.com,布布扣
/*已配置的状态,可配置的动作*/
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
bubuko.com,布布扣

 

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

bubuko.com,布布扣
/*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
bubuko.com,布布扣

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

bubuko.com,布布扣
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
bubuko.com,布布扣

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

bubuko.com,布布扣
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
bubuko.com,布布扣

一个类似权限挂载的设计,布布扣,bubuko.com

一个类似权限挂载的设计

原文:http://www.cnblogs.com/Jolinson/p/3517847.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!