当您使用日志记录时,数据库服务器延迟触发语句上的约束检查,直至触发操作列表中的语句执行之后。这等同于执行触发语句前执行 SET CONSTRAINTS ALL DEFERRED 语句。完成触发操作后,数据库服务器有效执行 SET CONSTRAINTS constraint IMMEDIATE 语句以检查延迟的约束。该操作允许您写入触发器以便是触发器操作能够解析触发语句创建的任何违例。有关更多信息,请参阅 SET Database Object Mode 语句。
CREATE TABLE parent (cola INT PRIMARY KEY); CREATE TABLE child (cola INT REFERENCES parent CONSTRAINT r1); CREATE TRIGGER trig1 INSERT ON child REFERENCING NEW AS new FOR EACH ROW WHEN((SELECT COUNT (*) FROM parent WHERE cola = new.cola) = 0) -- parent row does not exist (INSERT INTO parent VALUES (new.cola));
当您将一行插入到引用约束中的子表中时,该行可能在父表中不存在。数据库服务器不立即在触发语句上返回此错误。相反,它允许触发操作通过将相应的行插入父表来解析约束违例。如先前示例所示,您可以在触发操作内检查父行是否存在,如果存在,则可以提供逻辑以绕过 INSERT 操作。
对于没有日志记录的数据库,数据库服务器不延迟触发语句上的约束检查。在此情况中,如果触发语句违反约束,则数据库服务器立即返回错误。
您不能在触发操作中使用 SET Transaction Mode 语句。当您激活触发器时,数据库服务器检查此约束,因为该语句可能在 UDR 中发生。