oracle中是否有数据字典对象来记录触发器的事务详细信息?
我创建了触发器测试触发器,如下所示:oracle中是否有数据字典对象来记录触发器的事务详细信息?,oracle,triggers,Oracle,Triggers,我创建了触发器测试触发器,如下所示: CREATE TRIGGER TEST_TRIG AFTER INSERT ON TEST_TABLE FOR EACH ROW DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN TEST_PROC(); END; 程序测试程序代码: create or replace PROCEDURE TEST_PROC AS BEGIN EXECUTE IMMEDIATE 'truncate t
CREATE TRIGGER TEST_TRIG
AFTER INSERT ON TEST_TABLE
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
TEST_PROC();
END;
程序测试程序代码:
create or replace
PROCEDURE TEST_PROC
AS
BEGIN
EXECUTE IMMEDIATE 'truncate table TEST_FINAL';
INSERT INTO TEST_FINAL select * from TEST_TABLE;
commit;
END;
最初,我禁用了TRIGGER TEST_TRIG,并将一条记录插入到TEST_表中,然后手动执行过程TEST_PROC 输出:我能够从TEST_FINAL中获取插入到TEST_表中的相同记录
我从两个表中刷新了这些记录,并启用了触发器测试触发器 现在,当我在TEST_表中插入并提交记录时,我在TEST_FINAL表中没有找到该记录。。。我还没有收到任何错误消息
所以我想知道触发器是否被触发了?我认为您还没有完全理解自治事务的含义。实际上,这意味着受pragma约束的代码在单独的会话中运行。因此,由于Oracle的读取一致性隔离级别,自治事务无法看到主事务生成的任何数据更改 因此,如果启动时TEST_表为空,则触发器将不会在TEST_FINAL中插入任何行,而不管您现在插入了多少行 所以:不要把两张桌子都冲水。在TEST_表中插入一些行并提交。最终测试将仍然为空。在TEST_表中插入更多行,然后,lo!第一组行将出现在TEST_FINAL中 显然这不是你想要的结果。所以你需要重新审视你的逻辑。每次截断TEST_FINAL都是没有意义的,当然不是每一行。那太糟糕了!就性能而言。同样,出于同样的原因,用INSERT填充目标表也没有意义。。。选择 放弃截断意味着不需要pragma,一切都变得简单 如果要保留受影响行的历史记录,请改为使用以下内容:
CREATE TRIGGER TEST_TRIG
AFTER INSERT ON TEST_TABLE
FOR EACH ROW
BEGIN
insert into test_final (col1, col2)
values (:new.col1, :new.col2);
END;
您需要更改确切的代码以满足您的确切要求 既然这只是一个测试,为什么不在测试过程中添加一个dbms_输出。put_line(“fired!”)呢?@tbone:我做了一些更改并测试了。。。。我被解雇了。。。但我仍然感到困惑的是,y数据并没有插入到TEST_FINAL表中!!???您是否打开了服务器输出?你在哪里运行这些测试?(什么ide?toad,sql开发者,sqlplus?)在sqldeveloper中。。。在我没有设置服务器输出之前。。。现在我成功了&获得了启动时的输出!但我仍然无法在测试结果表中看到任何数据。。。Y为什么每次在
TEST\u表中插入一行时都要截断TEST\u FINAL
?那没有道理。