我有三张桌子,我们称之为GRANDPARENT
,PARENT
和CHILD
。 PARENT
有一个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;
不太难。但这里有一个棘手的部分:我希望能够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
?
答案 0 :(得分:6)
嗯,你通过使用触发器来实现,正如你已经发现的那样:)
真的很简单,你可以使用触发器中可用的所有功能(即OLD
和NEW
上下文)......如果你使用Firebird 2.1或更新版本,那么你可以使用UPDATE OR 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