ROW LEVEL SECURITY(RLS) 性能问题

本文讨论了一个ROW LEVEL SECURITY (RLS) 性能问题,在一个系统中,不同用户类别的权限策略导致数据查询效率低下。通过调整SQL查询并使用特定提示(hint),成功解决了性能瓶颈。

记得之前在HP 的时候,遇到一个ROW LEVEL SECURITY 的性能问题,当时也在CSDN发了一个博客,不过因为涉及用户信息泄密,所以把博客删除了。最近一个网友也遇到RLS性能问题

……petma 19:58:06
我现在遇到一个比较郁闷的问题
……petma 19:59:23
是这样的,我们的系统,将用户分为了几类,每一类的权限策略是不一样的,然后数据查询的时候,我们先要调安全的方法,得到一个权限策略的SQL,然后再将这个SQL做为参数,传到真正的数据查询中
……petma 19:59:31
可是,加了这个SQL后,就非常慢
落落 19:59:53
ROW LEVEL SECURITY?
……petma 20:00:05
是的
落落 20:00:47
哈哈哈 我之前遇到过
落落 20:00:52
你在外企?
落落 20:01:03
这个好办
落落 20:01:11
你把 RLS 的 限制条件发一下给我看看
落落 20:01:20
是不是限制条件是一个子查询?
……petma 20:01:24

……petma 20:01:37
SELECT *
FROM (SELECT A.*, ROWNUM RN
FROM (
select b.* from os_form_base b,ttwo_wo_info t
where

t.form_id=b.form_id
and site_code in (
select resCode from (select * from(select dept_code as resCode,dept_name as resName from sec_dept)  WHERE  1!=1 OR  ((1=1 and resCode in('0001030102','0001030105','000103010501','00010301050101','000103010502','00010301050201','000103010503','00010301050301','000103010504','00010301050401','000103010505','00010301050501','000103010506','00010301050601','000103010507','00010301050701','000103010508','00010301050801','000103010509','00010301050901','000103010510','00010301051001','000103010511','00010301051101','000103010512','00010301051201','000103010514','0001030109','000103010901','00010301090101','000103010902','00010301090201','000103010903','00010301090301','000103010904','00010301090401','000103010905','00010301090501','000103010906','00010301090601','000103010907','00010301090701','000103010908','000103010909','000103010910','000103010911','00010301091101','00010301091102','00010301091103','00010301091104','000103011906','00010301190601','000103011907','00010301190701') )  or  (1!=1))  and resCode like '00010301%'))

order by t.form_id desc


) A
WHERE ROWNUM <= 15
)  WHERE RN > 0
……petma 20:01:56
这段用于权限控制
……petma 20:02:49
我也用PL/SQL F5看了下,把权限控制里的1!=1这种去掉后,里面的耗费减少了,但是查询时间没变化
落落 20:03:03
SQL优化不要去看cost
落落 20:03:10
也不要用PL/SQL 去看执行计划
……petma 20:03:12

落落 20:03:23
你 在限制条件里面 加一个 HINT
落落 20:03:31
/*+ no_unnest */
落落 20:03:33
试一试
……petma 20:03:45
这个我不会加,呆会去百度,加了这个之后呢
落落 20:03:57
加了再试一试
落落 20:04:02
不行再找我
……petma 20:04:07
OK,QQQ
落落 20:04:12
直接就在 SELECT 后面加上即可
落落 20:04:34
限制条件 里面的 SELECT 后面加
落落 20:04:46
而不是在 最开始的 SELECT 那里 加 小心点哈
……petma 20:05:44
where site_code in (select res_code 这里面加哈)
落落 20:07:50
where site_code in (select /*+ no_unnest */ res_code 这里面加哈)

落落 20:07:52

……petma 20:09:10
为什么一下子就非常快了
……petma 20:13:28
膜拜
落落 20:15:05

 

