![]() |
updateable views
Hi,
ein View ist ja im Prinzip nichts anderes, als eine temporäre table, die die Basistabellen abbildet. Daß diese, so wie teilweise behauptet wird, nur eine spezielle Sicht auf die Daten ist, stimmt offensichtlich so auch nicht. Angeblich kann man da auch UPDATES oder INSERTS drauf machen. Hat einer so was schon mal gemacht ??? Es soll über Trigger laufen und ein (Zitat Borland) : "handy feature" von Interbase sein. |
Re: updateable views
Views lassen sich nicht nur mit IB realisieren sondern auch mit gängigen anderen DBMS wie MS SQL Server / MSDE und auch Oracle.
Eine View ist vor allem dann nützlich, wenn man sehr häufig bestimmte Joins verwenden muss. Diese Joins werden dann nicht jedesmal komplett ausgeführt (manche DBMS brauchen da schon ne Weile für ;-) ) sondern diese 'Sicht' auf die Daten wird gecached. Sofern der View einen (oder mehrere) inner Joins verwendet kannst Du freilich auch Updates darauf machen. Bei outer Joins klappt das logischerweise nicht mehr. |
Re: updateable views
Hallo,
im Prinzip kann man einen View nur updaten, wenn nur eine Tabelle abgefragt wird. In Oracle kann man dieses Verhalten mit einem "instead of" Trigger umgehen. D.h. der Trigger wird statt mit
SQL-Code:
mit
Create or Replace Trigger TRIGGER_NAME before Insert on TABELLE
SQL-Code:
erzeugt.
Create or Replace Trigger TRIGGER_NAME instead of Insert on VIEW
In diesem Trigger kann man die Anweisungen dann auf die einzelnen Tabellen aufteilen. In IB 6.0 ist das meines Wissens nicht möglich, vielleicht aber in der neuesten Version von Borland. |
Re: updateable views
Zitat:
SQL-Code:
Nur was wird da genau jetzt gemacht :?:
CREATE TABLE Table1 (
ColA INTEGER NOT NULL, ColB VARCHAR(20), CONSTRAINT pk_table PRIMARY KEY(ColA) ); CREATE TABLE Table2 ( ColA INTEGER NOT NULL, ColC VARCHAR(20), CONSTRAINT fk_table2 FOREIGN KEY REFERENCES Table1(ColA) ); CREATE VIEW TableView AS SELECT Table1.ColA, Table1.ColB, Table2.ColC FROM Table1, Table2 WHERE Table1.ColA = Table2.ColA; CREATE TRIGGER TableView_Delete FOR TableView BEFORE DELETE AS BEGIN DELETE FROM Table1 WHERE ColA = OLD.ColA; DELETE FROM Table2 WHERE ColA = OLD.ColA; END; CREATE TRIGGER TableView_Update FOR TableView BEFORE UPDATE AS BEGIN UPDATE Table1 SET ColB = NEW.ColB WHERE ColA = OLD.ColA; UPDATE Table2 SET ColC = NEW.ColC WHERE ColA = OLD.ColA; END; CREATE TRIGGER TableView_Insert FOR TableView BEFORE INSERT AS BEGIN INSERT INTO Table1 values (NEW.ColA,NEW.ColB); INSERT INTO Table2 values (NEW.ColA,NEW.ColC); END; |
Re: updateable views
Das ist eigentlich identisch wie in meinem Beispiel von Oracle, ausser dass man keinen eigenen Triggertyp benötigt.
Das ist natürlich OK wenn man nur Updates oder Deletes macht. Beim Insert kannst du immer nur Datensätze in beiden Tabellen gleichzeitig anlegen. Da nützt dir die 1:n Beziehung nichts mehr. Was da passiert? In den Triggern für den View werden die entsprechenden Anweisungen für die beiden Tabellen separat ausgeführt. Das ist eigentlich alles. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz