gpt4 book ai didi

sql - Postgresql:触发函数使其可编辑,如可更新 View

转载 作者:行者123 更新时间:2023-11-29 12:47:18 25 4
gpt4 key购买 nike

我在 PostgreSQL 中创建了一个函数,它处理几个表并根据传递的参数组合结果。它工作得很好,从客户的角度来看,它看起来像一个带有附加参数的普通表(即它可以像通常的选择查询一样查询)。

为了继续隐藏底层数据的信息,我还想创建一种写入表的方法。我想我会创建一个触发器来执行一个函数,该函数基本上会更新相关的基础表。但是,我无法在函数上创建触发器。有什么办法可以在除表以外的任何东西上创建触发器吗?我也在考虑使用 View (因为我相信可以在 View 上创建触发器),但是我需要更改函数以成为不适合的 View ,因为我无法传入一个参数。

最佳答案

您似乎想在函数上创建一个可更新 View 的等价物,您可以在函数上INSERTUPDATEDELETE功能。这是不可能的。

如果您要提供类似函数的界面,请同时提供用于数据修改的函数。

或者,将您的函数转换为 View 。允许他们使用 WHERE 子句限制 View ,而不是将参数传递给函数。然后使用 View 触发器(PostgreSQL 9.1 及以上版本)或规则(PostgreSQL 9.0 及以下版本,尽可能不要在较新版本上使用)启用 INSERTUPDATEDELETE 在 View 上。参见 CREATE TRIGGERCREATE RULE .规则很棘手,因此请按偏好使用 View 触发器。

PostgreSQL 在将过滤器向下插入 View 方面非常聪明,因此 SELECT * FROM some_view WHERE some_col = 4 通常不会扫描整个 View 然后对其进行过滤。它会将 WHERE 子句“推送”到 View 的查询中并执行它。因此,如果您的 View 是 SELECT * FROM some_table WHERE NOT is_archived,PostgreSQL 实际上会执行与 SELECT * FROM some_table WHERE (NOT is_archived) AND some_col = 4 等效的操作。因此,在查询 View 中的几行与所有行时,您可以而且经常会得到完全不同的查询计划。 There's an example of this in a post I wrote a while ago .

仅将您的函数包装在 View 中不会很好地工作,除非它是 STABLE 而不是 IMMUTABLE 的 SQL 函数(因此它可以内联)。您最好从函数中提取 SQL 并基于相同的 SQL 创建 View ,而不是基于函数本身。

如果您的函数参数未在简单的 WHERE 子句中使用,那么它会变得更加复杂,因为无法像在函数中那样将参数传递到 View 中。您可以创建一个包含参数所有可能值的 View ,然后对其进行过滤,但是如果 Pg seq 扫描 View ,这可能会导致非常糟糕的性能。在这些更复杂的情况下,我想提供一个函数调用接口(interface)来进行修改。

关于sql - Postgresql:触发函数使其可编辑,如可更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com