sql—选择行时列字段的增量值

5us2dqdw  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(275)

所以我有一个非常好的函数来更新产品的浏览量:

UPDATE products SET view=view+1 WHERE id=@id RETURNING *

问题是,我目前正在将我的用户切换为只读,以增加更多的安全性。不幸的是,由于这个函数更新了视图的数量,所以这是不可能的,因为它是一个更新操作。
所以我想知道psql是否允许我创建一个触发器函数,在每次查询数据时更新列值?我查看了官方文档,但没有注意到任何与我的用例相关的示例。
可能是这样的(伪代码):

CREATE TRIGGER view_increment
    AFTER SELECT ON products WHERE id=@id
    EXECUTE SET view=view+1;
neekobn8

neekobn81#

我唯一能想到的就是创建一个 security definer 作为对数据库具有写入权限的用户。然后使用函数代替表:

create function get_product(p_product_id integer)
  returns products --<< returns a complete row
as
$$
  update products 
    set "view" = "view" + 1;
  select *
  from product
  where id = p_product_id;
$$
language sql
volatile
security definer; --<< runs with the privileges of the owner

然后他们就这样使用它:

select *
from get_product(42);

如果要允许查看多个产品,可以将函数更改为 returns setof product

ct2axkht

ct2axkht2#

我唯一能想到的就是 SELECTproducts 通过函数操作:

SELECT * product_item(id);

并让product\u item()执行 UPDATE ,其中product\u item()将 SECURITY DEFINER 设置为可以作为特权用户运行。

相关问题