Mam trzy tabele, nazwijmy je GRANDPARENT
, PARENT
i CHILD
. PARENT
ma kolumnę FK do GRANDPARENT
's PK, a CHILD
ma kolumnę FK do PARENT
' s PK. Jak na razie dobrze.Jak ustawić aktualizowalny widok z dołączeniem do Firebird?
Teraz chcę ustawić widok, który zawiera wszystkie informacje w CHILD
, plus PK od GRANDPARENT
. A więc:
CREATE VIEW CHILD_VIEW
(
ID,
PARENT_ID,
OTHER_STUFF,
GRANDPARENT_ID
)
AS
SELECT
C.ID,
C.PARENT_ID,
C.OTHER_STUFF,
C.GRANDPARENT_ID
FROM CHILD C
join PARENT P on P.ID = C.PARENT_ID;
Nie za ciężko. Ale tu jest podchwytliwa część: chcę mieć możliwość wyświetlenia tego widoku w postaci INSERT
lub UPDATE
, a wszystkie istotne dane zostaną zapisane w tabeli CHILD
, a wartość GRANDPARENT_ID
, jeśli taka istnieje, powinna zostać zignorowana.
Zrobiłem trochę Googling i najwidoczniej powinno być możliwe ustawienie widoku aktualizowalnego, takiego jak to "przy użyciu wyzwalaczy", ale nie wyjaśnia to nigdzie, co mam zrobić z wyzwalaczami, aby osiągnąć ten efekt. Myślę, że wiem mniej więcej jak sobie radzić z obudową INSERT
, ale co z obudową UPDATE
? UPDATE
Wyrażenia mają klauzule WHERE
i mogą zawierać dowolne kolumny w tabeli.
Na przykład, jak użyć wyzwalacza, aby przekształcić coś w rodzaju update CHILD_VIEW set (blah blah blah) where ID = 5
w update CHILD set (blah blah blah excluding GRANDPARENT_ID) where ID = 5
?
Dobre pytanie o 'UPDATE' tylko niektórych kolumn ... AFAIK tam nie jest sposobem na wykrycie, które kolumny są zawarte w instrukcji 'UPDATE', która spowodowała uruchomienie wyzwalacza' ON UPDATE'. Myślę, że jest to warte polecenia funkcji w Firebird tracker, jeśli jeszcze go nie ma. – ain
Czy w swoim kodzie 'C.GRANDPARENT_ID' nie powinien być' P.GRANDPARENT_ID'? – EMBarbosa
brak widoku wielu tabel 'INSERT' /' UPDATE's? booooo! –