为啥这个触发器不起作用?

Posted

技术标签:

【中文标题】为啥这个触发器不起作用?【英文标题】:Does anyone know why this trigger is not working?有谁知道为什么这个触发器不起作用? 【发布时间】:2021-01-07 02:35:26 【问题描述】:
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,但是在添加它们之后,我尝试在表中插入一行,它永远加载并且永远不会工作。 它永远处于负载状态。

有人知道为什么吗?

【问题讨论】:

我认为 oracle 不允许在触发器中使用 DDL,但您应该在适当的 pl/sql 过程中执行此操作。 无论是直接在触发器中还是在存储过程中,都不能将 DDL 命令作为 DML 事务的一部分发出,因为它会强制执行隐式提交。也就是说,在 select 语句之前禁用触发器然后立即重新启用它的目的是什么?我不认为 select 语句不会导致触发器触发。 在oracle中,你可以在pl/sql存储过程中发出DDL,但我认为有一些限制...... 您要解决什么问题?看起来您希望解决方法一些可能 - 可以以不同方式以受支持和允许的方式完成的事情。 @Littlefoot 也许是的,我有 2 个表“ta”和“tb”以及两个触发器,第一个触发器阻止更新并插入“tb”列。第二个触发器更新您无法插入或更新的列。这就是为什么我试图在插入后禁用然后启用触发器。我不想授予用户更改列 bcz 值的权限,该值与名为“napomena”的同一列中的“ta”相同。 【参考方案1】:

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

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

CREATE TABLE MyTable(MyField NUMBER);

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

【讨论】:

以上是关于为啥这个触发器不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥事件触发器在统一 2d 中不起作用?

SwiftUI 为啥 Picker 上的输入不起作用?

为啥 HTML5 拖放功能在 Firefox 中不起作用?

socket.io 连接事件不起作用,为啥?

为啥这个 CATransition 不起作用?

为啥这个重定向不起作用?