实验6 触发器与作业

  • 格式:doc
  • 大小:118.22 KB
  • 文档页数:15

实验6触发器与作业姓名:学号:网络工程班级:专业:2013/11/28 同期日:无组人:实验【实验目的与要求】理解什么是触发器?掌握触发器的设计与使用?中完成定时作务的方法掌握在Oracle?【实验内容与步骤】本实验中前面实验创建的触发器可能对后面的实验产生干扰,若出相关说明:现这种情况,请把前面触发器删除,再完成后面实验。

建议每完成一个实验题后,即将该题相关的触发器删除,以免对后面实验产生干扰。

触发器创建与删除语法6.01.触发器的创建PL/SQL 触发器是一种在发生数据库事件时自动运行的语法如下:触发事件触发时间 CREATE [OR REPLACE] TIGGER触发器名表名ON[FOR EACH ROW] BEGINpl/sql语句END.触发器的删除2DROP TRIGGER trigger_name触发器基础6.1请阅读并理解以下程序代码,给出运行结果。

以下程序展示的是触发器的基本使用方法,创建测试表1.--drop table employees;create table employees(number(5),id页15 共页1 第name varchar2(30),salary number(8,2),job_id varchar2(20));2.创建触发器CREATE OR REPLACE TRIGGER secure_emp_1 --这里不能有ISBEFORE INSERT ON employees --这里没有分号BEGINIF (TO_CHAR (SYSDATE,'DY') IN ('星期六','星期天') OR(TO_CHAR(SYSDATE,'HH24:MI') NOT BETWEEN '08:00' AND '18:00' )) THEN RAISE_APPLICATION_ERROR(-20500,'你只能在工作时间对表进行操作');END IF;END;/3.测试触发器(1)--测试语句insert into employees values (1,'a',2222,'aaaaa');给出测试结果截图:(2)将系统时间修改为周六,再Insert一条记录,给出并比较两次运行的结果。

给出测试结果截图:6.2使用触发器监控数据更新操作阅读以下程序,理解程序功能,给出运行测试结果。

1.创建触发器CREATE OR REPLACE TRIGGER secure_emp_2BEFORE INSERT OR UPDATE OR DELETE ON employeesBEGIN页15 共页2 第--如果当前时间是周六或周日或者时间不在8:00-18:00之间IF (TO_CHAR (SYSDATE,'DY') IN ('星期五','星期天') OR(TO_CHAR(SYSDATE,'HH24:MI') NOT BETWEEN '08:00' AND '18:00' )) THENIF DELETING THENRAISE_APPLICATION_ERROR (-20502,'你只能在工作时间删除员工表的数据');ELSIF INSERTING THENRAISE_APPLICATION_ERROR (-20500,'你只能在工作时间插入员工表的数据.');ELSIF UPDATING ('SALARY') THENRAISE_APPLICATION_ERROR (-20503,'你只能在工作时间更新员工表的数据');ELSERAISE_APPLICATION_ERROR (-20504,'你只能在工作事件操作员工表的数据.');END IF;END IF;END;/2.运行测试分别运行以下测试语句,给出运行结果。

并理解为什么会有这样的结果。

insert into employees values (1,'a',2222,'AD_PRES');insert into employees values (2,'b',2222,'AD_VP');给出测试结果截图:delete from employees;给出测试结果截图:update employees set salary=3000;给出测试结果截图:页15 共页3 第6.3在insert或update中使用:new阅读并理解以下程序,理解其功能,给出运行测试结果。

1.创建触发器--在insert或update中使用:new--CREATE OR REPLACE TRIGGER restrict_salaryBEFORE INSERT OR UPDATE OF salary ON employeesFOR EACH ROWBEGIN--插入和修改可以使用:new来访问新的数据,修改也可以使用:old来访问旧的数据IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP'))AND :NEW.salary > 15000THENRAISE_APPLICATION_ERROR (-20202,'员工不能赚到这么多薪水');END IF;END;2.运行测试--测试语句insert into employees values (1,'a',20000,'AD_PRES');insert into employees values (2,'b',20000,'AD_VPs');update employees set salary=30000 ,job_id='xxxx' where name='a';给出运行结果:页15 共页4 第update语句执行的差别。

观察运行结果,比较insert和思考::old中使用delete6.4在阅读并理解以下程序,理解其功能,给出运行测试结果。

创建触发器1.CREATE OR REPLACE TRIGGER restrict_salary_delON employees FOR EACH ROW BEFORE DELETEBEGIN来访问旧的数据语句中只能使用:old --在delete(:OLD.job_id IN ('AD_PRES', 'AD_VP')) AND (:OLD.salary > 15000) IFTHEN'); 该员工不可以删除RAISE_APPLICATION_ERROR (-20202,'END IF;END;2.运行测试测试语句--',20000,'AD_PRES'); 张三insert into employees values (2,''; 张三delete from employees where name='给出运行结果:页15 共页5 第6.5INSTEAD OF类型的触发器阅读并理解以下程序,理解其功能,给出运行测试结果。

1.准备工作:创建触发器及相应测试用表--INSTEAD OF类型的触发器drop table departments;create table departments(dept_id number(5) primary key,dept_name varchar2(20));drop table employees;create table employees(employee_id number(5),employee_name varchar2(20),department_id number(5),constraint empl_dept_fk foreign key (department_id) references departments(dept_id) );--创建视图create or replace view v_empasselect e.employee_id,e.employee_name,e.department_id,d.dept_namefrom employees e,departments dwhere e.department_id = d.dept_id--创建触发器create or replace trigger new_view_emp_deptinstead of insert on v_empl for each rowbeginif inserting theninsert into departmentsvalues(:new.department_id,:new.dept_name);insert into employeesvalues(:new.employee_id,:new.employee_name,:new.department_id);end if;end;2.运行测试(1)查询视图:select * from v_emp;给出运行结果:(2)插入测试数据--向视图中插入数据insert into v_emp values (171,'张六',1000,'销售部');(3)结果测试select * from employees;页15 共页6 第给出运行结果:select * from departments;给出运行结果:6.6系统级触发器阅读并理解以下程序,理解其功能,给出运行测试结果。

1.创建触发器------------系统触发器-----------------------------------------创建登陆或者退出数据库日志表drop table logs;create table logs(userid varchar2(20),times date,op varchar2(10));----登陆数据库触发器create or replace trigger log_onafter logon on schemabegininsert into logs values(user,sysdate,'logon');end;/--退出数据库触发器create or replace trigger log_offbefore logoff on schemabegininsert into logs values(user,sysdate,'logoff');end;/2.运行测试(1)--以不同的用户身份登录和退出数据库数次,以获得相关数据如:conn sys/testdb as sysdba;Conn soctt/tiger页15 共页7 第(2)-- A设置日期的显示格式alter session set nls_date_format='YYYY-MM-DD HH_MI_SS';(3)--查看记录select * from logs;给出运行结果:作业与定时任务6.76.7.1作业概述中实现定时任务。