To, co zde máte, je omezení tabulky napříč řádky – tj. nemůžete vložit pouze jeden Oracle CONSTRAINT
ve sloupci, protože se mohou současně dívat pouze na data v rámci jednoho řádku.
Oracle podporuje pouze dva typy křížových omezení – jedinečnost (např. primární klíče a jedinečná omezení) a referenční integritu (cizí klíče).
Ve vašem případě budete muset omezení ručně nakódovat sami – a s tím souvisí i odpovědnost zajistit, že omezení nebude porušeno v přítomnosti více relací, z nichž každá nevidí data vložená/aktualizovaná jinými souběžnými relacemi. (alespoň dokud se nezavážou).
Zjednodušeným přístupem je přidat spouštěč, který vydá dotaz, aby spočítal, kolik záznamů je v konfliktu s novým záznamem; ale to nebude fungovat, protože spouštěč nevidí řádky, které byly vloženy/aktualizovány jinými relacemi, ale ještě nebyly potvrzeny; takže spouštěč někdy umožní členům vypůjčit si 6 videí, pokud (například) dostanou dva pokladníky, aby zadali data do samostatných terminálů.
Jedna cesta Chcete-li tento problém obejít, je vložit nějaký prvek serializace - např. spouštěč by si nejprve vyžádal zámek v záznamu člena (např. pomocí SELECT FOR UPDATE), než bude moci kontrolovat pronájmy; tímto způsobem, pokud se 2. relace pokusí vložit výpůjčky, počká, dokud první relace neprovede potvrzení nebo vrácení zpět.
Jiný způsob kolem tohoto problému je použití agregačního materializovaného pohledu, který by byl založen na dotazu, který je navržen tak, aby našel všechny řádky, které v testu neprošly; očekává se, že MV bude prázdné a vy na MV vložíte omezení tabulky tak, že pokud by se v MV někdy objevil řádek, omezení by bylo porušeno. Výsledkem toho je, že jakýkoli příkaz, který se pokusí vložit řádky, které porušují omezení, způsobí porušení omezení při aktualizaci MV.
Napsání dotazu na základě vašeho návrhu je ponecháno jako cvičení pro čtenáře :)