oracle触发器问题

数据库触发器只能识别 insert update和delete三种么?
我如果通过imp导入的数据,触发器会被触发么
还有什么其他的方式让字段发生变化么?
目前字段变化了,触发器不启动,可确定不是通过insert update和delete进行的数据变化
最新回答
杯酒入怀

2025-02-25 05:43:16

我本地模拟了一下,  IMP 的时候,  insert 触发器是会被触发的。

下面为测试的代码

-- 测试表结构.
CREATE TABLE test_exp_imp (
  code   VARCHAR(10),
  value  INT,
  PRIMARY KEY(code)
);


INSERT INTO test_exp_imp(code) VALUES('TEST0000');
INSERT INTO test_exp_imp VALUES('TEST0001',  1);
INSERT INTO test_exp_imp VALUES('TEST0002',  2);
INSERT INTO test_exp_imp VALUES('TEST0003',  3);
INSERT INTO test_exp_imp VALUES('TEST0004',  4);
INSERT INTO test_exp_imp VALUES('TEST0005',  5);


测试计划:

原始数据中 code 有数据,  value 为 NULL 或者 小于 10 的数据
INSERT 触发器中, 自动设置 value 为 100.

也就是如果 导入数据以后, value 大于 100 了, 说明触发器执行了.
-- 创建触发器.
CREATE OR REPLACE TRIGGER tr_test_exp_imp
BEFORE INSERT ON test_exp_imp
FOR EACH ROW
BEGIN
  -- 设置流水.
  :new.value := 100;
END;
/


-- exp 导出数据.

E:\>EXP test/test file=test_exp_imp.dmp tables=(test_exp_imp)

Export: Release 9.2.0.1.0 - Production on 星期三 7月 24 11:42:04 2013

......


-- 首先删除所有的旧数据.
SQL> TRUNCATE TABLE test_exp_imp;

表已截掉。


-- imp 导入数据. (因为表已存在, 这里 IGNORE=Y 忽略创建错误)

E:\>IMP test/test  file=test_exp_imp.dmp tables=(test_exp_imp) IGNORE=Y

Import: Release 9.2.0.1.0 - Production on 星期三 7月 24 11:47:19 2013

......



导入完毕后,查询数据

-- 查询数据.
SQL> select * from test_exp_imp;

CODE                      VALUE
-------------------- ----------
TEST0000                    100
TEST0001                    100
TEST0002                    100
TEST0003                    100
TEST0004                    100
TEST0005                    100

已选择6行。


结果显示: imp 处理过程中, 触发器代码,被执行了.
轮回亦思伊人

2025-02-25 05:54:21

关于触发器的 种类 和 事件, 你看看这个:

http://wenku.baidu.com/view/e50a484f2e3f5727a5e9623a.html


imp导入数据,触发器应该 是不会被触发的。

还有比如 truncate 可以截断 表中的数据。还有 oracle load 也不会触发。

也有可能 触发器被 disable掉了。