数据库Oracle与Mysql语法对比:触发器

本文介绍了Oracle和MySQL中触发器的创建方法及其使用场景。包括Oracle DML触发器的创建语法、权限需求及示例,以及MySQL触发器的创建语法、命名规则和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle

创建 DML 触发器

需要 CREATE TRIGGER 系统权限。
创建 DML 触发器的语法如下:
CREATE [OR REPLACE] TRIGGER 触发器名
{BEFORE|AFTER|INSTEAD OF} 触发事件 1 [OR 触发事件 2…]
ON 表名
WHEN 触发条件
[FOR EACH ROW]
DECLARE 声明部分
BEGIN
主体部分
END;
其中:
OR REPLACE:表示如果存在同名触发器,则覆盖原有同名触发器。
BEFORE、AFTER 和 INSTEAD OF:说明触发器的类型。 WHEN 触发条件:表示当该条件满足时,触发器才能执行。 触发事件:指 INSERT、DELETE 或 UPDATE 事件,事件可以并行出现,中间用 OR 连接。
对于 UPDATE 事件,还可以用以下形式表示对某些列的修改会引起触发器的动作:
UPDATE OF 列名 1,列名 2…
ON 表名:表示为哪一个表创建触发器。
FOR EACH ROW:表示触发器为行级触发器,省略则为语句级触发器。 触发器的创建者或具有 DROP ANY TIRGGER 系统权限的人才能删除触发器。删除触发器的语法如下:
DROP TIRGGER 触发器名
可以通过命令设置触发器的可用状态,使其暂时关闭或重新打开,即当触发器暂时不
用时,可以将其置成无效状态,在使用时重新打开。该命令语法如下:
ALTER TRIGGER 触发器名 {DISABLE|ENABLE}
其中,DISABLE 表示使触发器失效,ENABLE 表示使触发器生效。 同存储过程类似,触发器可以用 SHOW ERRORS 检查编译错误。

例:

将插入的雇员的名字变成以大写字母开头。
步骤 1:创建和编译以下触发器:

CREATE OR REPLACE TRIGGER INITCAP 
BEFORE INSERT  
ON EMP 
FOR EACH ROW 
BEGIN 
    :new.ename:=INITCAP(:new.ename); END; 

执行结果: 触发器已创建。
步骤 2:验证运行结果:

INSERT INTO emp(empno,ename,job,sal) VALUES(1000,'BILL','CLERK',1500); 

执行结果: 已创建 1 行。
执行查询:

SELECT ename,job,sal FROM emp WHERE empno=1000; 

执行结果:
ENAME JOB SAL
————- ————- ————————
Bill CLERK 1500

说明:在本例中,通过直接为:new.ename 进行赋值,修改了插入的值,但是这种用法只能在 BEFORE 型触发器中使用。验证结果为,在插入语句中雇员名称为大写的 BILL,查询结果中雇员名称已经转换成以大写开头的 Bill。

Mysql

创建Mysql触发器:

语法:

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name   
 FOR EACH ROW   
 BEGIN   
 trigger_stmt   
 END``
 说明:
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW BEGIN trigger_stmt END;大写的为关键字  

trigger_name:Mysql触发器的名字,我常用的命名规则t_name_tableName_(b|a)(i|u|d),t:触发器标识,name:英文名,tableName:表名,  

b(BEFORE):标识是触发事件之前,  

a(AFTER):标识触发事件之后,  

i(insert): 标识insert事件,  

u(update):标识update事件,  

d(delete):标识delete事件;  

trigger_time:触发时间(BEFORE或AFTER)  

trigger_event:事件名(insertupdatedelete)  

tbl_name:表名(必须是永久性表)  

trigger_stmt:执行语句(可以是复合语名),使用别名OLD和NEW,能够引用与触发程序相关的表中的列。

例子:

限定一次对雇员的工资修改不超过原工资的10 %。并设计修改案例测试修改成功和修改失败两种情况,给出输出结果。

delimiter $$
drop trigger if exists change_sal$$
create trigger  change_sal  
before update on emp
for each row
begin
declare error varchar(20);
if new.sal > old.sal*1.10 
then set error = '非法修改';
signal sqlstate 'HY000' set Message_TEXT = error;
end if;
end $$

update emp
set sal = 3000
where empno =1000;

update emp
set sal = 4000
where empno =1000;

这里写图片描述

参考:
http://www.2cto.com/database/201311/255682.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值