触发器
基本语法:
create [or replace] tigger 触发器名 触发时间 触发事件
on 表名
[for each row]
begin
pl/sql语句
end
其中:
触发器名:触发器对象的名称。
触发时间:before,after
触发事件:insert,update,delete
表名:触发器所在的表
for each row:对表的每一行触发器执行一次,如果没有,则只对整表执行一次。
功能:
1.允许/限制对表的修改
2.自动生成派生列,比如自增字段
3.强制数据一致性
4.提供审计和日志记录
5.防止无效的事务处理
6.启动复杂的业务逻辑
1.每当成功插入新员工之后,自动打印“成功插入新员工”;
create or replace trigger abcd after insert on emp for each row
begin
dbms_output.put_line('成功');
end;
2.在更新表emp之前触发,目的是不允许在周四修改表;
create or replace trigger testtrigger before insert or update or delete
on emp
begin
if to_char(sysdate,'day')='星期四' then
RAISE_APPLICATION_ERROR(-20600,'不能在周四修改表emp');
end if;
end;
3.使用触发器实现序号自增
创建一个测试表
create table test_emp(
id number(10) primary key,
username varchar2(100));
创建序列
create sequence my_seq increment by 1 start with 1 nomaxvalue nocycle cache 20;
创建触发器
create or replace trigger my_tgr
before insert on test_emp
for each row
declare
next_id number;
begin
select my_seq.nextval into next_id from dual;
:new.id:=next_id; -- new表示新插入的那条记录
end;
插入数据
insert into test_emp(username) values('test');
4.用户对表进行dml操作的时候,自动记录日志
create or replace trigger testtrigger
after delete or insert or update on test_emp
for each row
declare
v_type test_log.type%type;
begin
if inserting then
v_type:='insert';
DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并已记录到日志');
elsif updating then
v_type:='update';
DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并已记录到日志');
elsif deleting then
v_type:='delete';
DBMS_OUTPUT.PUT_LINE('记录已经成功删除,并已记录到日志');
end if;
insert into test_log values(user,v_type,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
end;
5.创建触发器,用来记录表的删除数据
--创建表
CREATE TABLE employee(
id VARCHAR2(4) NOT NULL,
name VARCHAR2(15) NOT NULL,
age NUMBER(2) NOT NULL,
sex CHAR NOT NULL
);
--插入数据
INSERT INTO employee VALUES('e101','zhao',23,'M');
INSERT INTO employee VALUES('e102','jian',21,'F');
--创建记录表(包含数据记录)
CREATE TABLE old_employee AS SELECT * FROM employee;
--创建触发器
CREATE OR REPLACE TRIGGER TIG_OLD_EMP
AFTER DELETE ON EMPLOYEE
FOR EACH ROW --语句级触发,即每一行触发一次
BEGIN
INSERT INTO OLD_EMPLOYEE VALUES (:OLD.ID, :OLD.NAME, :OLD.AGE, :OLD.SEX); --:old代表旧值
END;
--下面进行测试
DELETE employee;
SELECT * FROM old_employee;
6.创建触发器,利用视图插入数据
--创建表
CREATE TABLE tab1 (tid NUMBER(4) PRIMARY KEY,tname VARCHAR2(20),tage NUMBER(2));
CREATE TABLE tab2 (tid NUMBER(4),ttel VARCHAR2(15),tadr VARCHAR2(30));
--插入数据
INSERT INTO tab1 VALUES(101,'zhao',22);
INSERT INTO tab1 VALUES(102,'yang',20);
INSERT INTO tab2 VALUES(101,'13761512841','AnHuiSuZhou');
INSERT INTO tab2 VALUES(102,'13563258514','AnHuiSuZhou');
--创建视图连接两张表
CREATE OR REPLACE VIEW tab_view AS SELECT tab1.tid,tname,ttel,tadr FROM tab1,tab2 WHERE tab1.tid = tab2.tid;
--创建触发器
CREATE OR REPLACE TRIGGER TAB_TRIGGER
INSTEAD OF INSERT ON TAB_VIEW
BEGIN
INSERT INTO TAB1 (TID, TNAME) VALUES (:NEW.TID, :NEW.TNAME);
INSERT INTO TAB2 (TTEL, TADR) VALUES (:NEW.TTEL, :NEW.TADR);
END;
/
--现在就可以利用视图插入数据
INSERT INTO tab_view VALUES(106,'ljq','13886681288','beijing');
--查询
SELECT * FROM tab_view;
SELECT * FROM tab1;
SELECT * FROM tab2;
7.创建触发器,比较emp表中更新的工资
create or replace trigger testtrigger
before update on emp
for each row
declare
begin
if:old.sal>:new.sal then
dbms_output.put_line('工资减少');
elsif :old.sal<:new.sal then
dbms_output.put_line('工资增加');
else
dbms_output.put_line('工资未作任何变动');
end if;
DBMS_OUTPUT.PUT_LINE('更新前工资 :' || :OLD.SAL);
DBMS_OUTPUT.PUT_LINE('更新后工资 :' || :NEW.SAL);
end;
8.创建触发器,将操作create、drop存储再log_info表中
--创建表
CREATE TABLE log_info(
manager_user VARCHAR2(15),
manager_date VARCHAR2(15),
manager_type VARCHAR2(15),
obj_name VARCHAR2(15),
obj_type VARCHAR2(15)
);
--创建触发器
set serveroutput on;
CREATE OR REPLACE TRIGGER TRIG_LOG_INFO
AFTER CREATE OR DROP ON SCHEMA
BEGIN
INSERT INTO LOG_INFO
VALUES
(USER,
SYSDATE,
SYS.DICTIONARY_OBJ_NAME,
SYS.DICTIONARY_OBJ_OWNER,
SYS.DICTIONARY_OBJ_TYPE);
END;
--测试语句
CREATE TABLE a(id NUMBER);
CREATE TYPE aa AS OBJECT(id NUMBER);
DROP TABLE a;
DROP TYPE aa;
--查看效果
SELECT * FROM log_info;
--相关数据字典-----------------------------------------------------
SELECT * FROM USER_TRIGGERS;
--必须以DBA身份登陆才能使用此数据字典
SELECT * FROM ALL_TRIGGERS;SELECT * FROM DBA_TRIGGERS;
--启用和禁用
ALTER TRIGGER trigger_name DISABLE;
ALTER TRIGGER trigger_name ENABLE;
oracle的触发器
最新推荐文章于 2021-11-26 11:51:00 发布