Ellenőrző megkötés

A legtöbb adatbázis-kezelő rendszer az ellenőrző megkötéseket egyetlen sorra korlátozza, a konstansokhoz és determinisztikus függvényekhez való hozzáféréssel, de más táblák adataihoz vagy az aktuális tranzakció számára a tranzakció elkülönítése miatt láthatatlan adatokhoz nem.

Az ilyen megkötések nem igazán táblaellenőrző megkötések, hanem inkább sorellenőrző megkötések. Mivel ezek a korlátozások általában csak akkor kerülnek ellenőrzésre, amikor egy sort közvetlenül frissítenek (a teljesítmény miatt), és gyakran implikált INSERT vagy UPDATE triggerekként vannak implementálva, az integritási korlátozások közvetett művelettel is megsérthetők lennének, ha nem lennének ezek a korlátozások. Ráadásul ezeknek a rekordoknak az egyébként érvényes módosításait a CHECK korlátozás megakadályozná. Néhány példa a veszélyes korlátozásokra:

  • CHECK ((select count(*) from invoices where invoices.customerId = customerId) < 1000)
  • CHECK (dateInserted = CURRENT_DATE)
  • CHECK (countItems = RAND())

A felhasználó által definiált triggerek segítségével megkerülhetők ezek a korlátozások. Bár a megvalósítás hasonló, szemantikailag egyértelmű, hogy a triggerek csak akkor lépnek működésbe, ha a táblát közvetlenül módosítják, és a tervező felelőssége, hogy kezelje a közvetett, fontos változásokat más táblákban; a korlátozásoknak ezzel szemben az a céljuk, hogy “mindig igazak” legyenek, függetlenül a felhasználó műveleteitől vagy a tervező előrelátásának hiányától.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.