--触发器
--语法

CREATE OR REPLACE TRIGGER TRIGGER_NAME
AFTER|BEFORE|INSTEAD OF
[INSERT][OR UPDATE [OF COLUMN_LIST]] [OR [DELETE]]
ON TABLE_OR_VIEW_NAME
[REFERENCING{OLD[AS]OLD/NEW[AS]NEW} ]
[FOR EACH ROW]
[WHEN(condition)]
pl/sql_block; --sqlserver        oracel
deleted          :old
inserted        :new

--触发器中不能使用 ROLLBACK ,COMMIT,SAVEPOINT
--如果在触发器中PLSQL使用了:NEW :OLD时,就必须是行级触发器,必须要有 FOR EACH ROW

--创建实验环境
CREATE TABLE SC(CODE NUMBER ,SNAME VARCHAR2(10),SCORE NUMBER);
INSERT INTO SC VALUES (1,'AA',87);
INSERT INTO SC VALUES (2,'BB',67);
INSERT INTO SC VALUES (3,'CC',57);
INSERT INTO SC VALUES (4,'DD',88);
COMMIT;
SELECT * FROM SC; SET SERVEROUT ON CREATE OR REPLACE TRIGGER TRIG1
BEFORE INSERT OR UPDATE
ON SC
FOR EACH ROW
BEGIN
DBMS_OUTPUT.put_line('TRIG1 IS VALID');
END;
/
INSERT INTO SC VALUES (5,'EE',90);
UPDATE SC SET SCORE=SCORE+1;
ROLLBACK; --SCORE 必须在0-100中
CREATE OR REPLACE TRIGGER TRIG2
BEFORE INSERT
ON SC
FOR EACH ROW --使用了:NEW,:OLD时必须要有这句话
BEGIN
IF :NEW.SCORE<0 OR :NEW.SCORE>100
THEN RAISE_APPLICATION_ERROR(-20001,'ERROR');
END IF;
END;
/
INSERT INTO SC VALUES (6,'EE',-1);
INSERT INTO SC VALUES (6,'EE',101);
INSERT INTO SC VALUES (6,'EE',10);
ROLLBACK;
--当插入的CODE是负数时,将其转为正数再插入 必须在0-100中
CREATE OR REPLACE TRIGGER TRIG3
BEFORE INSERT
ON SC
FOR EACH ROW
BEGIN
IF :NEW.CODE < 0
THEN :NEW.CODE := -:NEW.CODE;
END IF;
END;
/
INSERT INTO SC VALUES (-7,'EE',90);
--当用户对表进行操作时记录操作
CREATE OR REPLACE TRIGGER TRIG5
BEFORE INSERT OR UPDATE OR DELETE
ON SC
FOR EACH ROW
BEGIN
IF INSERTING --关键词
THEN DBMS_OUTPUT.PUT_LINE('INSERT:'||:NEW.CODE||','||:NEW.NAME||','||:NEW.SCORE);
END IF;
IF DELETING --关键词
THEN DBMS_OUTPUT.PUT_LINE('DELETE:'||:OLD.CODE||','||:OLD.NAME||','||:OLD.SCORE);
END IF;
IF UPDATING --关键词
THEN DBMS_OUTPUT.PUT_LINE('UPDATE_B:'||:OLD.CODE||','||:OLD.NAME||','||:OLD.SCORE);
DBMS_OUTPUT.PUT_LINE('UPDATE_A:'||:NEW.CODE||','||:NEW.NAME||','||:NEW.SCORE);
END IF;
END;
/ INSERT INTO SC VALUES (10,'EE',90);
UPDATE SC SET SCORE=100 WHERE CODE=10;
DELETE SC WHERE CODE=10;
--用触发器修改视图(非键保留表)
--创建实验环境
CREATE TABLE STUDENT (SNO INT ,SNAME VARCHAR2(10),SAGE INT);
INSERT INTO STUDENT VALUES (1,'AA',22);
INSERT INTO STUDENT VALUES (2,'BB',23);
INSERT INTO STUDENT VALUES (3,'CC',24);
INSERT INTO STUDENT VALUES (4,'DD',25);
INSERT INTO STUDENT VALUES (5,'EE',26); CREATE TABLE ADDRESS (SNO INT ,ZZ VARCHAR2(10));
INSERT INTO ADDRESS VALUES (1,'ZZ');
INSERT INTO ADDRESS VALUES (2,'LY');
INSERT INTO ADDRESS VALUES (3,'KF');
INSERT INTO ADDRESS VALUES (4,'XX');
INSERT INTO ADDRESS VALUES (5,'XC');
COMMIT; GRANT CREATE VIEW TO SCOTT ; --DBA CREATE OR REPLACE VIEW V1
AS
SELECT A.SNO,A.SNAME ,A.SAGE,B.ZZ
FROM STUDENT A LEFT JOIN ADDRESS B
ON A.SNO=B.SNO;
--实现更新操作
UPDATE V1 SET ZZ='AY' WHERE SNAME = 'BB';
-- ORA-01779: cannot modify a column which maps to a non key-preserved table CREATE OR REPLACE TRIGGER TRIG4
INSTEAD OF UPDATE
ON V1
FOR EACH ROW
DECLARE
A NUMBER :=0; --用在存储SNO
BEGIN
SELECT SNO INTO A FROM STUDENT WHERE SNAME = :OLD.SNAME; --赋值
DELETE ADDRESS WHERE SNO=A; --删除原数据
INSERT INTO ADDRESS VALUES (A,:NEW.ZZ); --插入新数据
END;
/
UPDATE V1 SET ZZ='AY' WHERE SNAME = 'BB';
--模式触发器
--例
CREATE TABLE DROPPDE_OBJ(OBJ_NAME VARCHAR2(30),OBJ_TYPE VARCHAR2(20),DROP_DATE DATE);
CREATE OR REPLACE TRIGGER LOG_DROP_OBJ
AFTER DROP --类型
ON SCHEMA --模式
BEGIN
INSERT INTO DROPPED_OBJ
VALUES (ora_dict_obj_name,ora_dict_obj_type,SYSDATE);
END;
/ CREATE TABLE TT (ID INT);
DROP TABLE TT ; ora_client_ip_address --返回客户端的IP
ora_database_name --返回当前数据库名
ora_login_user --返回登录用户名
ora_dict_obj_name --返回DDL操作对应的数据库对象名
ora_dict_obj_type --返回DDL操作对应的数据库对象类型
--数据库启动、关闭 触发器 --SYS使用

