【问题标题】:Postgres trigger check amount before deletePostgres在删除前触发检查金额
【发布时间】:2019-07-11 11:31:21
【问题描述】:

我正在尝试在触发器之前创建一个 postgres,以在实际删除之前检查将要删除的记录数量。例如不删除超过 5 条记录

【问题讨论】:

  • 为什么不在delete 语句本身中这样做?
  • 我想将其用作安全功能。这样您就不必在应用程序中构建这些检查

标签: sql postgresql triggers


【解决方案1】:

您可以使用 AFTER DELETE 语句级触发器来实现这一点。在触发函数中,您可以计算受影响的行数,如果计数过高则抛出异常。该异常将强制回滚发起删除的事务。

create function prevent_delete()
  returns trigger
as
$BODY$ 
declare
  l_count integer;
begin 
  select count(*)
    into l_count
  from old_table;

  if l_count > 5 then 
    raise exception 'Too many rows would be deleted';
  end if; 
  return null;
end; 
$BODY$ 
LANGUAGE plpgsql;

然后创建触发器:

create trigger prevent_mass_delete 
   after delete on the_table
   referencing old table as old_table
   for each statement 
   execute procedure prevent_delete();

【讨论】:

  • 只是好奇:为什么不构建与 BEFORE DELETE 触发器相同的功能?
  • @S-Man:因为语句级触发器只能定义为 AFTER 触发器(这是有道理的,因为只有 after 一切都完成后,数据库才能知道哪些行受到影响由声明)
  • 感谢您的回答。这会恢复已删除的记录吗?
  • @AndreCoetzee:是的,正如我所写:它将回滚事务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2020-03-12
  • 1970-01-01
  • 2010-12-29
  • 2019-02-25
  • 1970-01-01
  • 2014-08-02
相关资源
最近更新 更多