总结的 好详细啊我能不能让它自己的更新数据失效,而只使用触发器 更新数据呢? 我的触发器如下:Create Or Replace Trigger “T_CHG_EMP_DEPART_VIEW" Instead Of Insert or update or delete on ”EMP_DEPART_VIEW" referencing OLD as OLD NEW as NEW FOR EACH ROW Declare begin If Inserting Then INSERT INTO EMP VALUES ( :NEW.ID, :NEW.YGBH, :NEW.YGNAME, :NEW.YGBRITHDAY, :NEW.DEPARTID ); elsif Updating Then UPDATE EMP SET YGBH = :NEW.YGBH, YGNAME = :NEW.YGNAME, YGBRITHDAY = :NEW.YGBRITHDAY, DEPARTID = :NEW.DEPARTID, YGEDUCATION = :NEW.YGEDUCATION, YGSPCIALTY = :NEW.YGSPCIALTY, YGTITLE = :NEW.YGTITLE, QUANXIAN = :NEW.QUANXIAN, MIMA = :NEW.MIMA WHERE (ID = :OLD.ID); elsif Deleting then DELETE FROM EMP WHERE (ID = :OLD.ID); End if; end;
很急啊而且这个问题,我感觉是我把触发器写成这个形式 以后才有的问题,以前我写create trigger aa instead of insert on bb begin insert into ...... end好像没有问题的郁闷啊,请高手指教
--测试了一下没有出现你说的问题,你仔细研究一下你自己的情况吧,应该是哪里没有注意到 [TEST@myorcl] SQL>desc t1; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NUMBER COL2 NUMBER[TEST@myorcl] SQL>desc t3; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NUMBER COL2 NUMBER[TEST@myorcl] SQL>create or replace view my_view as 2 select t1.id,t1.col2 from t1,t3 where t1.id=t3.id;视图已创建。[TEST@myorcl] SQL>create or replace trigger my_trigger 2 instead of insert or update or delete on my_view 3 begin 4 if inserting then 5 insert into t1 values(:new.id,:new.col2); 6 end if; 7 end; 8 / 触发器已创建[TEST@myorcl] SQL>select * from t1; ID COL2 ---------- ---------- 1 2 2 2[TEST@myorcl] SQL>insert into my_view values(3,4);已创建 1 行。[TEST@myorcl] SQL>commit;提交完成。[TEST@myorcl] SQL>select * from t1; ID COL2 ---------- ---------- 1 2 2 2 3 4
(2) 若视图导出时包含有分组和聚合操作,则不允许对这个视图执行更新操作。
(3) 若视图是从一个表经选择、投影而导出的,并在视图中包含了表的主键字或某个候选键,这类视图称为‘行列子集视图’。对这类视图可执行更新操作。另外,关于可更新视图的一些更具体的描述如下:如果视图没有INSTEAD OF触发器,或者视图不是分区视图,则视图只有满足下列条件才可更新:select语句在选择列表中没有聚合函数,也不包含TOP,GROUP BY,UNION(除非视图是分区视图)或DISTINCT子句。聚合函数可以用在FROM子句的子查询中,只要不修改函数返回的值。select语句的选择列表中没有派生列。派生列是由任何非简单列表达式(使用函数、加法或减法运算符等)所构成的结果集列。select语句中的FROM子句至少引用一个表。select语句不能只包含非表格格式的表达式(即不是从表派生出的表达式)。INSERT, UPDATE和DELETE语句在引用可更新视图之前,也必须如上述条件指定的那样满足某些限制条件。只有当视图可更新,并且所编写的UPDATE或 INSERT语句只修改视图的FROM子句引用的一个基表中的数据时,UPDATE和INSERT语句才能引用视图。只有当视图在其FROM子句中只引用一个表时,DELETE语句才能引用可更新的视图。
我的触发器如下:Create Or Replace Trigger “T_CHG_EMP_DEPART_VIEW"
Instead Of Insert or update or delete on
”EMP_DEPART_VIEW"
referencing OLD as OLD NEW as NEW FOR EACH ROW
Declare
begin
If Inserting Then
INSERT INTO EMP
VALUES
( :NEW.ID, :NEW.YGBH, :NEW.YGNAME, :NEW.YGBRITHDAY, :NEW.DEPARTID ); elsif Updating Then
UPDATE EMP
SET
YGBH = :NEW.YGBH,
YGNAME = :NEW.YGNAME,
YGBRITHDAY = :NEW.YGBRITHDAY,
DEPARTID = :NEW.DEPARTID,
YGEDUCATION = :NEW.YGEDUCATION,
YGSPCIALTY = :NEW.YGSPCIALTY,
YGTITLE = :NEW.YGTITLE,
QUANXIAN = :NEW.QUANXIAN,
MIMA = :NEW.MIMA
WHERE
(ID = :OLD.ID); elsif Deleting then
DELETE FROM EMP
WHERE
(ID = :OLD.ID);
End if;
end;
insert into ......
end好像没有问题的郁闷啊,请高手指教
--测试了一下没有出现你说的问题,你仔细研究一下你自己的情况吧,应该是哪里没有注意到
[TEST@myorcl] SQL>desc t1;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER
COL2 NUMBER[TEST@myorcl] SQL>desc t3;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER
COL2 NUMBER[TEST@myorcl] SQL>create or replace view my_view as
2 select t1.id,t1.col2 from t1,t3 where t1.id=t3.id;视图已创建。[TEST@myorcl] SQL>create or replace trigger my_trigger
2 instead of insert or update or delete on my_view
3 begin
4 if inserting then
5 insert into t1 values(:new.id,:new.col2);
6 end if;
7 end;
8 /
触发器已创建[TEST@myorcl] SQL>select * from t1; ID COL2
---------- ----------
1 2
2 2[TEST@myorcl] SQL>insert into my_view values(3,4);已创建 1 行。[TEST@myorcl] SQL>commit;提交完成。[TEST@myorcl] SQL>select * from t1; ID COL2
---------- ----------
1 2
2 2
3 4
insert视图的命令,结果 触发器 只触发了一下然而等我提交数据库后,在表里面还是有2个一样的记录
为什么?