--数据库启动触发器
CREATE TABLE EVENT_TABLE (EVENT VARCHAR2(30),TIME DATE); CREATE OR REPLACE TRIGGER TR_STARTUP
AFTER STARTUP --AFTER
ON DATABASE
BEGIN
INSERT INTO EVENT_TABLE VALUES (ora_sysevent,SYSDATE);
END;
/
--数据库关闭触发器 CREATE OR REPLACE TRIGGER TR_STARTUP
BEFORE SHUTDOWN --BEFORE
ON DATABASE
BEGIN
INSERT INTO EVENT_TABLE VALUES (ora_sysevent,SYSDATE);
END;
/
--用户登录和退出触发器
CREATE TABLE LOGIN_TABLE (USERNAME VARCHAR2(10),LOGON_TIME DATE,LOGOFF_TIME DATE,ADDRESS VARCHAR2(30)); --登陆
CREATE OR REPLACE TRIGGER TRIG_LOGON
AFTER LOGON
ON DATABASE
BEGIN
INSERT INTO LOGIN_TABLE(USERNAME,LOGON_TIME,ADDRESS)
VALUES (ora_login_user,SYSDATE,ora_client_ip_address);
END;
/
--退出
CREATE OR REPLACE TRIGGER TRIG_LOGOFF
BEFORE LOGOFF
ON DATABASE
BEGIN
INSERT INTO LOGIN_TABLE(USERNAME,LOGOFF_TIME,ADDRESS)
VALUES (ora_login_user,SYSDATE,ora_client_ip_address);
END;
/
--启用、禁用与删除
ALTER TRIGGER TRIGGER_NAME DISABLE;
ALTER TRIGGER TRIGGER_NAME ENABLE;
DROP TRIGGER TRIGGER_NAME ; --查看触发器相关信息
SELECT * FROM USER_TRIGGERS;

--更多内容可以查看:http://blog.csdn.net/indexman/article/details/8023740/

