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

标签 postgresql postgresql-9.5

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

相关文章:

postgresql - bool 值被插入到 PostgreSQL 中的字符变化字段中

postgresql - 无法将 varchar(255) 转换为 float

python - 用于读取 CSV 并加载到 PostgreSQL 的 Airflow Pipeline

postgresql - 如何根据出生日期计算下一个生日?

sql - 具有动态列数的 PostgreSQL 查询

docker - 如何在docker上更改postgreSQL 9.5的时区?

sql - Python3 将 jsonb 数组插入 Postgresql 9.5

linux - 如何打印特定模式下表中的总行数?

postgresql - 如何向 Postgres 中的表添加多列?

postgresql - variable_conflict use_variable 是否不能与 UPSERT 的 ON CONFLICT 子句一起使用?