日志记录和恢复

您可以为数据库创建触发器,使其带有或不带有日志记录。如果具有事务日志记录的数据库中的触发器失败,则触发语句和触发操作会回滚,就好像这些操作时触发语句的扩展那样,但是其它事务不回滚。

但是,在不具有事务日志记录的数据库中,当触发语句失败时,您不能回滚。在此情况中,您负责维护数据库中的数据完整性。触发语句的 UPDATE 、INSERT 或 DELETE 操作在 FOR EACH ROW 部分中的触发操作前发生。如果没有日志记录的数据库中的触发操作失败,则应用程序必须将触发语句更改的行恢复到先前值。

如果触发操作调用 UDR,但是 UDR 在异常处理部分终止,则该部分中修改数据的任何操作都随触发语句回滚。在以下部分示例中,当异常处理程序陷入错误时,它在表 logtab 中插入一行:
ON EXCEPTION IN (-201)
        INSERT INTO logtab values (errno, errstr);
        RAISE EXCEPTION -201
        END EXCEPTION;

但是,当 RAISE EXCEPTION 语句返回错误时,数据库服务器回滚该 INSERT ,因为它是触发操作的一部分。如果 UDR 在触发操作外执行,则 INSERT不回滚。

实现触发操作的 UDR 不能包含任何 BEGIN WORK 、COMMIT WORK 或 ROLLBACK WORK 语句。如果数据库具有事务日志记录,则您必须在触发语句前开始显式事务,或者该语句本身必须是显式事务。无论哪种情况,UDR 中任何其它与事务相关的语句都无效。

您可以使用触发器实施数据库服务器当前不支持的引用操作。在没有日志记录的数据库中,当触发语句失败时,您负责维护数据完整性。