ASSERTION
Constrângere declarativă multi-tabel
Un ASSERTION este o constrângere de integritate declarativă introdusă de SQL-92, care exprimă un predicat boolean asupra întregii stări a bazei de date. Spre deosebire de CHECK — limitat la un singur rând sau, cel mult, la o singură tabelă — un ASSERTION poate acoperi mai multe tabele și agregări, și este violat atunci când predicatul evaluează la FALSE după orice operație DML sau DDL.
Cum funcționează #
ASSERTION-ul se definește cu CREATE ASSERTION și este asociat unui schema. Motorul îl evaluează la sfârșitul fiecărei tranzacții (sau, în funcție de implementare, după fiecare instrucțiune): dacă predicatul returnează FALSE, tranzacția este respinsă cu ROLLBACK automat.
CREATE ASSERTION max_comenzi_per_client
CHECK (
NOT EXISTS (
SELECT client_id
FROM comenzi
GROUP BY client_id
HAVING COUNT(*) > 1000
)
);
Predicatul poate referenția orice tabelă vizibilă în schema, folosind subinterogări, agregări și join-uri. Enforcement-ul este responsabilitatea motorului, nu a stratului aplicativ.
Când se folosește #
ASSERTION-urile acoperă reguli de business care nu pot fi exprimate cu CHECK sau FOREIGN KEY: limite agregate, invarianți cross-tabel, constrângeri temporale distribuite pe mai multe entități. Costul este real: fiecare tranzacție care atinge tabelele referențiate poate declanșa reevaluarea predicatului, cu impact asupra performanței în scenarii cu volum mare de scrieri.
SQL-92 le-a standardizat, dar timp de decenii niciun RDBMS enterprise mainstream nu le-a implementat nativ. Oracle 23ai/26ai reprezintă primul motor de producție la scară largă care a făcut acest pas.