数据库之 触发器 基础
2015-11-18 21:43
375 查看
触发器概述:
特殊程序
与函数和存储过程类似,都属于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;
删除触发器: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;
例子:
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;
特殊程序
与函数和存储过程类似,都属于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;
删除触发器: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;
例子:
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;
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- 数据库链接字符串查询网站
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- DB2实例管理
- DB2实例管理
- OS block size和Oracle block size,查找OS Blocksize的方法
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- 创建一个空的IBM DB2 ECO数据库的方法