CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name [REFERENCING OLD AS old | NEW AS new] FOR EACH ROW [WHEN condition] PL/SQL block;1、建立BEFORE行触发器
CREATE OR REPLACE TRIGGER tr_emp_sal
BEFORE UPDATE OF sal
ON emp
FOR EACH ROW
BEGIN
IF :NEW.sal < :OLD.sal THEN
RAISE_APPLICATION_ERROR(-20000,‘工资只涨不降‘);
END IF;
END;测试:UPDATE emp SET sal = 800 WHERE empno = 7788;2、建立AFTER行触发器
CREATE TABLE audit_emp_change( NAME VARCHAR2(10), oldsal NUMBER(6,2), newsal NUMBER(6,2), etime DATE );AFTER行触发器示例
CREATE OR REPLACE TRIGGER tr_sal_change
AFTER UPDATE OF sal
ON emp
FOR EACH ROW
DECLARE
v_temp INTEGER;
BEGIN
SELECT COUNT(*) INTO v_temp FROM audit_emp_change
WHERE NAME = :OLD.ename;
IF v_temp = 0 THEN
INSERT INTO audit_emp_change(NAME,oldsal,newsal,etime)
VALUES (:OLD.ename,:OLD.sal,:NEW.sal,SYSDATE);
ELSE
UPDATE audit_emp_change
SET
oldsal = :OLD.sal,
newsal = :NEW.sal,
etime = SYSDATE
WHERE NAME = :OLD.ename;
END IF;
END;测试:UPDATE emp SET sal = sal * 1.1 WHERE deptno = 20; SELECT * FROM audit_emp_change;3、限制行触发器
CREATE OR REPLACE TRIGGER tr_sal_change
AFTER UPDATE OF sal
ON emp
FOR EACH ROW
WHEN (OLD.job=‘CLERK‘)
DECLARE
v_temp INTEGER;
BEGIN
SELECT COUNT(*) INTO v_temp FROM audit_emp_change
WHERE NAME = :OLD.ename;
IF v_temp = 0 THEN
INSERT INTO audit_emp_change(NAME,oldsal,newsal,etime)
VALUES (:OLD.ename,:OLD.sal,:NEW.sal,SYSDATE);
ELSE
UPDATE audit_emp_change
SET
oldsal = :OLD.sal,
newsal = :NEW.sal,
etime = SYSDATE
WHERE NAME = :OLD.ename;
END IF;
END;4、DML触发器使用注意事项CREATE OR REPLACE TRIGGER tr_emp_sal
BEFORE UPDATE OF sal
ON emp
FOR EACH ROW
DECLARE
maxsal NUMBER(6,2);
BEGIN
SELECT MAX(sal) INTO maxsal FROM emp;
IF :NEW.sal > maxsal THEN
RAISE_APPLICATION_ERROR(-20000,‘超出工资上限‘);
END IF;
END;正确示例:CREATE OR REPLACE PACKAGE pkg_emp
IS
g_maxsal INTEGER;
END pkg_emp;
/
CREATE OR REPLACE TRIGGER tr_emp_sal_row
BEFORE UPDATE OF sal
ON emp
BEGIN
SELECT MAX(sal) INTO pkg_emp.g_maxsal FROM emp;
END;
/
--DML触发器使用注意事项
CREATE OR REPLACE TRIGGER tr_emp_sal
BEFORE UPDATE OF sal
ON emp
FOR EACH ROW
BEGIN
IF :NEW.sal > pkg_emp.g_maxsal THEN
RAISE_APPLICATION_ERROR(-20000,‘超出工资上限‘);
END IF;
END;测试:UPDATE emp SET sal = 3700 WHERE empno = 1111;
PL/SQL_触发器2(行触发器),布布扣,bubuko.com
原文:http://blog.csdn.net/com185272358/article/details/22097737