我意识到我无法为 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/