巧用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'))) , ','))

 

posted @ 2021-11-24 16:18  pyuser12138  阅读(37)  评论(0编辑  收藏  举报