oracle中触发器的讲解

  触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。

create sequence seq_userInfo_usid start with 1001;
create or replace triggle tri_userInfo_usid --创建或替换触发器tri_userInfo_usid
before insert on userInfo --在向userInfo表中添加 记录之前的触发
for each row --没影响一行出发一次
begin --触发之后执行下面的语句
select seq_userInfo_usid.nextval into :new.usid from dual; --:new新值 :old老值
end;

案列

--日志 触发器讲解

--查看所有触发器
select * from user_triggers;
--禁用触发器
alert trigger tri_log_uname(触发器名字) disable;
--激活触发器
alert trigger tri_log_uname(触发器名字) enble;
--重新编译
alert trigger tri_log_uname complie;
--禁用某个表上的触发器
alert table <table_name> diable all triggers;
create table log(
uname varchar2(20),
action varchar2(10),
acttime date
);

--从U001开始,以递增的形式对uname进行命名
create sequence seq_log_uname start with 1001;
create or replace trigger tri_log_uname
before insert on log
for each row
begin
select ‘U‘||substr(seq_log_uname.nextval,1) into :new.uname from dual;
end;

insert into log values(1,‘yc‘,sysdate);
select * from log;

create or replace trigger tri_log
after insert or update or delete on dept
for each row --for each 行级触发,执行语句没影响一行出发一次,默认是语句级触发,没执行一条语句触发一次,无论该语句影响多少行,
begin
if inserting then
insert into log values(user,‘insert‘,sysdate);
elsif updating then
insert into log values(user,‘update‘,sysdate);
elsif deleting then
insert into log values(user,‘delete‘,sysdate);
end if;
end;

select * from dept;
insert into dept values(80,‘技术部‘,‘湖南衡阳‘);

select * from log;

--更改dept和emp中的deptno的值(涉及主外键)
create or replace trigger tri_dept
before update on dept
for each row
begin
update emp set deptno=:new.deptno where deptno=:old.deptno;
end;

update dept set deptno=88 where deptno=20;
select * from dual;
select * from dept;
select * from emp;

create or replace trigger tri_emp
before update of sal on emp --当修改emp表中的sal列在值时
for each row
when(new.sal<=old.sal)
begin
select 3000 into :new.sal from dual;
end;

select * from emp;
update emp set sal=4000 where empno=7369;

时间: 2024-09-30 19:09:36

oracle中触发器的讲解的相关文章

Oracle中触发器(1)

Oracle数据库触发器是存储于数据库的命名PL/SQL语句块,当触发事件发生时他们会隐含的执行,执行触发器的活动被称为触发触发器. 特定用户在特定模式下,或者任何用户执行的ddl语句(如create或者alter),这种触发器经常被用于审计目的,并且专用于oracle DBA.可以记录各种模式修改,何时执行.以及那个用户执行的. 系统事件,如数据库启动或者关闭 用户事件,如登录或者注销.即可以定义一个触发器,在用户登录数据库时记录用户名和登录时间. 触发器相关视图: 创建触发器的通用语法: c

oracle 中触发器增加存储过程commit问题

触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了 当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务里的子事务 正常情况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句. 解决办法有两种: 1.在可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理.如: create or replace trigger UPDA

oracle中触发器调用Java程序

1. 写一个Java程序,Java程序的目录是:E:\APP\test\src\test\Main.java 2. 在环境变量Path中配置,E:\studyInstallPath\oracle\BIN 3. 在E:\APP\test\src\test这个目录下执行 4. 5. 创建存储过程 create or replace procedure testmodify(name varchar2) as language Java name 'Main.modify(java.lang.Stri

Oracle中触发器(2)

上一篇对触发器的一些基本知识有了了解,在这一篇操作进行验证 before触发器 [[email protected] ~]$ sqlplus / as sysdba SQL> create user trigger_test identified by 123456 ; SQL> grant create session to trigger_test ; SQL> grant create table to trigger_test ; SQL> grant dba to tri

oracle中触发器报错:未找到数据

select ts.tbcxsx into param_timeLimit from winf_sv_ex_hybs_tbcxsq ts  where ts.sblsh=:new.sblsh and ts.xh=:new.xh; 如果未找到任何记录,后面加一句 Exception when no_data_found then     param_timeLimit := 0;   即可:

【转】oracle中触发器中:new和:old 的使用方法

create or replace trigger TRI_PrintTest before delete or insert or update on TEST_EXAM --触发事件 for each row -- 每修改一行都需要调用此过程 begin dbms_output.put_line(:new.IDNEW); --IDNEW字段更新后的值 dbms_output.put_line(:old.IDNEW); --IDNEW字段更新前的值 end; --原IDNEW字段是1时, --

Oracle中创建触发器示例及注意事项

Oracle中创建触发器示例及注意事项 1.oracle 中创建触发器示例 CREATE TABLE "CONCEPT"."FREQUENCYMODIFYLOG" ( "FREQUENCYID" NUMBER(10,0), "NAME" NVARCHAR2(30), "CODE" VARCHAR2(10 CHAR), "MNEMONICCODE" VARCHAR2(10 CHAR), &

Oracle中的触发器

Oracle中的触发器,布布扣,bubuko.com

Oracle 中的自动增长字段

环境:PLSQL Developer 7.1.5 Oracle 11.2.0 Oracle 中不像MYSQL和MSSQLServer中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段.在Oracle中SEQUENCE被称为序列,每次取的时候它会自动增加,一般用在需要按序列号排序的地方. 在使用SEQUENCE前需要首先定义一个SEQUENCE,定义SEQUENCE的语法如下: CREATE SEQUENCE sequence_name INCR