1./*****表值函数:获取当前登录用户允许访问模块*****/
2.
3.CREATE FUNCTION Get_PermModule(
4.@UserId VARCHAR(36), --当前登录用户ID
5.@OrgId VARCHAR(36) --当前登录部门ID
6.)
7.
8.RETURNS TABLE AS
9.
10.RETURN
11.with Roles as(
12. select R.RoleId --获取当前用户作为成员的角色ID
13. from Sys_Role_User R
14. where R.UserId = @UserId
15. union
16. select R.RoleId --获取当前用户所在用户组作为成员的角色ID
17. from Sys_Role_UserGroupR
18. join Sys_UserGroupMemberG on G.GroupId = R.GroupId
19. and G.UserId = @UserId
20. union
21. select R.RoleId --获取当前用户的职位作为成员的角色ID
22. from Sys_Role_PositionR
23. join Sys_User_Org P on P.OrgId = R.OrgId
24. and P.UserId = @UserId
25. join Sys_OrganizationO on O.ID = R.OrgId
26. and O.ParentId = @OrgId
27. union
28. select R.RoleId --获取当前用户的职位作为成员的角色ID(职位对应部门被合并)
29. from Sys_Role_PositionR
30. join Sys_User_Org P on P.OrgId = R.OrgId
31. and P.UserId = @UserId
32. join Sys_OrganizationO on O.ID = R.OrgId
33. join Sys_OrgMerger OM on OM.MergerOrgId = O.ParentId
34. and OM.OrgId = @OrgId
35. )
36.
37.select M.ModuleId from Roles R
38. join Sys_RolePerm_ModuleM on M.RoleId = R.RoleId
39.group by M.ModuleId
40.having min(M.Action) > 0
41.
42.GO
如何将这个函数(sql server)在mysql中新建,求大神讲解??
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- lshen01 2023-03-16 10:13关注
参考GPT和自己的思路:
这是一个 T-SQL 函数,需要进行语法转换和细节调整才能在 MySQL 中创建。本质上,这个函数查询某个用户所具有访问权限的模块。下面是 MySQL 版本的函数:
1.CREATE FUNCTION Get_PermModule (
2 p_UserId VARCHAR(36), --当前登录用户ID
3 p_OrgId VARCHAR(36) --当前登录部门ID
4)
5 RETURNS TABLE
6 LANGUAGE SQL
7 READS SQL DATA
8 DETERMINISTIC
9 SQL SECURITY INVOKER
10BEGIN
11 RETURN
12 SELECT M.ModuleId FROM (
13 SELECT R.RoleId FROM Sys_Role_User R WHERE R.UserId = p_UserId
14 UNION
15 SELECT R.RoleId FROM Sys_Role_UserGroupR R
16 JOIN Sys_UserGroupMember G ON G.GroupId = R.GroupId AND G.UserId = p_UserId
17 UNION
18 SELECT R.RoleId FROM Sys_Role_PositionR R
19 JOIN Sys_User_Org P ON P.OrgId = R.OrgId AND P.UserId = p_UserId
20 JOIN Sys_Organization O ON O.ID = R.OrgId AND O.ParentId = p_OrgId
21 UNION
22 SELECT R.RoleId FROM Sys_Role_PositionR R
23 JOIN Sys_User_Org P ON P.OrgId = R.OrgId AND P.UserId = p_UserId
24 JOIN Sys_Organization O ON O.ID = R.OrgId
25 JOIN Sys_OrgMerger OM ON OM.MergerOrgId = O.ParentId AND OM.OrgId = p_OrgId
26 ) R
27 JOIN Sys_RolePerm_ModuleM M ON M.RoleId = R.RoleId
28 GROUP BY M.ModuleId
29 HAVING MIN(M.Action) > 0;
30END;
这个函数的语法结构大致相同,但有几点需要注意:
- 声明函数参数时使用的是“IN”关键词
- 在 SELECT 语句中,将变量名改为参数名(例如“@UserId”变成“p_UserId”)
- 在 GROUP BY 语句中,添加“Sys_RolePerm_ModuleM.ModuleId”,即按照模块 ID 进行分组
- 在 HAVING 语句中,改为“HAVING MIN(Sys_RolePerm_ModuleM.Action) > 0”,即最小 Action 值大于 0
需要注意的是,这个函数中使用了多个表,需要将它们在 MySQL 中正确地创建并定义它们之间的关系。
解决 无用评论 打赏 举报