如何将这个函数(sql server)在mysql中新建,求大神讲解??

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  

参考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 中正确地创建并定义它们之间的关系。