惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - 冰戈

【解决方法】IIS 承载的服务失败 - 冰戈 - 博客园 【Silverlight】使用ChildWindow实现MessageBox 【Silverlight】利用IsolatedStorageFile实现客户端缓存 Silverlight3_Tools&SDK发布中文版 Windows Server 2008 将与 Visual Studio 2008 以及 SQL Server 2008 共同发布 基于Ajax的模糊查询输入控件(补充) 基于Ajax的编码、拼音缩写、名称模糊查询输入控件 个人站点域名改为www.oylb.net 使用PostSharp进行AOP框架设计:一个简单的原型 又一套BlogEngine主题Andreas 给博客增加了一个主题Nautica02Liquid 对BlogEngine进行了一次简单升级 微软2008系列 (Orcas + Longhorn Server+SQL2008)将于2008年2月27日发布 - 冰戈 使用CSS+SiteMap+UserControl+MasterPage实现简易的Tab 转实用文章:常用开源协议详细解析 SubSonic 命令行参数及使用示例 抢先试用ReSharper UnitRun™ 1.0 又一款免费的VS2005单元测试插件 公司求才,你们是怎样做的?你想怎样做?
SQL Server 2005公用表达式实现递归
冰戈 · 2007-07-30 · via 博客园 - 冰戈

有数据表

1.

CREATE TABLE [dbo].[aspnet_Roles]
(
[ApplicationId] [uniqueidentifier] NOT NULL,
[RoleId] [uniqueidentifier] NOT NULL,
[RoleName] [nvarchar] (256) NOT NULL,
[LoweredRoleName] [nvarchar] (256) NOT NULL,
[Description] [nvarchar] (256) NULL
) ON [PRIMARY]

2.

CREATE TABLE [dbo].[pms_RoleRelations]
(
[RoleId] [uniqueidentifier] NOT NULL,
[ParentRoleId] [uniqueidentifier] NOT NULL
) ON [PRIMARY]

GO
EXEC sp_addextendedproperty N'MS_Description', N'角色间的关系', 'SCHEMA', N'dbo', 'TABLE', N'pms_RoleRelations', NULL, NULL
GO
EXEC sp_addextendedproperty N'MS_Description', N'角色ID', 'SCHEMA', N'dbo', 'TABLE', N'pms_RoleRelations', 'COLUMN', N'RoleId'
GO
EXEC sp_addextendedproperty N'MS_Description', N'父角色ID', 'SCHEMA', N'dbo', 'TABLE', N'pms_RoleRelations', 'COLUMN', N'ParentRoleId'

有数据:

1. 

DE2051D2-E76F-4E68-BD80-2BD7A183BE35    70D40086-FCAA-4F58-A802-F6A808B9BDF0    myrole    myrole
DE2051D2-E76F-4E68-BD80-2BD7A183BE35    15F9D7AC-895C-4FE3-A21E-CFC3CCFBE117    myrole1    myrole1
DE2051D2-E76F-4E68-BD80-2BD7A183BE35    ADEA0D48-209E-4E78-8927-60C3B834F463    myrole12    myrole12
DE2051D2-E76F-4E68-BD80-2BD7A183BE35    D052D277-6413-4418-94EB-648CE067CCD1    myrole2    myrole2
DE2051D2-E76F-4E68-BD80-2BD7A183BE35    F876778D-C1E9-4F37-9BF9-530C09E6D129    myrole3    myrole3
DE2051D2-E76F-4E68-BD80-2BD7A183BE35    C9AE4104-A900-4228-96E4-B9E12D10EB77    Test    test

2.

F876778D-C1E9-4F37-9BF9-530C09E6D129    70D40086-FCAA-4F58-A802-F6A808B9BDF0
ADEA0D48-209E-4E78-8927-60C3B834F463    15F9D7AC-895C-4FE3-A21E-CFC3CCFBE117
D052D277-6413-4418-94EB-648CE067CCD1    70D40086-FCAA-4F58-A802-F6A808B9BDF0
C9AE4104-A900-4228-96E4-B9E12D10EB77    ADEA0D48-209E-4E78-8927-60C3B834F463
15F9D7AC-895C-4FE3-A21E-CFC3CCFBE117    70D40086-FCAA-4F58-A802-F6A808B9BDF0

要实现:

取得 Test 的所有祖先角色,即,得到myrole12,myrole1,myrole

实现方式:

CREATE PROCEDURE [dbo].[pms_Roles_GetAllAncestorRoles]
    @ApplicationName           nvarchar(256),
    @RoleId                        char(36)
AS
    DECLARE @ApplicationId uniqueidentifier
    SELECT  @ApplicationId = NULL
    SELECT  @ApplicationId = ApplicationId FROM aspnet_Applications WHERE LOWER(@ApplicationName) = LoweredApplicationName
   
    IF (@ApplicationId IS NULL)
        RETURN;
  
   --使用公用表达式实现递归取得角色的所有祖先
    WITH RoleRelations(RoleId,ParentRoleId,RoleName,pName,pDescription,Level)
    AS
    (
        SELECT r.RoleId,ParentRoleId,r.RoleName AS rName, p.rolename AS pName,p.Description,0 AS Level
        FROM aspnet_Roles r
        LEFT JOIN pms_RoleRelations
            ON pms_RoleRelations.RoleId = r.RoleId
        LEFT JOIN aspnet_Roles p
            ON p.RoleId = pms_RoleRelations.ParentRoleId
        WHERE r.RoleId = @RoleId
            AND r.ApplicationId = @ApplicationId

        UNION ALL
       
        SELECT r.RoleId,pid.ParentRoleId,r.RoleName AS rName, pn.rolename AS pName,pn.Description,Level + 1
        FROM aspnet_Roles r
        JOIN pms_RoleRelations pid
            ON r.roleid = pid.roleid
        JOIN aspnet_Roles pn ON pn.roleid = pid.parentroleid
        JOIN RoleRelations p ON p.ParentRoleId = r.RoleId
        WHERE r.ApplicationId = @ApplicationId
    )
    SELECT ParentRoleId AS RoleId,
            pName AS RoleName ,
            pDescription AS Description
    FROM RoleRelations