oracle 11g实验五——触发器的使用
实验要求:
实验五 触发器的使用
实验目的
1、 理解触发器的概念、作用及分类;
2、 掌握触发器的创建、使用;
实验内容
1、 建立表orders:用于存储订单列表信息;表order_items:用于存储单个订单的详细信息。其结构分别为:
表1 orders表结构
字段名 |
字段类型 |
字段宽度 |
说明 |
id |
NUMBER |
20 |
订单编号(主键) |
order_date |
Date |
订单日期(非空) |
|
user_name |
VARCHAR2 |
10 |
客户名称(非空) |
city |
VARCHAR2 |
20 |
客户所在城市(默认沈阳) |
表2 order_items表结构
字段名 |
字段类型 |
字段宽度 |
说明 |
order_id |
NUMBER |
20 |
订单编号(主键) |
product_NAME |
VARCHAR2 |
20 |
产品名称(非空) |
quantity |
NUMBER |
4 |
数量(大于0,小于100) |
unit_price |
NUMBER |
(10,2) |
产品单价 |
2、 创建触发器,将用户对orders表的修改,保存到日志表(自己创建)中。
3、 测试触发器。
4、 创建触发器,限制只有scott用户可以修改表orders。
5、 测试触发器。
6、 删除触发器。
7、 创建用户签订订单详细信息视图view_user_order,包括用户名、订单号、商品名、数量、单价。
8、 创建触发器,实现更新视图,更新及表数据。
9、 测试触发器。
10、删除触发器。
实验答案:
--创建orders表
create table orders(
id NUMBER(20) PRIMARY KEY NOT NULL,
order_date date not null,
user_name varchar2(10) not null,
city varchar2(20) default '沈阳'
); --创建order_items表
create table order_items(
order_id number(20) primary key,
product_NAME varchar2(20) not null,
quantity number(4) check(quantity BETWEEN 0 AND 100),
unit_price number(10,2)
); --2、 创建触发器,将用户对orders表的修改,保存到日志表(自己创建)中。
--日志表
CREATE TABLE T_LOG
(
RID VARCHAR2(32),
NAME VARCHAR2(1000),
RQ DATE DEFAULT sysdate,
OLDVALUE VARCHAR2(255),
NEWVALUE VARCHAR2(255)
);
--目标表
create table orders(
id NUMBER(20) PRIMARY KEY NOT NULL,
order_date date not null,
user_name varchar2(10) not null,
city varchar2(20) default '沈阳'
); CREATE OR REPLACE TRIGGER order_loggin
AFTER UPDATE
ON orders
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
BEGIN
if :new.city<>:old.city
then
insert into T_LOG (rid,name,newvalue,oldvalue)
values(:new.id,'城市', :new.city , :old.city);
end if;
if :new.user_name<>:old.user_name
then
insert into t_log (rid,name,newvalue,oldvalue)
values(:new.id,'姓名',:new.user_name,:old.user_name);
end if;
if :new.order_date<>:old.order_date
then
insert into t_log (rid,name,newvalue,oldvalue)
values(:new.id,'订单日期',:new.order_date,:old.order_date);
end if;
END order_loggin; --3、 测试触发器。
update orders set user_name='213456' where id='1'; SELECT * from t_log; --4、 创建触发器,限制只有scott用户可以修改表orders。
create or replace
TRIGGER alter_order
BEFORE INSERT or UPDATE or DELETE
ON orders
declare
user_name VARCHAR2(30);
BEGIN
select user into user_name FROM dual;
if(lower(user_name)<>'scott') THEN RAISE_APPLICATION_ERROR(-20001,'改用户不能修改orders表');
END IF;
END alter_order; --5、 测试触发器。 update orders set user_name='111' where id='1'; --6、 删除触发器。 DROP TRIGGER alter_order; create table orders(
id NUMBER(20) identified(1,1) PRIMARY KEY NOT NULL,
order_date date not null ,
user_name varchar2(10) not null,
city varchar2(20) default '沈阳'
); create table order_items(
order_id number(20) primary key,
product_NAME varchar2(20) not null,
quantity number(4) check(quantity BETWEEN 0 AND 100),
unit_price number(10,2)
);
--7、 创建用户签订订单详细信息视图view_user_order,包括用户名、订单号、商品名、数量、单价。
create or replace VIEW view_user_order
as select user_name,order_id,product_NAME,quantity,unit_price from order_items join orders on(order_items.order_id=orders.id); --测试
SELECT * FROM view_user_order;
--8、 创建触发器,实现更新视图,及更新表数据。 create or replace
TRIGGER view_user_order_trigger
INSTEAD OF
INSERT ON view_user_order
FOR EACH ROW
BEGIN
INSERT INTO orders(id,user_name) values(:new.order_id,:new.user_name);
INSERT INTO order_items(order_id, product_NAME, quantity,unit_price)
VALUES(:new.order_id, :new.product_NAME, :new.quantity, :new.unit_price);
END view_user_order_trigger; --9、 测试触发器。 insert into view_user_order values('12310',4,'电话',20,1500);
insert into view_user_order values('12311',5,'电话',20,1500);
--10、 删除触发器。 DROP TRIGGER view_user_order_trigger;
oracle 11g实验五——触发器的使用的更多相关文章
- SQL SERVER 2008向ORACLE 11G迁移示例
来源于:http://www.cnblogs.com/hiizsk/ 由SQL SERVER 2008向ORACLE 11G迁移过程记录之一-表 使用Oracle Sql Developer将SQL ...
- PowerDesginer 生成的Oracle 11g 组合触发器代码编译错误(29): PLS-00103
问题描述: 采用PowerDesigner15针对Oracle 11g 创建物理数据模型,想实现一个字段的自增,采用如下步骤: 1.创建序列,命名为Sequence_1; 2.在自增字段编辑窗口中,选 ...
- Oracle 11g新特性
文章转自网络 Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(I ...
- ORACLE 11G R2 RAC classical install OGG12.1(LINUX) 经典抽取模式单项同步配置OGG12.1
博文结构图如下: 一.环境描述以及注意事项 1.1 环境简介 IP 系统 Oracle版本 OGG版本 源端 172.16.10.16/36 RHEL6.5 oracle11204 12.1 目标端 ...
- oracle 11g 分区表创建(自动按年、月、日分区)
前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性. oracle 11g 支持自动分区,不 ...
- 64位Oracle 11g 使用PL/SQL
Oracle 11g和PL/SQL安装完后,发现打开PL/SQL并不能连接Oracle数据库! [第一回合]完败! 先是在网上找解决方法,说是需要使用Net Configuration Assista ...
- 数据库系统入门 | Oracle Linux上部署Oracle 11g服务,并实现SSH远程登录管理
文章目录 写在前面 一.实验内容 二.实验前期准备 1.软件目录 2.准备一些配置文件.脚本文件 三.实验方案(具体步骤) (一)在虚拟机上安装Oracle Linux (二)在Linux上安装Ora ...
- Linux 6.x 下Oracle 11g R2 安装配置
Oracle 11g R2 数据库安装硬件配置要求: 最小内存 1 GB of RAM 虚拟内存容量,这个oracle也有要求,不用担心此时的swap分区不够oracle的要求 .虚拟内存swap如何 ...
- 【Oracle 集群】Oracle 11G RAC教程之集群安装(七)
Oracle 11G RAC集群安装(七) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总. ...
随机推荐
- win10.10 激活
最近几天一直有同学来找我说,为什么用密钥或kms神龙版都无法激活win8/8.1.win10,于是我就让这些同学给我截图,结果他们激活出错的信息基本都一样,都是错误:“0XC004F074 软件授权服 ...
- zTree 异步加载
zTree异步加载数据的简单实现,更为详细的Api请参考 zTree官网 http://www.treejs.cn/ <link href="~/Content/ztree/css ...
- iOS之pch文件的正确使用
在Xcode6之前,创建一个新工程xcode会在Supporting files文件夹下面自动创建一个“工程名-Prefix.pch”文件,也是一个头文件,pch头文件的内容能被项目中的其他所有源文件 ...
- PHP免费API调用,使用(CURL)
<?phpclass GetApiModel{//获取第三方API //获取身份证信息 //返回json /*{ "errNum": 0, "retMsg" ...
- nginx笔记----安装
nginx的安装 ./configure make && make install (一)准备条件: 1.GCC---gun编译器集合 Nginx是一个由C语言编写的程序,因此首先需要 ...
- Nodejs v4.x.0API文档学习(1)简介
文档参考地址:https://nodejs.org/dist/latest-v4.x/docs/api/ 简介 下面是用nodejs编写的一个web服务的例子,返回"Hello World& ...
- 很常见的一直旋转的loading效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- awk与cut在以空格为分割域时的区别
awk默认以空格为分割域,比如我想获得某进程pid:[root@SHCTC-GAME12-44 ~]# ps -ef|grep "sshd -f"|grep -v greproot ...
- items 与iteritems
dict的items函数返回的是键值对的元组的列表,而iteritems使用的是键值对的generator. items当使用时会调用整个列表 iteritems当使用时只会调用值. >> ...
- ###STL学习--vector
点击查看Evernote原文. #@author: gr #@date: 2014-08-11 #@email: forgerui@gmail.com vector的相关问题.<stl学习> ...