触发器是被隐含执行的存储过程
在为某对象创建触发器时,首先要保证对象不属于SYS用户
因为不可对SYS拥有的对象创建触发器
1) 创建BEFORE触发器
CREATE OR REPLACE TRIGGER tr_fmodify_student
BEFORE UPDATE ON student
BEGIN
IF TO_CHAR(SYSDATE,’DY’,'NLS_DATE_LANGUAGE = AMERICAN’) IN (‘FRI’) THEN
RAISE_APPLICATION_ERROR(-20001,’不能在周五更新表’);
END IF;
END;
其中DY表星期的简写
NLS_DATE_LANGUAGE是不同系统之间时间转换
例子中是英文显示,在网上搜了一下还有例如中文和日文的显示,贴一下~
'NLS_DATE_LANGUAGE = Japanese'
'NLS_DATE_LANGUAGE = ''SIMPLIFIED CHINESE'''——这里有多个单引号 需要注意下~
平时用来测试的异常处理我们都是通过dbms_output.put_line来输出异常信息,但是在实际的应用中,需要把异常信息返回给调用的客户端。
RAISE_APPLICATION_ERROR 是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台开发语言)
RAISE_APPLICATION_ERROR 的声明:
PROCEDURE RAISE_APPLICATION_ERROR( error_number_in IN NUMBER, error_msg_in IN VARCHAR2);
里面的错误代码和内容,都是自定义的。说明是自定义,当然就不是系统中已经命名存在的错误类别,是属于一种自定义事务错误类型,才调用此函数。
error_number_in 只容许从 -20000 到 -20999 之间,这样就不会与 ORACLE 的任何错误代码发生冲突。
error_msg_in 的长度不能超过 2k,否则截取 2k。
2) 创建AFTER触发器——在执行了DML语句后被触发的触发器
CREATE OR REPLACE TRIGGER tr_insert
AFTER INSERT ON student
BEGIN
DBMS_OUTPUT.PUT_LINE(‘数据已插入’);
END;
3) 创建行触发器——在执行DML语句时,每作用一行被触发一次的触发器
CREATE OR REPLACE TRIGGER tr_id
AFTER INSERT ON student
BEGIN
IF :NEW.id<= 3 THEN
DBMS_OUTPUT.PUT_LINE(‘ID < 3’);
END IF;
END;
4) 删除触发器
DROP TRIGGER tr_fmodify_student;