2012-03-22 11 views
6

私は3つのテーブルを持っています。GRANDPARENTPARENTCHILDと呼んでいます。 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に変換するにはどうすればよいですか?あなたはすでにそれは本当に簡単、あなたがトリガで利用可能なすべての機能(すなわちOLDNEWコンテキスト)を使用することができるということです:)

...どうかを見られるよう

+0

良い質問のように見えるかもしれません...別のON UPDATEON INSERTトリガを書くことができます'ON UPDATE'トリガを起動させた' UPDATE'文にどのカラムが含まれているのかを検出する方法はありません。 Firebirdトラッカーの機能要求がある場合は、これが価値があると思います。 – ain

+0

あなたのコードで 'C.GRANDPARENT_ID'を' P.GRANDPARENT_ID'にしてはいけませんか? – EMBarbosa

+0

複数のテーブルビュー 'INSERT' /' UPDATE'sはありません?すごい! –

答えて

6

さて、あなたは、トリガを使用することによってそれを行いますFirebird 2.1以降を使用している場合は、UPDATE OR INSERT文を使用するか、INSERTINGおよびUPDATINGコンテキスト変数を使用して、マルチアクショントリガでの更新または挿入を検出できます。または、もちろん、あなたは私の知る限りそこ...

だからあなたのトリガが一部のカラムだけの `UPDATE`についてこの

CREATE TRIGGER CHILD_VIEW_Save FOR CHILD_VIEW 
ACTIVE BEFORE INSERT OR UPDATE POSITION 10 
AS 
BEGIN 
    IF(NEW.ID IS NULL)THEN NEW.ID = GEN_ID(GEN_Child, 1); 
    UPDATE OR INSERT INTO CHILD (ID, PARENT_ID, OTHER_STUFF, GRANDPARENT_ID) 
      VALUES(NEW.ID, NEW.PARENT_ID, NEW.OTHER_STUFF, NEW.GRANDPARENT_ID); 
END 
+0

... 'UPDATE'のWHERE節はどうですか? –

+2

それはどうですか? 'UPDATE CHILD_VIEW WHERE'の' where'を意味するならば、トリガーの中で '' WHERE''を意味するならば、トリガーでトリガーを気にしません(トリガーは各マッチする行に対して起動されます)。 'UPDATE OR INSERT'を使うか、WHERE句を自分で書いてください(あなたは、トリガーの中で更新しようとしているテーブルのPKを知っています)。 – ain

+0

OK、PK上の良い点。もう一つの難しいことは、列セット全体を更新しない「UPDATE」です。テーブルに5つの列があり、UPDATEステートメントで3つしか設定されていない場合、例のようなブランケットトリガーは他の2つの列に対して何を行いますか? –

関連する問題