解决实际问题:
在应用开发中,有时候数据的操作保存是在用户登录系统之后进行操作,有时候数据可能由系统管理员直接操作,这种情况下会导致前后数据不一致(假如在系统中,删除一条数据,是从两个表中进行删除。如果系统管理员在数据库中进行删除可能只删除一条,在这种情况下会造成前后端数据的不一致)。这时候,可以在表中增加触发器。
在Oracle中提供5种类型的触发器:语句触发器、行触发器、instead of 触发器、系统条件触发器和用户触发器
1.创建语句级触发器(只执行一次)
create or replace trigger tri_yj
before update on stu //只在修改的条件下触发
begin
if updating then
dbms_output.put_line('触发语句触发器');
end if;
end;
create or replace trigger tri_yj
before insert or update or delete on stu //在插入、修改、和删除的情况下执行
begin
if updating or inserting or deleting then
dbms_output.put_line('触发语句触发器');
end if;
end;
2. 创建行级触发器(执行多次)
CREATE OR REPLACE TRIGGER TRI_HJ
AFTER UPDATE OR DELETE OR INSERT ON STU //在修改、删除、添加的时候触发
FOR EACH ROW
BEGIN
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('该行记录更新');
END IF;
END;
3 instead of 触发器 (针对的对象是视图)
在视图中,在对视图进行insert、update、delete操作时一定要非常谨慎,因为在视图中可能是多个表进行关联的,在进行DML操作时,容易出现错误。例如:
CREATE OR REPLACE FORCE VIEW SPRING.V_GRADE
(
"学号",
"姓名",
"年龄",
"课程名",
"分数"
)
AS
SELECT stu.sno 学号,
stu.sname 姓名,
stu.sage 年龄,
grade.cname 课程名,
grade.score 分数
FROM stu INNER JOIN grade ON stu.sno = grade.sno;
在这个视图中,字段是由stu表和grade表组合而成。在对视图进行增删改操作时,也会对原有表(stu、grade)进行改变,加入在向视图插入数据时,由于视图中只有grade表中的两个字段,所以在grade表中也只会插入两个字段,其他字段为空。如果在表的建立时,其他字段不为空,这个时候就出现错误。为了解决这些错误,使用instead of 触发器。
CREATE OR REPLACE TRIGGER TRI_INOF
INSTEAD OF INSERT ON V_GRADE
FOR EACH ROW
BEGIN
INSERT INTO STU(SNO,SNAME,SAGE,SDEPT) VALUES(:NEW.学号,:NEW.姓名,:NEW.年龄,'12计算机');
INSERT INTO GRADE(SNO,CNAME,SCORE) VALUES(:NEW.学号,:NEW.课程名,:NEW.分数);
END;
4.用户触发器
CREATE OR REPLACE TRIGGER TRI_YH
AFTER DDL ON SCHEMA //在用户执行DDL语句的时候触发,但是我使用的时候不好使,暂时未解决
BEGIN
DBMS_OUTPUT.PUT_LINE('执行了DDL语句');
END;
5. 创建系统事件触发器(系统事件包括:数据库启动、关闭、用户的登录与退出,服务器错误事件)
CREATE OR REPLACE TRIGGER TRI_XT
AFTER LOGON ON DATABASE
BEGIN //向表中插入用户登录ip,时间,用户
INSERT INTO LOGON_EVENT(USER_NAME,ADDRESS,LOGON_DATE) VALUES(ORA_LOGIN_USER,ORA_CLIENT_IP_ADDRESS,SYSTIMESTAMP);
END;
6.禁用和启用触发器
--禁用触发器
alter trigger tri_yj disable;
--启用触发器
alter trigger tri_yj enable;
7 针对表禁用和启用触发器
--禁用触发器
alter table stu disable all triggers;
--启用触发器
alter table stu enable all triggers;
来源:https://blog.csdn.net/Altitude_/article/details/98959485