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)列。但是如果需要的话,可以修改其他列。