陈奇网络工作室

ORACLE触发器语法和实例1

建设工作站服务器

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

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3