私は3つのテーブルを持っています。GRANDPARENT
、PARENT
、CHILD
と呼んでいます。 PARENT
は、FK列をGRANDPARENT
のPKに、CHILD
をFK列をPARENT
のPKにします。ここまでは順調ですね。Firebirdでの結合で更新可能なビューを設定する方法は?
今私はCHILD
のすべての情報と、GRANDPARENT
のPKを含むビューを設定したいと考えています。したがって:
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;
あまりにも難しくありません。しかし、ここでは難しい部分があります:このビューにはINSERT
またはUPDATE
があり、すべての関連データがCHILD
テーブルに書き込まれ、GRANDPARENT_ID
の値がある場合は無視する必要があります。
グーグルでやったことがあります。このような更新可能なビューを「トリガを使用して設定する」ことが可能であるはずですが、達成するためのトリガについては何も説明していませんこの効果。 INSERT
のケースを処理する方法を多かれ少なかれ知っていると思いますが、UPDATE
のケースについてはどうですか? UPDATE
ステートメントにはWHERE
句があり、テーブル内に任意の列を含めることができます。
たとえば、update CHILD_VIEW set (blah blah blah) where ID = 5
のようなものをupdate CHILD set (blah blah blah excluding GRANDPARENT_ID) where ID = 5
に変換するにはどうすればよいですか?あなたはすでにそれは本当に簡単、あなたがトリガで利用可能なすべての機能(すなわちOLD
とNEW
コンテキスト)を使用することができるということです:)
...どうかを見られるよう
良い質問のように見えるかもしれません...別の
ON UPDATE
とON INSERT
トリガを書くことができます'ON UPDATE'トリガを起動させた' UPDATE'文にどのカラムが含まれているのかを検出する方法はありません。 Firebirdトラッカーの機能要求がある場合は、これが価値があると思います。 – ainあなたのコードで 'C.GRANDPARENT_ID'を' P.GRANDPARENT_ID'にしてはいけませんか? – EMBarbosa
複数のテーブルビュー 'INSERT' /' UPDATE'sはありません?すごい! –