raozhirouoo7 2017-10-26 02:39 采纳率: 0%
浏览 342

如何将这个函数(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  

  • 写回答

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

    评论

报告相同问题?

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试