Można to osiągnąć za pomocą wyzwalacza na poziomie instrukcji AFTER DELETE. Wewnątrz funkcji wyzwalacza możesz policzyć liczbę wierszy, których dotyczy problem, i zgłosić wyjątek, jeśli liczba jest zbyt wysoka. Wyjątek wymusi wycofanie transakcji, która zainicjowała usunięcie.
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;
A następnie utwórz wyzwalacz:
create trigger prevent_mass_delete
after delete on the_table
referencing old table as old_table
for each statement
execute procedure prevent_delete();