我有三张桌子,我们打电话给他们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 = 5为update CHILD set (blah blah blah excluding GRANDPARENT_ID) where ID = 5?
好吧,你通过使用触发器来实现,正如你已经发现的那样:)
它真的就是这么简单,你可以使用所有的触发器(即中提供的功能OLD和NEW上下文)......如果你使用的Firebird 2.1或更新版本,那么你可以使用UPDATE或INSERT语句,或者您可以使用INSERTING和UPDATING要检测的上下文变量是在多动作触发器中更新或插入.或者,当然,你可以写单独的ON UPDATE和ON 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)