如何在Firebird中使用连接设置可更新视图?

时间:2012-03-22 23:20:20

标签: sql firebird

我有三张桌子,我们称之为GRANDPARENTPARENTCHILDPARENT有一个FK列到GRANDPARENT的PK,而CHILD有一个FK列到PARENT的PK。到目前为止,非常好。

现在我想设置一个包含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;

不太难。但这里有一个棘手的部分:我希望能够INSERTUPDATE加入此视图,并将所有相关数据写入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

1 个答案:

答案 0 :(得分:6)

嗯,你通过使用触发器来实现,正如你已经发现的那样:)

真的很简单,你可以使用触发器中可用的所有功能(即OLDNEW上下文)......如果你使用Firebird 2.1或更新版本,那么你可以使用UPDATE OR INSERT语句,或者您可以使用INSERTINGUPDATING上下文变量来检测它是否在多动作触发器中更新或插入。或者,当然,您可以单独编写ON UPDATEON INSERT触发器...

所以你的触发器可能看起来像这样

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