Sql 每当选择行时列字段的增量值

Sql 每当选择行时列字段的增量值,sql,postgresql,sql-update,Sql,Postgresql,Sql Update,因此,我有一个功能,可以很好地更新产品上的视图数: UPDATE products SET view=view+1 WHERE id=@id RETURNING * 问题是,我目前正在将用户切换为只读,以增加安全性。不幸的是,由于此函数更新视图的数量,因此不可能,因为它是一个更新操作 所以我想知道PSQL是否允许我创建一个触发器函数,在每次查询数据时更新列值?我查看了用例,但没有注意到任何与我的用例相关的示例 可能是这样的(伪代码): 我唯一能想到的就是让选择上的产品通过一个功能进行操作: S

因此,我有一个功能,可以很好地更新产品上的视图数:

UPDATE products SET view=view+1 WHERE id=@id RETURNING *
问题是,我目前正在将用户切换为只读,以增加安全性。不幸的是,由于此函数更新视图的数量,因此不可能,因为它是一个更新操作

所以我想知道PSQL是否允许我创建一个触发器函数,在每次查询数据时更新列值?我查看了用例,但没有注意到任何与我的用例相关的示例

可能是这样的(伪代码):


我唯一能想到的就是让
选择
上的
产品
通过一个功能进行操作:

SELECT * product_item(id);

并让product_item()执行
更新
,其中product_item()将设置
安全定义程序
,以便它可以作为特权用户运行。

我唯一能想到的是让
选择
上的
产品
通过一个函数进行操作:

SELECT * product_item(id);

让product_item()执行
更新
,其中product_item()将设置
安全定义程序
,以便它可以作为特权用户运行。

我唯一能想到的是,创建一个函数,该函数是使用
安全定义程序
作为对数据库具有写入权限的用户创建的。然后使用函数代替表格:

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

如果您想允许查看多个产品,您可以将函数更改为“返回产品集”

,我唯一能想到的是,创建一个函数,该函数是以对数据库具有写入权限的用户身份使用
安全定义器创建的。然后使用函数代替表格:

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

如果您想允许查看多个产品,可以将函数更改为
返回产品集

文档说明
选择
触发器是不可能的。也许其他人会为您提供更好的解决方案,但如果您这样做是为了响应审计或根据安全架构师的指示,我的建议是创建一个
product\u views
表,其中包含一个FK back to
products
将更新授予您的只读用户。将其作为一种缓解控制,以保护主
产品
表,同时保留跟踪视图的能力。文档说明,
选择
触发器是不可能的。也许其他人会为您提供更好的解决方案,但如果您这样做是为了响应审计或根据安全架构师的指示,我的建议是创建一个
product\u views
表,其中包含一个FK back to
products
将更新授予您的只读用户。将其作为一种缓解控制,以保护主
产品
表,同时保留跟踪视图的功能。好的,您需要将其替换为表名。好的,有一点输入错误,这就是我感到困惑的原因。函数创建成功,但当我尝试调用它时,我得到了“错误:非易失性函数中不允许更新”ALTER function get_product(p_product_id integer)volatile;在将“稳定”编辑为“不稳定”后,我接受了您的回答,谢谢!嗯,你需要把它换成你的桌子的名字。好的,有一个轻微的打字错误,这就是为什么我感到困惑的原因。函数创建成功,但当我尝试调用它时,我得到了“错误:非易失性函数中不允许更新”ALTER function get_product(p_product_id integer)volatile;在将“稳定”编辑为“不稳定”后,我接受了您的回答,谢谢!感谢您的简短回答,这确实是解决方案!感谢您的简短回答,这确实是解决方案!