首页 > 解决方案 > 有谁知道为什么这个触发器不起作用?

问题描述

create or replace NONEDITIONABLE TRIGGER SetNapomena
BEFORE INSERT
ON stavkafakture
FOR EACH ROW
    DECLARE
        V_napomena VARCHAR2(20);
BEGIN
    EXECUTE IMMEDIATE 'ALTER TRIGGER zabranjeno DISABLE';

    SELECT napomena INTO V_napomena
    FROM faktura
    WHERE brojfakture =:NEW.brojfakture;

    :NEW.napomena := V_napomena;

    EXECUTE IMMEDIATE 'ALTER TRIGGER zabranjeno ENABLE';
END;

当我插入表(在本例中为 stavkafakture)时,我收到此错误:

无法在触发器中提交

我做了一些研究并添加了 Pragma Autonomous Transaction 和 commit,但是在添加它们之后,我尝试在表中插入一行,它永远加载并且永远不会工作。它永远处于负载状态。

有谁知道为什么?

标签: sqloracletriggers

解决方案


在 CREATE、ALTER、DROP 等 Oracle DDL 语句中生成显式提交。

IE 如果您发出这种语句,则不需要 COMMIT 或 ROLLBACK :

CREATE TABLE MyTable(MyField NUMBER);

这将创建MyTable表并且不能回滚。这是 Oracle 的一个限制,而 PostreSQL 等其他 RDBMS 则没有。


推荐阅读