Nemyslím si, že je to možné udělat deklarativně.
Pokud je zaručeno, že všechny vložky projdou uloženou procedurou a hodnota SaleValue se po vložení neaktualizuje, mělo by fungovat následující (názvy tabulek a sloupců jsem si vymyslel, protože nebyly dodány v úvodní otázce)
DECLARE @SumSaleValue MONEY
BEGIN TRAN
SELECT @SumSaleValue = SUM(SaleValue)
FROM dbo.Orders WITH (UPDLOCK, HOLDLOCK)
WHERE TransactionId = @TransactionId
IF @SumSaleValue > 1000
BEGIN
RAISERROR('Cannot do insert as total would exceed order limit',16,1);
ROLLBACK;
RETURN;
END
/*Code for INSERT goes here*/
COMMIT
HOLDLOCK
poskytuje serializovatelnou sémantiku a uzamkne celý rozsah odpovídající TransactionId
a UPDLOCK
zabraňuje tomu, aby dvě souběžné transakce uzamkly stejný rozsah, čímž se snižuje riziko uváznutí.
Index na TransactionId,SaleValue
nejlepší by bylo tento dotaz podpořit.