触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
触发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制服从复杂的业务规则或要求。例如,您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
最基本的触发器是针对表的Insert、Update、Delete这三种操作来的。触发器可以建立在表上,也可以建立在视图上。建立在表上的触发器会在表内容发生改变时触发。建立在视图上的触发器会在视图内容改变时触发。注意,视图触发器仅会在明确对视图进行操作的SQL语句执行时才会触发,当基本表的内容发生改变而引起视图内容变化时,不会触发视图触发器。
是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑
开始
create trigger biufer_employees_department_id
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
when (new_value.department_id<>80 )
begin
:new_value.commission_pct :=0;
end;
/
触发器的组成部分:
1、 触发器名称
2、 触发语句
3、 触发器限制
4、 触发操作
1、 触发器名称
create trigger biufer_employees_department_id
命名习惯:
biufer(before insert update for each row)
employees 表名
department_id 列名
2、 触发语句
比如:
表或视图上的DML语句
DDL语句
数据库关闭或启动,startup shutdown 等等
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
说明:
1、 无论是否规定了department_id ,对employees表进行insert的时候
2、 对employees表的department_id列进行update的时候
3、 触发器限制
when (new_value.department_id<>80 )
限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。
其中的new_value是代表更新之后的值。
4、 触发操作
是触发器的主体
begin
:new_value.commission_pct :=0;
end;
主体很简单,就是将更新后的commission_pct列置为0
触发:
insert into employees(employee_id,
last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )
values( 12345,’Chen’,’Donny’, sysdate, 12, ‘donny@hotmail.com’,60,10000,.25);
select commission_pct from employees where employee_id=12345;
触发器不会通知用户,便改变了用户的输入值。
触发器类型:
1、 语句触发器
2、 行触发器
3、 INSTEAD OF 触发器
4、 系统条件触发器
5、 用户事件触发器
1、 语句触发器
是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。
例子:
需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。
Create table foo(a number);
Create trigger biud_foo
Before insert or update or delete
On foo
Begin
If user not in (‘DONNY’) then
Raise_application_error(-20001, ‘You don’t have access to modify this table.’);
End if;
End;
/
即使SYS,SYSTEM用户也不能修改foo表
[试验]
对修改表的时间、人物进行日志记录。
1、 建立试验表
create table employees_copy as select *from hr.employees
2、 建立日志表
create table employees_log(
who varchar2(30),
when date);
3、 在employees_copy表上建立语句触发器,在触发器中填充employees_log 表。
Create or replace trigger biud_employee_copy
Before insert or update or delete
On employees_copy
Begin
Insert into employees_log(
Who,when)
Values( user, sysdate);
End;
/
4、 测试
update employees_copy set salary= salary*1.1;
select *from employess_log;
5、 确定是哪个语句起作用?
即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING / DELETING 条件谓词,作判断:
begin
if inserting then
-----
elsif updating then
-----
elsif deleting then
------
end if;
end;
if updating(‘COL1’) or updating(‘COL2’) then
------
end if;
[试验]
1、 修改日志表
alter table employees_log
add (action varchar2(20));
2、 修改触发器,以便记录语句类型。
Create or replace trigger biud_employee_copy
Before insert or update or delete
On employees_copy
Declare
L_action employees_log.action%type;
Begin
if inserting then
l_action:=’Insert’;
elsif updating then
l_action:=’Update’;
elsif deleting then
l_action:=’Delete’;
else
raise_application_error(-20001,’You should never ever get this error.’);
Insert into employees_log(
Who,action,when)
Values( user, l_action,sysdate);
End;
/
3、 测试
insert into employees_copy( employee_id, last_name, email, hire_date, job_id)
values(12345,’Chen’,’Donny@hotmail’,sysdate,12);
select *from employees_log
分享到:
相关推荐
一个自己写的用触发器建立主键的程序,自己终于研究出来了,特此献上
(2)触发器建立在表一级,它与特定的数据修改事件相对应。 触发器类型 触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动...
- **触发表**:触发器建立在哪张表之上。 - **响应操作**:触发器响应哪种DML操作。 - **执行时机**:是在DML操作前还是后执行。 - **执行级别**:是语句级触发器还是行级触发器。 DML触发器可以: - 实现级联更改...
Oracle 常用命令举例 标题 基本语法 %type用法,%rowtype用法,TYPE用法 ... 建立简单的触发器 触发器分类 稍复杂的触发器 条件谓词 触发器中不可使用Commit 系统触发器举例(LOGON) instead of 触发器
发器是一种特殊的存储过程,它在执行语言事件执行时自动生效。
在数据库管理中,表、视图、存储过程和触发器是四大关键元素,它们共同构建了数据管理和交互的基础架构。下面将详细介绍这四个概念以及如何用代码创建它们。 1. **表的建立**:表是数据库中最基本的数据结构,用于...
同步器的有效性取决于第一级触发器恢复时间和第二级触发器建立时间的关系。 在系统最高速度计算,即最快时钟频率的确定上,需要考虑触发器的时钟延迟(Tco)、组合逻辑延迟(Tdelay)以及触发器的建立时间(Tsetup...
其建立时间tset应该大于等于2个传输延迟时间tpd,而保持时间tHL应大于等于tpd。此外,传输延迟时间的特性也可以分为两个部分:tPHL和tPLH,分别是高到低和低到高的传输延迟时间,通常tPHL=3tpd,而tPLH=2tpd。这些...
3. 建立 select 触发器,当查询到 t1 表的 name 列值等于"Bill"时,将对应的 id 插入表 t2: CREATE TRIGGER select_t1 SELECT ON t1 REFERENCING OLD AS old FOR EACH ROW WHEN (name = 'Bill') (INSERT INTO t2 ...
5.4 触发器建立 5.5 建存储过程 6、应用系统开发与试运行 6.1 开发平台和开发环境介绍。 6.2 前台界面与后台数据库连接说明,代码实现。 6.3 系统各功能设计和运行界面截图。 7、实验总结 7.1 遇到的问题和解决的...
在数据库管理中,触发器是一种特殊的存储过程,它在特定的数据操作(如INSERT、UPDATE或DELETE)发生时自动执行。本示例展示了如何在SQL Server中创建和使用触发器,以实现表间数据同步。 首先,创建了两个测试表格...
建立触发器的语法是:CREATE OR REPLACE TRIGGER 触发器名称 BEFORE/AFTER 事件 ON 表名 FOR EACH ROW DECLARE 变量声明 BEGIN 语句 END;。例如:CREATE OR REPLACE TRIGGER smslog_trigger BEFORE INSERT ON smslog...
建立好触发器后,现在只要我们删除 uRecord 表中的一条记录,就会在系统日志中增加一条事件日志。 通过以上简单的介绍,希望原来没有使用过触发器的朋友能对触发器有个大致的概念和印象,如果你要深入了解的话,SQL...
### Oracle序列和触发器的建立 #### 序列(Sequence) 在Oracle数据库中,序列是一种自动产生数值的对象,常用于为主键字段提供唯一值。序列主要用于实现表中的自增ID功能,例如,当用户需要为某张表的主键设置自...
6. 触发器建立:建立触发器以自动执行业务逻辑。 数据库具体实施步骤 在实施数据库设计时,我们需要按照以下步骤进行: 1. 创建数据库:使用SQL Server管理工具创建数据库。 2. 创建表对象:使用SQL Server管理...
### 触发器基本概念与应用场景 触发器是一种存储过程,它被定义为响应特定类型的数据库事件(如INSERT、UPDATE、DELETE)而自动执行的SQL语句集合。这些事件通常与特定的表相关联。触发器在确保数据完整性方面非常...
该系统规定管理人员可以对数据库进行纯熟操作,包括表查询、触发器建立、存储过程建立以及顾客自定义函数建立等等。 三、图书馆管理系统 E-R 图 E-R 图是该系统的数据模型,描述了图书、读者、借阅信息等实体之间...
物理结构设计是指家教信息管理系统的物理结构设计,包括设计表、数据库与表的创建、建立视图、建立索引、建立存储过程和建立触发器等。 3.4.1 设计表 设计表是指家教信息管理系统的设计表,包括教员信息表、管理员...
四、 建立行级触发器 行级触发器是指当执行 DML 操作时,以数据行为单位执行的触发器,即每一行数据都会执行一次触发器。语法: create [or replace] trigger triggerName before | after insert | update | ...