Oracle PL/SQL 触发器(trigger)学习笔记(三)

2014-11-24 17:42:59 · 作者: · 浏览: 1
级触发器就会激活。而只有激活事件发生在某个具体模式中,相应的模式级触发器才会激活。如果使用SCHEMA关键字的时候没有定义某个具体模式的名称,那么默认设置为拥有这个触发器的模式。


9、修改触发器状态和删除触发器


启动或禁用触发器


ALTER TRIGGER trigger_name {DISABLE | ENABLE};


删除触发器


DROP TRIGGER trigger_name;


还可以使用ALTER TABLE命令,并附加使用ENABLE ALL TRIGGERS或DISABLE ALL TRIGGERS子句,同时将某一个表上的所有触发器开启或关闭。


ALTER TABLE table_name {ENABLE | DISABLE} ALL TRIGGERS;


可以通过user_triggers来查看相应触发器信息。


10、变化表和限制表


触发器主体(trigger body)可以访问的表和列上有一些限制。在定义这些限制以前,我们先看两个概念—变化表和限制表。


“变化表”(mutating table)是被DML语句正在修改的表。对于触发器而言,它就是定义触发器的表。需要作为DELETE CASCADE参考完整性限制(referential integrity constraints)的结果进行更新的表也是变化的(mutating)。


“限制表”(constraining table)是可能需要对参考完整性限制执行读操作的表。


为了更好的理解定义,我们看下面这个例子


view plaincopy to clipboardprint


CREATE TABLE registered_students (


student_id NUMBER(5) NOT NULL,


department CHAR(3) NOT NULL,


course NUMBER(3) NOT NULL,


grade CHAR(1),


CONSTRAINT rs_grade


CHECK (grade IN ('A', 'B', 'C', 'D', 'E')),


CONSTRAINT rs_student_id


FOREIGN KEY (student_id) REFERENCES students (id),


CONSTRAINT rs_department_course


FOREIGN KEY (department, course)


REFERENCES classes (department, course)


);


--...


CREATE TABLE registered_students (


student_id NUMBER(5) NOT NULL,


department CHAR(3) NOT NULL,


course NUMBER(3) NOT NULL,


grade CHAR(1),


CONSTRAINT rs_grade


CHECK (grade IN ('A', 'B', 'C', 'D', 'E')),


CONSTRAINT rs_student_id


FOREIGN KEY (student_id) REFERENCES students (id),


CONSTRAINT rs_department_course


FOREIGN KEY (department, course)


REFERENCES classes (department, course)


);


--...


registered_students有两个声明的参考完整性限制。


Students和classes都是registered_students的限制表。


触发器主体中的SQL不允许进行:


读取或修改触发语句(triggering statement)的任何变化表。这些表包括触发表(triggering table )自己。


读取或修改触发表(triggering table)的限制表中的主键(primary)、唯一列值(unique)或外键(foreign key)列。但是如果需要的话,可以修改其他列。