Samstag, April 06, 2013

Materialized Views zur Implementierung von table constraints

Toon Koppelaars zeigt, wie man Materialized Views mit der Option REFRESH FAST ON COMMIT angelegen kann, um table constraints - also multi-row constraints - zu unterstützen. Die Idee dabei ist sehr einfach (und nicht neu - erstmals ist sie mir vor ziemlich vielen Jahren bei Tom Kyte begegnet - aber durchaus wirksam): man legt eine MV an, die niemals Zeilen enthalten sollte - also z.B.:

create materialized view ...
refresh fast on commit
as
select 'wrong' as text
  from dual
 where exists ... -- hier folgt die eigentliche Constraint-Logik 

Auf der zur MV gehörigen Tabelle wird dann ein Check-Constraint mit der Bedingung 1 = 0 ergänzt, der folglich einen Fehler wirft, so bald das Commit für die Basistabelle eine Aktualisierung der MV initiiert. Leider sind die Voraussetzungen für REFRESH FAST ON COMMIT recht restriktiv - meine letzten Notizen zum Thema (mit ein paar weiterführenden Links) finden sich hier -, was die Einsatzmöglichkeiten beschränken kann. Außerdem ist das FAST Refresh eines jener Oracle-Features, bei denen die Angabe FAST Anlass zur Sorge gibt - tatsächlich ist es inkrementell, aber nicht unbedingt schnell (d.h. schneller als ein complete refresh). Aber so lange Oracle (und andere RDBMS) keine echten SQL Assertions zur Unterstützung von table constraints anbietet, sind solche MVs ein brauchbarer Workaround.

Keine Kommentare:

Kommentar veröffentlichen