我尝试使用删除和更新触发器将更改记录到DB2表。 让我们举一个简单的例子:一个人有一个地址。日志表不仅应包含人员数据,还应包含地址表中的一些值。
所以这些表是PERSON(ID,NAME)和ADDRESS(PERSON_ID,STREET,...)
以下是我尝试设置的内容:
CREATE TRIGGER log_history
AFTER UPDATE OR DELETE ON person
REFERENCING OLD AS O
FOR EACH ROW MODE DB2SQL
BEGIN
DECLARE street VARCHAR(150);
SET street = (SELECT street from ADDRESS join person on ADDRESS.person_id=O.id);
INSERT INTO LOG(id,name,street) VALUES(O.id, O.name, street);
END
正在完美记录更新。我看到所有旧值都插入到日志表中,包括街道。
对于DELETE操作,日志行仅包含PERSON表的值,但对于已删除的行,STREET列为NULL。
我也尝试过使用BEFORE触发器,并尝试使用简单的where子句加入。结果总是一样的。
我应该提到有一个ON DELETE CASCADE FK,删除PERSON时会删除ADDRESS。然而,我的理解是删除了该依赖表(ADDRESS )触发后发生......
我在Linux服务器上使用DB2 10.5 LUW(不应该是相关的,但是......)
那么有人知道如何从触发删除的表中检索另一个表中的连接值吗? THX
答案 0 :(得分:0)
正如mustaccio所建议的那样,在删除或更新之前没有CASCADE将允许我检索已删除行引用的连接值。 不幸的是,我无法遵循这条路线,因为我们使用的持久性框架是“足够聪明”#34;在删除此人之前发布地址表的删除语句。 改变我们的O / R映射并教授框架这种特殊记录目的的额外技巧似乎是一种冒险的尝试。似乎在程序方面实现日志记录行为是可以协同工作的,并且风险较小。所以我决定不去寻找TRIGGER。
无论如何,感谢mustaccio的评论和指针。
答案 1 :(得分:0)
只是为了让这个线程完整: 以编程方式做事并没有真正起作用,因为我们必须在应用程序端跟踪旧值。
那么我们最终得到了什么?我们编写了一个存储过程,并在每次有关记录将在当前(应用程序端)事务中更改时调用它。这有很多限制,最糟糕的(在我们的情况下幸运可管理)一个是你必须考虑手动调用该存储过程。桌面上的触发器会更加安全......哦,我的。