gpt4 book ai didi

postgresql - 当对 TABLE1 进行 SELECT 查询时,如何创建一个将 TABLE1 的值插入到 TABLE2 的规则

转载 作者:行者123 更新时间:2023-11-29 13:40:53 31 4
gpt4 key购买 nike

我意识到我无法为 SELECT 创建触发器,因此只能依靠 RULES。

CREATE OR REPLACE RULE log_select AS 
ON SELECT TO usertable
DO ALSO INSERT INTO selectLOG(prim_key,val)
VALUES(prim_key,val);

以上示例不工作,出现以下错误:

ERROR:  column "prim_key" does not exist
LINE 4: VALUES(prim_key,val)
^
HINT: There is a column named "prim_key" in table "old", but
it cannot be referenced from this part of the query.

基本上,当用户对 table1 进行 SELECT 时,我想将行插入 table2。

最佳答案

正如 Laurenz 所指出的,这在规则中是不可能的。

但是您是否考虑过一个函数来访问该表,而不是直接访问表本身?

您可以创建一个函数来运行查询、存储结果并返回它。然后仅授予该函数的执行权限并撤销对该表的任何直接访问。

类似于:

create function get_usertable(p_key integer)
returns setof usertable
as
$$
with result as (
select *
from usertable
where id = p_key
), log_query as (
insert into selectlog (prim_key, val)
select *
from result
)
select *
from result;
$$
language sql;

此解决方案的主要缺点是,您必须为可能需要的任何条件提供参数(参数 p_key 只是一个示例)。如果 WHERE 子句的选项有限,那么这可能是一个替代方案。如果您需要更复杂的 where 条件,您可以使用动态 SQL(和 PL/pgSQL 函数而不是 SQL 函数)来实现,但这也会很快变得丑陋。

关于postgresql - 当对 TABLE1 进行 SELECT 查询时,如何创建一个将 TABLE1 的值插入到 TABLE2 的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55604602/

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