如果 Oracle 数据库表上的触发器无法成功执行或无法编译,是否会影响基表?



假设有表A和B。 a 上有一个 AFTER INSERT 触发器,用于将行数据复制到 b。

如果在触发器执行期间出现错误,它是否会以任何方式影响表 a? 如果触发器由于定义不明确而无法编译,是否会影响表 a?

我想向"不是我的"表添加一个触发器。我想评估这可能带来的风险。

干杯

====

========= 编辑 ===================我验证了 - 通过处理错误(如回复中建议的那样( - 它现在不会影响基表。

create table tableA (column1 number);
create table tableB (column1 number, CONSTRAINT constraintName PRIMARY KEY (column1));
create or replace TRIGGER tableA_trigger
AFTER INSERT ON tableA
FOR EACH ROW
DECLARE
--
BEGIN
insert into tableB values (1);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error occured but ignored.');
END;
insert into tableA values (1);
insert into tableA values (1);

之后,表A有两条记录,表B只有1条。

如果不进行异常处理,两个表将各只有一条记录,并且在第一次插入后,它将在 SQL 开发人员窗口中显示异常。

是的,它会影响基表。

如果插入触发器中出现错误,则不允许在基表中插入任何记录。这同样适用于所有类型的触发器。

此外,向表添加 DML 触发器会影响这些表上的 DML 语句的性能。

根据预言机文档:

如果引发预定义或用户定义的错误条件或异常 在执行触发器主体期间,则 触发器正文以及触发语句将回滚 (除非错误被异常处理程序捕获(。因此,一个 触发器主体可以阻止触发语句的执行 引发异常。用户定义的异常通常用于 强制实施复杂安全授权或完整性的触发器 约束。

最新更新