优秀的编程知识分享平台

网站首页 > 技术文章 正文

Oracle 触发器(Oracle 触发器复制数据)

nanyue 2024-09-23 10:43:03 技术文章 4 ℃

1 触发器

触发器是当特定事件出现时自动执行的存储过程

特定事件可以是执行更新的DML语句和DDL语句

触发器不能被显式调用

触发器的功能:

自动生成数据
自定义复杂的安全权限
提供审计和日志记录
启用复杂的业务逻辑

2 创建触发器的语法

CREATE [OR REPLACE] TRIGGER trigger_name
AFTER | BEFORE | INSTEAD OF
[INSERT] [[OR] UPDATE [OF column_list]] 
[[OR] DELETE]
ON table_or_view_name
[REFERENCING {OLD [AS] old / NEW [AS] new}]
[FOR EACH ROW]
[WHEN (condition)]
pl/sql_block;

3 触发器的组成部分

触发器由三部分组成:

触发器语句(事件) 定义激活触发器的 DML 事件和 DDL 事件

 --在更新 emp_sal 列之后激活触发器
 CREATE OR REPLACE TRIGGER trig_sal
 AFTER UPDATE OF empsal ON salary_records

触发器限制 执行触发器的条件,该条件必须为真才能激活触发器

--如果WHEN子句中的条件得到满足,将执行BEGIN 块中的代码
BEGIN
 sal_diff:=:NEW.empsal-:OLD.empsal;
 DBMS_OUTPUT.PUT_LINE(‘工资差额:’sal_diff);
 END;

触发器操作(主体) 包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行

--只有在WHEN子句中的条件得到满足时,才激活trig_sal 触发器
FOR EACH ROW
 WHEN (NEW.empsal>OLD.empsal)
 DECLARE
 Sal_diff NUMBER;

BRFORE触发器的工作原理

AFTER触发器的工作原理

CREATE OR REPLACE TRIGGER aiu_itemfile
AFTER INSERT
ON itemfile
FOR EACH ROW
BEGIN
 IF (:NEW.qty_hand = 0) THEN
 DBMS_OUTPUT.PUT_LINE('警告:已插入记录,但数量为零');
 ELSE
 DBMS_OUTPUT.PUT_LINE(‘已插入记录');
 END IF;
END;
--AFTER
create or replace trigger book_update_trigger1
AFTER update on book 
begin 
 DBMS_output.put_line(' AFTER修改数据成功!2');
end;
---BRFORE
create or replace trigger book_update_trigger2
before update on book 
begin 
 DBMS_output.put_line(' before修改数据成功!1');
end;

4 触发器类型

4.1 行级触发器

---创建表
CREATE TABLE TEST_TRG
 (ID NUMBER, NAME VARCHAR2(20));
---创建序列
CREATE SEQUENCE SEQ_TEST;
----创建触发器(ID自动增长触发器)
CREATE OR REPLACE TRIGGER BI_TEST_TRG
BEFORE INSERT OR UPDATE OF ID
ON TEST_TRG
FOR EACH ROW
BEGIN
 IF INSERTING THEN
 SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;
 ELSE
 RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!');
 END IF;
END;

4.2 语句级触发器

CREATE OR REPLACE TRIGGER trgdemo
 AFTER INSERT OR UPDATE OR DELETE
 ON order_master
BEGIN
 IF UPDATING THEN
 DBMS_OUTPUT.PUT_LINE(‘已更新 ORDER_MASTER 中的数据');
 ELSIF DELETING THEN
 DBMS_OUTPUT.PUT_LINE(‘已删除 ORDER_MASTER 中的数据');
 ELSIF INSERTING THEN
 DBMS_OUTPUT.PUT_LINE(‘已在 ORDER_MASTER 中插入数据');
 END IF;
END;

4.3 INSTEAD OF 触发器

--创建视图
CREATE OR REPLACE view book_view as 
select * from book;
--创建触发器
CREATE OR REPLACE TRIGGER upd_ord_view
 INSTEAD OF UPDATE ON book_view
 FOR EACH ROW
BEGIN
 update book set book_name=:new.book_name where book_id=:old.book_id;
 DBMS_OUTPUT.PUT_LINE('已激活触发器');
END;
update book_view set book_name='java上班' where book_id='445501'

4.4 模式触发器

 CREATE TABLE dropped_obj (
 obj_name VARCHAR2(30),
 obj_type VARCHAR2(20),
 drop_date DATE);
SQL> CREATE OR REPLACE TRIGGER log_drop_obj
AFTER DROP ON SCHEMA
BEGIN
 INSERT INTO dropped_obj
 VALUES( ORA_DICT_OBJ_NAME, 
 ORA_DICT_OBJ_TYPE, 
 SYSDATE);
END;

ORA_DICT_OBJ_NAME 触发DDL的数据库对象名称

ORA_DICT_OBJ_TYPE 触发DDL的数据库对象类型

 drop table employee2;

5 启用、禁用和删除触发器

启用和禁用触发器

SQL> ALTER TRIGGER aiu_itemfile DISABLE;
SQL> ALTER TRIGGER aiu_itemfile ENABLE;

删除触发器

SQL> DROP TRIGGER aiu_itemfile;

6 查看有关触发器的信息

USER_TRIGGERS 数据字典视图包含有关触发器的信息

SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS
WHERE TABLE_NAME='EMP';
SQL> SELECT TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE
FROM USER_TRIGGERS
WHERE TRIGGER_NAME = 'BIU_EMP_DEPTNO';
最近发表
标签列表