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

Mas*_*ler 6 sql firebird

我有三张桌子,我们打电话给他们GRANDPARENT,PARENT然后CHILD. PARENT有一个FK列GRANDPARENT的PK,并CHILD有一个FK列PARENT的PK.到现在为止还挺好.

现在我想设置一个包含所有信息的视图CHILD,以及来自的PK GRANDPARENT.所以:

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;
Run Code Online (Sandbox Code Playgroud)

不是太难.但这里有一个棘手的部分:我希望能够INSERT或者UPDATE能够看到这个视图,并将所有相关数据写入CHILD表中,并且GRANDPARENT_ID应该忽略值(如果有的话).

我已经做了一些谷歌搜索,显然应该可以设置一个像"通过使用触发器"这样的可更新视图,但它没有解释我应该做什么与​​触发器来实现这种效果.我想我或多或少知道如何处理INSERT案件,但UPDATE案件呢? UPDATE语句包含WHERE子句,并且可以包含或不包含表中的任何列.

例如,我如何使用触发器来变换像update CHILD_VIEW set (blah blah blah) where ID = 5update CHILD set (blah blah blah excluding GRANDPARENT_ID) where ID = 5

ain*_*ain 6

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

它真的就是这么简单,你可以使用所有的触发器(即中提供的功能OLDNEW上下文)......如果你使用的Firebird 2.1或更新版本,那么你可以使用UPDATE或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
Run Code Online (Sandbox Code Playgroud)

  • 怎么样?如果你的意思是'UPDATE CHILD_View WHERE'中的`where`那么你不关心它在触发器中(触发器会为每个匹配的行触发),如果你的意思是触发器内的`WHERE`"那么要么使用`UPDATE OR INSERT`或自己编写WHERE子句(你知道你要在触发器内更新的表的PK). (2认同)