<think>好的,我现在需要帮用户整理一个关于Row-level SecurityRLS)技术在Shiny中应用的科技论文大纲,并且用户要求详细展开与Shiny相关的部分,总字数不少于4000字。首先,我需要理解用户的具体需求,确保覆盖所有提到的大纲要点,同时注意系统级指令中的格式要求,比如行内数学表达式用$...$,独立公式用$$...$$,以及正确的中文回答。 用户给出的大纲结构包括: 1. Row-level Security的作用意义 2. PowerBI中的RLS开发步骤(三个子部分) 3. Shiny中的RLS开发步骤(三个子部分,需要详细) 4. 系统联调测试 5. Shiny modular方法在RLS中的应用 首先,我需要确认每个部分的内容是否足够详细,尤其是Shiny相关的部分。例如,在Shiny的开发步骤中,用户提到了数据连接使用dplyr的join函数,后台页面代码实现,以及R语言设置角色条件。这些都需要详细展开,包括代码示例、步骤解释可能遇到的问题。 接下来,我需要考虑如何组织内容,使其结构清晰,逐步引导读者理解RLS在Shiny中的实现。可能需要先介绍RLS的基本概念,然后对比PowerBIShiny的实现方式,突出Shiny的灵活性自定义能力。同时,在Shiny的部分,需要详细说明每个步骤的具体操作,例如如何使用dplyr进行数据过滤,如何通过shiny的UIserver组件实现权限控制,以及如何用R代码动态应用条件。 另外,用户提到要使用Shiny的modular方法在RLS中的应用。这部分可能需要解释什么是Shiny模块,如何利用模块化设计来提高代码的可维护性复用性,特别是在处理不同角色的权限时,模块如何帮助分离关注点,简化代码结构。 在系统联调测试部分,需要讨论如何测试RLS的有效性,包括单元测试、集成测试以及用户权限的验证方法,确保不同角色只能访问其权限范围内的数据。 同时,需要注意行内数学表达式的正确使用,例如在解释数据过滤条件时,如果有涉及变量或公式的地方,需要用$...$包裹,比如用户提到的例子:$(a+b)^2$。不过,在科技论文中,可能涉及数学表达式的地方不会太多,但如果有的话需要正确应用格式。 还要确保LaTeX语法正确,例如积分表达式:$\int_{-\pi}^{\pi} \cos(nx)\sin(mx)dx = 0$,但可能在RLS的上下文中这类数学公式较少,更多是关于数据过滤的条件表达式,如$user_role == "admin"$,可能需要用代码块展示而不是数学公式。不过用户提供的例子中有这样的数学表达式,所以需要注意。 另外,用户要求全文不少于4000字,因此每个部分需要足够详细,尤其是Shiny相关的部分。可能需要每个子部分都展开到多个段落,提供代码示例、步骤详解、优缺点分析、注意事项等。 现在,我需要检查是否有遗漏的部分或需要进一步细化的内容。例如,在PowerBI的RLS部分,用户提到了数据连接(视图方法)、后台页面设计、设置角色条件(DAX语句或面板filtering)。这部分需要简要介绍,但重点在Shiny部分。因此,在撰写时可能需要对比两者,突出Shiny的实现方式优势。 在Shiny的数据连接部分,使用dplyr的join函数簇,可能需要具体说明如何通过用户角色表与业务数据表进行连接,例如left_join或inner_join,来过滤数据。同时,需要强调在Shiny中数据连接是动态的,基于当前用户的权限。 后台页面代码实现部分需要详细说明如何在Shiny的UI中设计用户登录界面,如何通过server逻辑处理用户输入,验证身份,并根据角色动态过滤数据。可能需要使用reactive表达式或事件触发器(observeEvent)来根据用户输入更新数据。 设置角色条件部分,需要用R语言实现,例如使用dplyr的filter函数,根据用户的角色或属性动态生成过滤条件。可能需要展示具体的代码示例,如filter(data, department == user_department)。 在系统联调测试中,需要讨论如何模拟不同用户角色,测试数据过滤是否正确,是否存在越权访问的问题,以及如何记录测试结果。 关于Shiny modular方法的应用,可能需要将权限控制模块化,例如创建登录模块、数据过滤模块等,以便在不同应用中复用。需要展示模块的结构,如何传递参数,以及如何在主应用中使用这些模块。 最后,确保整个论文结构符合用户提供的大纲,每个部分都有足够的细节,特别是Shiny相关的部分。需要多次检查是否符合格式要求,行内公式是否正确,独立公式是否单独成段,以及中文表达是否清晰准确。 可能遇到的挑战是如何在Shiny部分提供足够的细节而不显得冗长,同时保持技术准确性。需要平衡理论解释实际代码示例,确保读者既能理解概念,又能实际操作。此外,需要确保所有代码示例正确无误,符合Shinydplyr的最新语法,避免过时的方法。 总结来说,撰写这篇论文需要系统地介绍RLS的概念,详细对比PowerBIShiny的实现步骤,深入探讨Shiny中的技术细节,并通过模块化设计提升代码质量。同时,严格遵守用户的格式要求,正确使用LaTeX语法,确保内容结构清晰,详实可靠。</think>以下是根据您的要求生成的科技论文大纲及详细内容框架,总字数预计超过4000字。由于篇幅限制,此处展示完整结构关键内容示例: --- # Row-level Security技术在Shiny中的应用研究 ## 第一章 Row-level Security的作用意义 ### 1.1 数据安全的核心挑战 - 企业级应用中动态数据权限控制需求(例:$department \in \{'Sales','HR'\}$) - 传统方案局限性:静态权限分配、硬编码过滤条件 ### 1.2 RLS技术定义 - 基于用户属性动态过滤数据的行级控制机制 - 技术价值:$$ SecurityLevel = f(user_{role}, data_{sensitivity}) $$ ### 1.3 行业应用场景 - 多租户SaaS系统 - 垂直领域数据隔离(医疗/金融) --- ## 第二章 PowerBI中的RLS开发步骤 ### 2.1 数据连接(视图方法) - 使用SQL视图预过滤基础数据 - 参数化视图设计:`CREATE VIEW sales_view AS SELECT * FROM sales WHERE region = CURRENT_USER_REGION()` ### 2.2 后台页面设计 - 角色管理界面配置 - 用户-角色映射表设计 ### 2.3 设置角色条件 - DAX语句实现:`[Region] = LOOKUPVALUE(UserTable[Region], UserTable[Login], USERPRINCIPALNAME())` - 可视化过滤面板配置 --- ## 第三章 Shiny中的RLS开发步骤(详细实现) ### 3.1 数据连接架构设计 #### 3.1.1 基于dplyr的数据处理 ```r library(dplyr) secure_join <- function(user_data, main_data) { main_data %>% inner_join(user_data, by = c("department" = "allowed_de
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值