PostgreSQL создание триггера, который блокирует слишком много обновленных строк - PullRequest
0 голосов
/ 18 февраля 2020



Я хотел бы создать процедуру триггера, которая отключает транзакцию обновления, когда кто-то хочет изменить более 5 записей в таблице. Я пытаюсь с этим кодом, но не работает.

create FUNCTION tr_test1_trx() RETURNS trigger AS $tr_test1_trx$declare
counter_ integer := 0;
begin
raise notice 'trigger fired';
select COUNT(*) into counter_ from att_test.tr_test1 where object_name = new.object_name;
if counter_>5 then 
RAISE EXCEPTION 'ERROR: CANNOT UPDATE MORE THAN 5';
END IF;
END;
$tr_test1_trx$ LANGUAGE plpgsql;

CREATE TRIGGER tr_test1_trx BEFORE INSERT OR UPDATE ON att_test.tr_test1
FOR EACH row EXECUTE PROCEDURE tr_test1_trx();

1 Ответ

0 голосов
/ 18 февраля 2020

Вам необходим триггер уровня оператора, а не триггер уровня строки.

create or replace function block_mass_changes()
  returns trigger
as
$$
declare
  l_numrows integer;
begin
  select count(*)
    into l_numrows
  from new_rows;
  raise notice 'Rows: %', l_numrows;
  if l_numrows > 5 then
    raise 'Updating or inserting more than 5 rows is not allowed';
  end if;
  return null;
end;
$$
language plpgsql;

Затем необходимо создать один триггер для UPDATE и один для INSERT, поскольку невозможно определить триггер уровня оператора для двух действий:

CREATE TRIGGER block_updates_trigger
    AFTER UPDATE ON att_test.tr_test1
    REFERENCING NEW TABLE AS new_rows
    FOR EACH STATEMENT EXECUTE FUNCTION block_mass_changes();

CREATE TRIGGER block_inserts_trigger
    AFTER INSERT ON att_test.tr_test1
    REFERENCING NEW TABLE AS new_rows
    FOR EACH STATEMENT EXECUTE FUNCTION block_mass_changes();
...