Не уверен, что я понял, как хранится max_transaction_amount, но для меня это звучит так, как будто вы можете достичь этого с помощью столбца баланса в таблице денежных средств и проверочного ограничения. Баланс будет обновляться каждый раз, когда в таблицу транзакций вставляется строка
CREATE TABLE money
(
currency_id integer not null,
max_transaction_amount numeric(18,2) not null,
current_balance numeric(18,2) not null default 0,
primary key (currency_id),
check (current_balance <= max_transaction_amount)
);
CREATE TABLE transactions
(
transaction_id integer not null,
transaction_amount numeric(18,2) not null,
currency_id integer not null,
primary key (transaction_id),
foreign key (currency_id) references money (currency_id)
);
Теперь вам нужно только убедиться, что current_balance обновляется при каждой вставке транзакции. Похоже, это один из редких случаев, когда правило имеет смысл (но может быть выполнено и в триггере - особенно если вам нужно сделать больше проверок):
CREATE RULE transactions_insert AS
ON INSERT TO transactions
DO UPDATE money
SET current_balance = current_balance + new.transaction_amount
WHERE currency_id = new.currency_id;
Теперь при обновлении столбца current_balance
проверочное ограничение будет следить за тем, чтобы max_transaction_amount
не превышалось.
Если вам нужно накрыть UPDATE
s к таблице, вам нужно создать другое правило:
CREATE RULE transactions_update AS
ON UPDATE TO transactions
DO UPDATE money
SET current_balance = current_balance - old.transaction_amount + new.transaction_amount
WHERE currency_id = new.currency_id;
Конечно, эти два правила могут быть выполнены и с одной триггерной функцией.