建设工作站服务器
ORACLE触发器语法
33558 www.zw 1840.com/Oracle/translation/concepts/html/22.triggers.htm
33558 www.zw 1840.com/Oracle/index.htm
触发器是发生特定事件时自动执行的代码块。 与存储过程一样,触发器与存储过程不同,它是由用户或APP应用程序显式调用的,而触发器不能直接调用。
功能:
1、允许/限制表格修改
2、自动生成自增字段等派生列
3、强制数据完整性
4、提供审计和日志记录
5、防止无效事务
6、启用复杂的业务逻辑
触发器的启动时间有after和before两种。
1、触发器语法:
CREATE [OR REPLACE] TIGGER触发器名称触发时间触发事件
ON表名
[FOR EACH ROW]
比根
pl/sql语句
结束
其中:
触发器名称:触发器对象的名称。
由于触发器由数据库自动执行,因此名称只是一个名称,没有实质目的。
触发时间:指示何时执行触发器。 该值如下:
before—表示在数据库运行之前触发触发器。
after—表示启动器将在数据库操作后执行。
触发事件:指定触发触发器的数据库操作。
insert :插入数据库将触发此触发器。
update :数据库更改将触发此触发器。
delete :此触发器由删除数据库触发。
表名:包含数据库触发器的表。
for each row :为表中每一行的触发器执行一次。 如果没有此选项,则只对整个表运行一次。
2、如:
以下触发器在更新表auths之前触发,以防止在周末更改表。
在更新整个createtriggerauth _ securebeforeinsertorupdateordelete//表之前触发
on auths
比根
if(to_char(sysdate,\\&; quot; dy\\&; quot; () ) ) ) ) ) ) ) ) sun\\) ) ) )。
raise_application_error(-20600,\\&; quot; 周末表auths\\\&; quot; 无法更改;
end if;
结束
例如:
createorreplacetriggercrm.t _ sub _ userinfo _ aur _ nameafterupdateofstaff _ name
ON CRM.T_SUB_USERINFO
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
declare
比根
if :NEW.STAFF_NAME!=:OLD.STAFF_NAME then
比根
客户投诉
updatet _ complaint _ managesetserve _ name=:new.staff _ name where serve _ seed=:old.seed;
客户服务
updatet _ customer _ caresetexecutor _ name=:new.staff _ name
where EXECUTOR_SEED=:OLD.SEED;
客户服务
updatet _ customer _ servicesetexecutor _ name=:new.staff _ name
where EXECUTOR_SEED=:OLD.SEED;
结束;
end if;
end T_sub_userinfo_aur_name;
/
二Oracle触发器详细信息
开始:
createtriggerbiufer _ employees _ department _ id
beforeinsertorupdateofdepartment _ id on employees
referencingoldasold _ valuenewasnew _ value
for each row
when(new_value.department_id80 )。
比根
: new_value.commission_pct :=0;
结束;
/
1、触发器组成部分:
1、触发器名称
2、触发语句
3、触发限制
4、触发操作
1.1、触发器名称
createtriggerbiufer _ employees _ department _ id
命名习惯:
缓冲存储器( bi ufer ) )。
employees表名
department_id列名称
1.2、触发语句
例如:
或视图上的DML语句
DDL语句
关闭或启动数据库、开始关闭等
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
说明:
1、对employees表进行insert时,无论是否规定了department_id
2、更新employees表中的department_id列时
1.3、触发限制
when(new_value.department_id80 )。
限制不是必须的。 本示例说明如果列department_id不是80,将发生触发器。
其中new_value表示更新后的值。
1.4、触发操作
这是触发器的主体
比根
: new_value.commission_pct :=0;
结束;
主体很简单,就是将更新后的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 _ pctfromemployeeswhereemployee _ id=12345;
触发器不会通知用户,而是更改用户的输入值。
2、触发器类型如下:
触发器类型:
1、语句触发
2、行触发
3、即时关闭触发器
4、系统条件触发
5、用户事件触发器
2.1、语句级触发器。 (语句级触发器每条DML语句执行一次) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )。
是在表或视图中执行的特定语句或语句组的触发器。 可以与INSERT、UPDATE、DELETE或组合关联。 但是,无论使用何种组合,每个语句触发器对于指定的语句都只有一次是活动的。 例如,无论update中的行数如何,update语句的触发器都只调用一次。
实例:
create or replace trigger tri_test
afterinsertorupdateordeleteontest
比根
if更新then
DMS_output.put_line(\\ )修复\\\ );
elsif deleting then
DMS_output.put_line((\\ )删除\\) );
elsif inserting then
DMS_output.put_line((\\ )插入(\\ ) );
end if;
结束;
2.2、低电平触发器.(行电平触发器对影响DML语句的每一行执行一次) ) ) ) )。
实例1 :
触发器
行级触发器
创建表测试( sid number,snamevarchar2(20 ); 创建表格
创建序列seq _ test; 创建序列
createorreplacetriggertri _ test创建触发器
beforeinsertorupdateofsidontest
foreach row触发所有行
比根
if inserting then
select seq _ test.nextval into:new.sidfromdual;
else
raise_application_error(-20020,\\&; quot; 不允许更新id值。 () ); 中断流程
end if;
结束;
测试,插入一些记录
insertintotestvalues(0,\\&; quot; ff\\&; quot;
insertintotestvalues(0,\\&; quot; ff\\&; quot;
insertintotestvalues(0,\\&; quot; TT\\&; quot;
输出应如下图所示。
实例2 :
创建一个触发器,用于将用户指定的作业列中的值转换为大写,无论用户插入新记录还是修改emp表中的作业列。
create or replace trigger trig_job
before insert or update of作业
on emp
for each row
span lang=en-us style=font-family :宋体; mso-bidi-font-size: 10.5
详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn