postgresql - 当对 TABLE1 进行 SELECT 查询时,如何创建将 TABLE1 的值插入到 TABLE2 的规则
问题描述
我意识到我无法为 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 函数)来实现,但这也会很快变得丑陋。
推荐阅读
- python - Pandas:跨多列获取一行中指定值的频率
- java - 我应该如何将对象添加到私有静态 ArrayList?
- testing - 无法在 Testcafe 中单击弹出确认按钮
- django - 尝试使用 manage.py 时没有名为“djangosite”的模块
- html - 标签宽度适合标签文本
- reactjs - React Native - 使用我制作的自定义组件时出错(错误:未定义无法解析模块
) - jenkins - 如何在 jenkins slave 中查看构建控制台输出
- python - 通过循环不断更新QTableView
- node.js - kraken.js 没有创建新项目
- python - 使用 tkinter 运行另一个 python 脚本