? ? INSTEAD_OF 用于对视图的DML触发,由于视图有可能是由多个表进行联结(join)而成,因而并非是所有的联结都是可更新的。
? ? 但可以按照所需的方式执行更新,
例如下面情况:
CREATE OR REPLACE VIEW emp_view
AS
? ? SELECT deptno, count(*) total_employeer, sum(sal) total_salary
? ? FROM emp GROUP BY deptno;
在此视图中直接删除是非法:
SQL>DELETE FROM emp_view WHERE deptno=10;
DELETE FROM emp_view WHERE deptno=10
*
ERROR 位于第1 行:
ORA-01732: 此视图的数据操纵操作非法
但是可以创建INSTEAD_OF触发器来为DELETE 操作执行所需的处理,即删除EMP表中所有基准行:
? ?
CREATE OR REPLACE TRIGGER emp_view_delete
? ? INSTEAD OF DELETE ON emp_view FOR EACH ROW
BEGIN
? ? DELETE FROM emp WHERE deptno= :old.deptno;
END emp_view_delete;
DELETE FROM emp_view WHERE deptno=10;
⑦创建系统事件触发器
ORACLE提供的系统事件触发器可以在DDL或数据库系统上被触发。DDL指的是数据定义语言,如CREATE 、ALTER及DROP 等。
而数据库系统事件包括数据库服务器的启动或关闭,用户的登录与退出、数据库服务错误等。创建系统触发器的语法如下:
1.创建触发器的一般语法是:
CREATE OR REPLACE TRIGGER [sachema.] trigger_name
? ? {BEFORE|AFTER}?
? ? {ddl_event_list | database_event_list}
? ? ON { DATABASE | [schema.] SCHEMA }
? ? [WHEN_clause]
? ? begin
? ? ? ? trigger_body;
? ? end;
其中: ddl_event_list:一个或多个DDL 事件,事件间用OR 分开;database_event_list:一个或多个数据库事件,事件间用OR 分开;
系统事件触发器既可以建立在一个模式上,又可以建立在整个数据库上。
当建立在模式(SCHEMA)之上时,只有模式所指定用户的DDL操作和它们所导致的错误才激活触发器, 默认时为当前用户模式。
当建立在数据库(DATABASE)之上时,该数据库所有用户的DDL操作和他们所导致的错误,以及数据库的启动和关闭均可激活触发器。
要在数据库之上建立触发器时,要求用户具有ADMINISTER DATABASE TRIGGER权限。
⑧删除触发器:
DROP TRIGGER trigger_name;
当删除其他用户模式中的触发器名称,需要具有DROP ANY TRIGGER系统权限,
当删除建立在数据库上的触发器时,用户需要具有ADMINISTER DATABASE TRIGGER系统权限。
此外,当删除表或视图时,建立在这些对象上的触发器也随之删除。
触发器的状态
数据库TRIGGER 的状态:
有效状态(ENABLE):当触发事件发生时,处于有效状态的数据库触发器TRIGGER 将被触发。
无效状态(DISABLE):当触发事件发生时,处于无效状态的数据库触发器TRIGGER 将不会被触发,此时就跟没有这个数据库触发器(TRIGGER) 一样。
数据库TRIGGER的这两种状态可以互相转换。格式为:
ALTER TIGGER trigger_name [DISABLE | ENABLE ];
例:ALTER TRIGGER emp_view_delete DISABLE;
ALTER TRIGGER语句一次只能改变一个触发器的状态,而ALTER TABLE语句则一次能够改变与指定表相关的所有触发器的使用状态。格式为:
ALTER TABLE [schema.]table_name {ENABLE|DISABLE} ALL TRIGGERS;
例:使表EMP 上的所有TRIGGER 失效:
ALTER TABLE emp DISABLE ALL TRIGGERS;?
--------------------------------------分割线 --------------------------------------
--------------------------------------分割线 --------------------------------------