一个类似权限挂载的设计

四个表,

第一个 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

 

 

 

你可能感兴趣的:(权限)