- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 PostgreSQL 10.1,开门见山......
假设我有一个TABLE:
CREATE TABLE public.document (
id uuid PRIMARY KEY,
title text,
content text NOT NULL
);
连同上面的GIN INDEX:
CREATE INDEX document_idx ON public.document USING GIN(
to_tsvector(
'english',
content || ' ' || COALESCE(title, '')
)
);
还有一个基本的全文搜索查询:
SELECT * FROM public.document WHERE (
to_tsvector(
'english',
content || ' ' || COALESCE(title, '')
) @@ plainto_tsquery('english', fulltext_search_documents.search_text)
)
无论 public.document 表大小如何,查询都非常快(您已经知道)!计划者使用 INDEX,一切都很好。
现在我通过RLS (Row Level Security)介绍一些基本的访问控制,首先我启用它:
ALTER TABLE public.document ENABLE ROW LEVEL SECURITY;
然后我添加策略:
CREATE POLICY document_policy ON public.document FOR SELECT
USING (EXISTS (
SELECT 1 FROM public.user WHERE (is_current_user) AND ('r' = ANY(privileges))
));
为简单起见,is_current_user 是另一个查询,它会准确地检查这一点。
现在 全文搜索查询 被document_policy 查询 扁平化,通过这样做,规划器执行Seq Scan 而不是 Index扫描导致查询速度减慢 300 倍!
我认为这个问题很明显,我该如何解决这个问题才能使全文搜索查询保持快速?
提前致谢!
最佳答案
我从发帖的时候就解决了这个问题...任何遇到这个问题的人,我都是这样做的:
我的解决方案是使用一个private SECURITY DEFINER
“包装”函数,其中包含 propper 查询和另一个调用 的 public 函数>private 一个和 INNER JOINS
需要访问控制的表。
所以在上面的特定情况下,它会是这样的:
CREATE FUNCTION private.filter_document() RETURNS SETOF public.document AS
$$
SELECT * FROM public.document WHERE (
to_tsvector(
'english',
content || ' ' || COALESCE(title, '')
) @@ plainto_tsquery('english', fulltext_search_documents.search_text)
)
$$
LANGUAGE SQL STABLE SECURITY DEFINER;
----
CREATE FUNCTION public.filter_document() RETURNS SETOF public.document AS
$$
SELECT filtered_d.* FROM private.filter_documents() AS filtered_d
INNER JOIN public.document AS d ON (d.id = filtered_d.id)
$$
LANGUAGE SQL STABLE;
因为我使用的是 Postgraphile (这是 super 棒 顺便说一句!),我能够省略对 private 模式的自省(introspection),使“危险”功能无法访问!通过适当的安全实现,最终用户将只能看到最终的 GraphQL 模式,完全从外界移除 Postgres。
这很漂亮! 直到最近 Postgres 10.3 发布并修复了它,才不再需要这种 hack。
另一方面,我的 RLS 策略非常复杂、嵌套且非常深入。他们再次运行的表也非常大(总共大约有 50,000 多个条目运行 RLS)。即使使用 super 复杂和嵌套的策略,我也设法将性能保持在合理的范围内。
使用 RLS 时,请记住以下几点:
INDEXES
STABLE
并且具有较高的 COST
(如@mkurtz 指出的那样);或者是 IMMUTABLE
EXPLAIN ANALYZE
运行它并尝试尽可能优化它希望你们能像我一样发现这些信息对您有帮助!
关于sql - 启用 RLS(行级安全性)时 PostgreSQL 查询不使用 INDEX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230535/
我最近通过 rustup update 升级了我的 Rust 环境,然后每次我打开我的编辑器时我的 VSCode 都会报错。编辑器右下角弹出两个重复的窗口,显示 Duplicated RLS conf
我已经为 Rust 安装了 Eclipse,并希望将其用于开发。但是,RLS 的内容辅助(例如代码完成和突出显示)不起作用。 RLS 似乎找不到 racer或 rustc . 当我查看 Rust 的设
我正在努力解决基本的行级安全问题。 我首先尝试创建一个“租户”表,该表的每一行只能由租户本身看到,然后将类似的规则应用于引用租户主键的其他表。 我在策略中使用 session 变量,并且我还想从客户端
我有一份关于患者和治疗师的申请。他们都在同一个 users table 。患者应该能够看到他们的治疗师,治疗师应该能够看到他们的患者。 我已经建立了一个物化 View ( user_access_pa
哪些操作使 recursive least squares (RLS) 变得复杂算法等于 O(n^2),为什么? % Filter Parameters p = 4;
我在 Postgres 中创建了一个登录角色,然后我尝试使用行级安全性授予修改表中指定行的权限。我已经尝试了数千次,但它不起作用。我只有一张 table 。 最佳答案 您没有提供足够的信息说明您采取了
描述:这是性能问题的示例演示。 我们首先创建了两个表,启用了行级安全性并创建了策略。 表定义: create table sample_schema.sample_table1(ID numeric(
试图编译:https://github.com/SergioBenitez/Rocket/tree/master/examples/hello Cargo.toml [dependencies] ro
我想通过链接服务器从使用行级安全性的 SQL Azure 获取数据。问题似乎是查询没有返回任何数据。 如果我直接在 SQL Azure 上执行相同的查询,我就会得到数据。 {链接服务器的 SQL 查询
我想通过链接服务器从使用行级安全性的 SQL Azure 获取数据。问题似乎是查询没有返回任何数据。 如果我直接在 SQL Azure 上执行相同的查询,我就会得到数据。 {链接服务器的 SQL 查询
我想创建一个同步作业,从外部系统获取用户,并将他们创建为特定角色下的数据源用户: 我正在努力寻找合适的 API/其他方法以编程方式将用户添加到这些组中。 最佳答案 目前,这是不可能的。它不能用作 Po
您可以在下面找到我在使用 RLS 管理对分层数据结构的访问的系统中遇到的问题的最小测试用例的代码。我正在使用 Postgres v11。 在代码中我有units,这是一个顶级对象。 units 在 1
我一直在阅读 Oracle VPD(虚拟专用数据库,又名细粒度安全性,基于标签的安全性的基础)的文档,有一些东西我很难理解。 VPD如何防止用户利用WHERE中的恶意功能泄露信息条款? 假设您有一个
过去,我使用安全策略和谓词函数在 Oracle 和 SQL Server 数据库中实现了行级安全性。 现在我的组织正在迁移到 Amazon Redshift 作为数据仓库,寻找有关在 Redshift
我们正在使用 Azure 流分析来构建新的 IoT 产品。数据已成功传输到 Power BI,但无法实现行级安全性,因此我们可以将此数据显示回客户,仅限于该客户的数据。我正在考虑在 ASA 和 PBI
在 MSSQL 2016 中向受行级安全性保护的表添加新列时,尝试使用 SQL Server Data Tools 发布数据库时出现以下错误: The current operation will c
我正在使用 PostgreSQL 10.1,开门见山...... 假设我有一个TABLE: CREATE TABLE public.document ( id uuid PRIMARY KEY
假设我们有一个表 Fruits details, 国家 水果 美国 苹果 印度 芒果 意大利 猕猴桃 澳大利亚 Guava 我们有 3 个 Angular 色,即region1_role ,regio
我正在使用 visual studio code 练习 Rust 程序。 我总是收到以下警告。 警告:RLS 无法为 Racer 设置 RUST_SRC_PATH,因为它无法读取 Rust 系统根。
我是一名优秀的程序员,十分优秀!