巧用String_split设置报表权限
设计要求:
根据权限表返还回来该账号拥有的公司清单,然后在相对应的BI业务表上进行数据的权限控制,用户可以在权限表上面维护相对应的全年。例如集团可以维护成* ,1001,或者1001,1002这种情况。
权限设置逻辑,如果为* ,则为全部。
如果集团为”1001,1002“这种则返还1001和1002底下的所有公司名单
因为遇到(1001,1002)这种拼接起来了,所以要用String_Split这个函数。
权限表结构:
相对应代码表结构:
具体代码如下:
1 -- ---------------------------- 2 -- Table structure for 用户权限表 3 -- ---------------------------- 4 IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[用户权限表]') AND type IN ('U')) 5 DROP TABLE [dbo].[用户权限表] 6 GO 7 8 CREATE TABLE [dbo].[用户权限表] ( 9 [用户] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, 10 [公司] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, 11 [集团] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, 12 [备注] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL 13 ) 14 GO 15 16 ALTER TABLE [dbo].[用户权限表] SET (LOCK_ESCALATION = TABLE) 17 GO 18 19 20 -- ---------------------------- 21 -- Records of 用户权限表 22 -- ---------------------------- 23 INSERT INTO [dbo].[用户权限表] ([用户], [公司], [集团], [备注]) VALUES (N'admin', N'101', N'2001', NULL) 24 GO 25 26 INSERT INTO [dbo].[用户权限表] ([用户], [公司], [集团], [备注]) VALUES (N'user001', N'*', N'1001', NULL) 27 GO
1 -- ---------------------------- 2 -- Table structure for 集团公司清单表 3 -- ---------------------------- 4 IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[集团公司清单表]') AND type IN ('U')) 5 DROP TABLE [dbo].[集团公司清单表] 6 GO 7 8 CREATE TABLE [dbo].[集团公司清单表] ( 9 [集团代码] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, 10 [公司代码] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL 11 ) 12 GO 13 14 ALTER TABLE [dbo].[集团公司清单表] SET (LOCK_ESCALATION = TABLE) 15 GO 16 17 18 -- ---------------------------- 19 -- Records of 集团公司清单表 20 -- ---------------------------- 21 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'1001', N'111') 22 GO 23 24 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'1001', N'122') 25 GO 26 27 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'1001', N'133') 28 GO 29 30 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'1001', N'144') 31 GO 32 33 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'1001', N'155') 34 GO 35 36 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'1001', N'166') 37 GO 38 39 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'1001', N'177') 40 GO 41 42 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'1001', N'188') 43 GO 44 45 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'1001', N'199') 46 GO 47 48 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'2001', N'101') 49 GO 50 51 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'2001', N'102') 52 GO 53 54 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'2001', N'103') 55 GO 56 57 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'2001', N'104') 58 GO 59 60 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'2002', N'105') 61 GO 62 63 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'2003', N'106') 64 GO 65 66 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'2004', N'107') 67 GO 68 69 INSERT INTO [dbo].[集团公司清单表] ([集团代码], [公司代码]) VALUES (N'2005', N'108') 70 GO
1 select DISTINCT 公司代码 from 集团公司清单表 2 WHERE 3 IIF((SELECT distinct [集团] FROM [dbo].[用户权限表] WHERE 用户 = 'admin') = '*' ,集团代码 , 集团代码 ) in 4 (SELECT value from string_split((IIF((SELECT distinct [集团] FROM [dbo].[用户权限表] WHERE 用户 = 'admin') = '*' ,集团代码 , (SELECT distinct 集团 FROM [dbo].[用户权限表] WHERE 用户 = 'admin'))) , ',')) 5 and 6 IIF((SELECT distinct 公司 FROM [dbo].[用户权限表] WHERE 用户 = 'admin') = '*' ,公司代码 , 公司代码 ) in 7 (SELECT value from string_split((IIF((SELECT distinct 公司 FROM [dbo].[用户权限表] WHERE 用户 = 'admin') = '*' ,公司代码 , (SELECT distinct 公司 FROM [dbo].[用户权限表] WHERE 用户 = 'admin'))) , ','))