数据库之 触发器 基础

触发器概述:
特殊程序
与函数和存储过程类似,都属于PL/SQL块
不可以直接调用,只能是某种事件触发 

分类:DDL触发器、DML触发器、instead-of触发器(替代某个动作的触发器)、系统触发器(对系统访问进行控制)

触发器body部分不可以超过32760字节
一般情况下,非系统触发器是不能直接调用DDL、DCL、TCL
尽量避免使用long 和long raw 格式(用clob blob)

例子:
create trigger trig1
before delete on emp
declare 
     x number :=10;
begin 
    dbms_output.put_line('delete on emp');
end trig1;

DDL触发器 
创建、修改和删除数据库对象时被触发
主要用来控制、监控DDL语句
常见的DDL事件:ALTER CREATE DROP GRANT REVOKE TRUNC

创建格式:
CREATE[OR REPLACE] TRIGGER trigger_name
{BEFORE|AFTER|INSTEAD OF}ddl_event ON {DATABASE|SCHEMA}
[WHEN(condition)]
[DECLARE 
    declaration]
BEGIN 
    statement
END;
数据库之 触发器 基础_第1张图片

删除触发器:drop trigger 触发器名

例子:
create or replace trigger ddltrigger
before create on schema
begin 
    dbms_output.put_line('create some object on current schema');
end;

DML触发器

在执行INSERT DELETE UPDATE时被触发
主要用来检测和保存替换值得操作

行级触发器与语句级触发器

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE|AFTER}
{INSERT|UPDATE|UPDATE OF COL1[,COL2......]|DELETE} ON table_name
[FOR EACH ROW] --加就是行级触发器
[WHEN(condition)]
[DECLARE
   declaration]
BEGIN
   statement
END;

例子:
create or replace trigger dmltrig1
before delete on emp
for each row
begin
    dbms_output.put_line('1');
end;

instead-of触发器

替代触发器(一般处理视图操作)
拦截INSERT UPDATE DELETE 操作并使用代替之
通常用来管理对不可更新视图的操作

CREATE [OR REPLACE] TRIGGER trigger_name
INSREAD OF dml_event ON {object_name|database|schema}
[WHEN(condition)]
[DECLARE
   declaration]
BEGIN
   statement
END;

数据库之 触发器 基础_第2张图片

例子:
create or replace trigger insteadtring
instead of delete on empview
begin
   dbms_output.put_line('delete on enpview')
end;

系统触发器

系统活动发生时会触发
通常用来跟踪系统事件,审计系统访问 

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE|AFTER} db_event ON {database|schema}
[WHEN(condition)]
[DECLARE
   declaration]
BEGIN
   statement
END;

例子:
CREATE OR REPLACE TRIGGER systemtrig
after logon on database
begin
   insert into logs values ('user logged in');
end;






你可能感兴趣的:(数据库-oracle)