ORACLE 触发器 基础的更多相关文章

  1. 【database】oracle触发器基础

    一.oracle触发器基本语法 CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE ...

  2. Oracle数据库基础入门《二》Oracle内存结构

    Oracle数据库基础入门<二>Oracle内存结构 Oracle 的内存由系统全局区(System Global Area,简称 SGA)和程序全局区(Program Global Ar ...

  3. 2014/11/06 Oracle触发器初步 2014-11-06 09:03 49人阅读 评论(0) 收藏

    触发器我就不多解释了,保证数据的完整性的神器,嗯..也是减少程序员工作托管给数据库操作的好帮手.就不讲一些大道理了.通俗点,我们对数据库的操作,无非就是增 删 改 查. 触发器就是在删,改,增的时候( ...

  4. oracle触发器加条件判断

    oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ...

  5. [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法

    连续创建多个Oracle触发器失败,单个创建才成功的解决方法   1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下:   create or replace trigger t ...

  6. Oracle 触发器在日志管理开发中的应用

    摘要: 本文讨论了利用数据库中的触发器对日志管理进行设计与实现的方法, 是对原来在客户端软件中编写日志管理方法的一种改进, 并给出了 Oracle9i 中的实例演示.关键词: Oracle; 触发器; ...

  7. oracle触发器应用

    首先给大家推荐两篇我看后的博文,我已经内容转载过来: 1.对触发器的讲解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建 ...

  8. Mybatis 插入操作时获取主键 (Oracle 触发器与SEQ)

    1.通过Oracle序列 -- Create sequence create sequence SEQ_DW_EWSYSTEM minvalue 1 maxvalue 9999999999999999 ...

  9. SQL server与Oracle触发器的创建与使用

    SQL Server 1创建触发器 GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE T ...

随机推荐

  1. 使用PostMan进行API自动化测试

    最近在进行一个老项目的升级,第一步是先将node版本从4.x升级到8.x,担心升级会出现问题,所以需要将服务的接口进行验证:如果手动输入各种URL,人肉check,一个两个还行,整个服务..大几十个接 ...

  2. webapi 使用Autofac 开发经历

    2018/4/6 号 早上五点..被手机震动吵醒. 之后直接打开电脑,打算再加强下我自己的webapi这套东西. 虽然三年的工作经验接触了N多框架和各种风格的开发方式,但是让我自己来搞一套实在不会搞, ...

  3. js中严格模式

    我们在js中可以使用"use strict";定义了我们在接下来的文档输写中 将按照严格模式进行: function(){ "use strict'; ;// 在这里我们 ...

  4. 新概念英语(1-67)The weekend

    新概念英语(1-67)The weekend What are the Johnsons going to do at the weekend? A:Hello. Were you at the bu ...

  5. matlab 对tif数据高程图的处理分析

    temp=z(101:2200,101:2200) 根据图像属性可得此为2300*2300的tif图像,由于需要将其划分为9宫格,所以begin点设置为101,end点设置为2200,temp转化为可 ...

  6. python flask框架 蓝图的使用

    蓝图的目的是实现 各个模块的视图函数写在不同的py文件当中. 主视图 中 导入 分路由视图的模块,并且注册蓝图对象 分路由视图中 利用 蓝图对象 的route 进行装饰视图函数 主路由视图函数: #c ...

  7. CentOS7从U盘中拷贝文件

    1. 要想从U盘中拷贝文件,必须要将U盘挂载到一个目录中,所以必须新建一个目录,一般建在/mnt下.我们执行:mkdir /mnt/usb来新建一个目录. 2. 查看U盘是否已经被识别.执行:df - ...

  8. python/零起点(一、字典)

    python/零起点(一.字典) dict( )字典 dict()强型转换成字典类型的数据类型: 字典的键(Key)必须是唯一不可变的 字典是无序,字典可变数据类型,且是可迭代的对象 字典清空操作案例 ...

  9. python CSS

    CSS 一. css的四种引入方式   1.行内式  2.嵌入式  3. 链接式 将一个.css文件引入到HTML文件中 1 <link href="mystyle.css" ...

  10. python虚拟环境--virtualenv

    virtualenv 是一个创建隔绝的Python环境的工具.virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包. 安装 pip install virtu ...