这可能是一个愚蠢的问题,但我没有找到明确的答案......
我想在我的 oracle 数据库上捕获任何更新,所以我想使用触发器,但是在使用SELECT FOR UPDATE
、 thenlob.write(...)
和时触发器没有被激活COMMIT
。(我已经使用 occi 使用 c++ 对其进行了测试)
有没有办法在更新(或任何其他)触发器中捕获它?
我发现很难相信有任何触发器都无法监控的命令......
如果这很重要,我使用的是 11g 版。
谢谢!
编辑
触发器例如:
CREATE OR REPLACE TRIGGER TR1
BEFORE DELETE OR INSERT OR UPDATE ON TEST_CLOB
FOR EACH ROW
BEGIN
IF DELETING THEN
WRITE_LOG('LOG_DIR','deleting:'||:old.filename);
goto endproc;
END IF;
IF INSERTING THEN
WRITE_LOG('LOG_DIR','inserting:'||:new.filename);
goto endproc;
END IF;
IF UPDATING THEN
WRITE_LOG('LOG_DIR','updating:'||:old.filename||'-'||:new.filename);
goto endproc;
END IF;
WRITE_LOG('LOG_DIR','other:'||:old.filename||'-'||:new.filename);
<<endproc>>
NULL;
END;
现在在我的日志中我看到了插入和删除,但我从未看到任何更新。
复制评论:
你不能那样做,至少在 12c 之前:“使用 OCI 函数或 DBMS_LOB 包来更新对象列的 LOB 值或 LOB 属性不会触发在包含列或属性的表上定义的触发器。” (docs.oracle.com/database/121/ADDCI/lobs.htm#ADDCI4383)
选择更新不是更新。它是一个也放置了锁的 SELECT,因此它会影响其他会话的读取一致性。