您可以为数据库创建触发器,使其带有或不带有日志记录。如果具有事务日志记录的数据库中的触发器失败,则触发语句和触发操作会回滚,就好像这些操作时触发语句的扩展那样,但是其它事务不回滚。
但是,在不具有事务日志记录的数据库中,当触发语句失败时,您不能回滚。在此情况中,您负责维护数据库中的数据完整性。触发语句的 UPDATE 、INSERT 或 DELETE 操作在 FOR EACH ROW 部分中的触发操作前发生。如果没有日志记录的数据库中的触发操作失败,则应用程序必须将触发语句更改的行恢复到先前值。
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 中任何其它与事务相关的语句都无效。
您可以使用触发器实施数据库服务器当前不支持的引用操作。在没有日志记录的数据库中,当触发语句失败时,您负责维护数据完整性。