`
121059457
  • 浏览: 23514 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习笔记:21触发器

阅读更多

21-1:建立before触发器
	CREATE OR REPLACE TRIGGER tr_sec_emp
	BEFORE INSERT OR UPDATE OR DELETE ON emp
	BEGIN
	  IF to_char(sysdate,'DY','nls_date_language=AMERICAN')
	    IN ('SAT','SUN') THEN
	      raise_application_error(-20001,
	       '不能在休息日改变雇员信息');
	  END IF;
	END;
	/
21-2:建立after触发器
	CREATE TABLE aud_upd_table(
	  host VARCHAR2(30),statement VARCHAR2(100),exectime DATE);
	CREATE OR REPLACE TRIGGER tr_upd_emp
	AFTER UPDATE ON emp
	DECLARE
	  sql_txt ora_name_list_t;
	  v_stmt VARCHAR2(100);
	  n BINARY_INTEGER;
	BEGIN
	  n:=ora_sql_txt(sql_txt);
	  FOR i IN 1..n LOOP
	    v_stmt:=v_stmt||sql_txt(i);
	  END LOOP;
	  INSERT INTO aud_upd_table VALUES(
	    sys_context('userenv','host'),v_stmt,SYSDATE);
	END;
	/
21-3:使用条件谓词
	CREATE OR REPLACE TRIGGER tr_sec_emp
	BEFORE INSERT OR UPDATE OR DELETE ON emp
	BEGIN
	  IF to_char(sysdate,'DY','nls_date_language=AMERICAN')
	     IN ('SAT','SUN') THEN
	    CASE
	      WHEN INSERTING THEN
	        raise_application_error(-20001,
	          '不能在休息日执行INSERT');
	      WHEN UPDATING THEN
	        raise_application_error(-20002,
	          '不能在休息日执行UPDATE');
	      WHEN DELETING THEN
	        raise_application_error(-20003,
	          '不能在休息日执行DELETE');
	     END CASE;
	  END IF;
	END;
	/
21-4:建立before行触发器
	CREATE OR REPLACE TRIGGER tr_emp_sal
	BEFORE UPDATE OF sal ON emp
	FOR EACH ROW
	BEGIN
	  IF :new.sal<:old.sal THEN
	    raise_application_error(-20010,'工资只涨不降');
	  END IF;
	END;
	/
21-5:建立after行触发器
	CREATE TABLE audit_emp_change (
	  name VARCHAR2(10),oldsal NUMBER(6,2),
	  newsal NUMBER(6,2),time DATE);
	CREATE OR REPLACE TRIGGER tr_sal_change
	AFTER UPDATE OF sal ON emp
	FOR EACH ROW
	DECLARE
	  v_temp INT;
	BEGIN
	  SELECT count(*) INTO v_temp FROM audit_emp_change
	    WHERE name=:old.ename;
	  IF v_temp=0 THEN
	    INSERT INTO audit_emp_change
	      VALUES(:old.ename,:old.sal,:new.sal,SYSDATE);
	  ELSE
	    UPDATE audit_emp_change
	      SET oldsal=:old.sal,newsal=:new.sal,time=SYSDATE
	      WHERE name=:old.ename;
	  END IF;
	END;
	/
21-6:限制行触发器
	CREATE OR REPLACE TRIGGER tr_sal_change
	AFTER UPDATE OF sal ON emp
	FOR EACH ROW WHEN (old.job='SALESMAN')
	DECLARE
	  v_temp INT;
	BEGIN
	  SELECT count(*) INTO v_temp FROM audit_emp_change
	    WHERE name=:old.ename;
	  IF v_temp=0 THEN
	    INSERT INTO audit_emp_change
	       VALUES(:old.ename,:old.sal,:new.sal,SYSDATE);
	  ELSE
	    UPDATE audit_emp_change
	      SET oldsal=:old.sal,newsal=:new.sal,time=SYSDATE
	      WHERE name=:old.ename;
	  END IF;
	END;
	/
21-7:组合触发器
CREATE OR REPLACE TRIGGER tr_update_sal
FOR UPDATE OF sal ON emp COMPOUND TRIGGER
  msg1 VARCHAR2(50):='工资必须在1000到5000之间!';
  msg2 VARCHAR2(50):='不能在休息日更新!';
BEFORE STATEMENT IS
BEGIN
  IF to_char(sysdate,'DY','nls_date_language=AMERICAN')
     IN ('SAT','SUN') THEN
     raise_application_error(-20000,msg2);
  END IF;
END BEFORE STATEMENT;
AFTER EACH ROW IS
BEGIN
  IF :new.sal NOT BETWEEN 1000 AND 5000 THEN
     raise_application_error(-20001,msg1);
  END IF;
END AFTER EACH ROW;
END;
/

21-8:控制数据安全
	CREATE OR REPLACE TRIGGER tr_emp_time
	BEFORE INSERT OR UPDATE OR DELETE ON emp
	BEGIN
	  IF to_char(SYSDATE,'HH24') NOT BETWEEN
	     '9' AND '17' THEN
	    raise_application_error(-20101,'非工作时间');
	  END IF;
	END;
	/
	UPDATE emp SET sal=3200 WHERE empno=7788;
21-9:实现数据审计
	CREATE TABLE audit_delete_emp(name VARCHAR2(10),time DATE);
	CREATE OR REPLACE TRIGGER tr_delete_emp
	AFTER DELETE ON emp FOR EACH ROW
	BEGIN
	  INSERT INTO audit_delete_emp VALUES(:old.ename,SYSDATE);
	END;
	/
	DELETE FROM emp WHERE empno=7788;
	SELECT * FROM audit_delete_emp;
21-10:实现数据完整性
	CREATE OR REPLACE TRIGGER tr_check_sal
	BEFORE UPDATE OF sal ON emp FOR EACH ROW
	WHEN (new.sal<old.sal OR new.sal>1.2*old.sal)
	BEGIN
	  raise_application_error(-20931,
	    '工资只升不降,并且升幅不能超过20%');
	END;
	/
	UPDATE emp SET sal=sal*1.25 WHERE empno=7788;
21-11:实现参照完整性
	CREATE OR REPLACE TRIGGER tr_update_cascade
	AFTER UPDATE OF deptno ON dept FOR EACH ROW
	BEGIN
	  UPDATE emp SET deptno=:new.deptno
	    WHERE deptno=:old.deptno;
	END;
	/
	UPDATE dept SET deptno=50 WHERE deptno=10;
	SELECT ename FROM emp WHERE deptno=50;
21-12:instead of 触发器
	CREATE OR REPLACE VIEW dept_emp AS
	  SELECT a.deptno,a.dname,b.empno,b.ename FROM dept a,emp b
	  WHERE a.deptno=b.deptno;
	CREATE OR REPLACE TRIGGER tr_instead_of_dept_emp
	INSTEAD OF INSERT ON dept_emp FOR EACH ROW
	DECLARE
	  v_temp INT;
	BEGIN
	  SELECT count(*) INTO v_temp FROM dept WHERE deptno=:new.deptno;
	  IF v_temp=0 THEN
	     INSERT INTO dept (deptno,dname) VALUES(:new.deptno,:new.dname);
	   END IF;
	  SELECT count(*) INTO v_temp FROM emp WHERE empno=:new.empno;
	  IF v_temp=0 THEN
	     INSERT INTO emp (empno,ename,deptno) VALUES(:new.empno,:new.ename,:new.deptno);
	  END IF;
	END;
	/
	INSERT INTO dept_emp VALUES(50,'ADMIN',1223,'MARY');
	SELECT dname FROM dept WHERE deptno=50;
	SELECT ename FROM emp WHERE empno=1223;
21-13:系统事件触发器
	conn sys/oracle as sysdba
	create table event_table(event varchar2(30),time date);
	CREATE OR REPLACE TRIGGER tr_startup
	AFTER STARTUP ON DATABASE
	BEGIN
	  INSERT INTO event_table VALUES(ora_sysevent,SYSDATE);
	END;
	/
	SHUTDOWN
	STARTUP
	SELECT * FROM event_table;
21-14:建立登录触发器
	conn sys/oracle as sysdba
	CREATE TABLE aud_logon_tab(
	   username VARCHAR2(20),time DATE,addr VARCHAR2(20));
	CREATE OR REPLACE TRIGGER tr_logon
	AFTER LOGON ON DATABASE
	BEGIN
	  INSERT INTO aud_logon_tab VALUES(ora_login_user,SYSDATE,ora_client_ip_address);
	END;
	/
	conn scott/tiger@test
	SELECT * FROM sys.aud_logon_tab;
21-15:建立DDL触发器
	conn sys/oracle as sysdba
	CREATE TABLE aud_ddl_tab(
	   event VARCHAR2(20),username VARCHAR2(10),
	   owner VARCHAR2(10),objname VARCHAR2(20),
	  objtype VARCHAR2(10),time DATE);
	CREATE OR REPLACE TRIGGER tr_ddl
	AFTER DDL ON scott.schema
	BEGIN
	  INSERT INTO aud_ddl_tab VALUES(
	    ora_sysevent,ora_login_user,ora_dict_obj_owner,
	    ora_dict_obj_name,ora_dict_obj_type,SYSDATE);
	END;
	/
	conn scott/tiger@test
	CREATE TABLE temp(cola INT);
	DROP TABLE temp;
	SELECT username,event,objtype,objname FROM sys.aud_ddl_tab;
21-16:显示触发器信息
	set long 800
	set pagesize 400
	SELECT trigger_body FROM user_triggers WHERE trigger_name='TR_UPD_EMP';
21-17:禁止触发器
	ALTER TRIGGER tr_upd_emp DISABLE;
21-18:激活触发器
	ALTER TRIGGER tr_upd_emp ENABLE;
21-19:重新编译触发器
	ALTER TRIGGER tr_upd_emp COMPILE;
21-20:删除触发器
	DROP TRIGGER tr_check_sal;

























分享到:
评论

相关推荐

    sqlserver2005学习笔记之触发器简介.pdf

    SQL Server 2005中的触发器是一种特殊类型的存储过程,它会在执行特定的T-SQL语句(如INSERT、UPDATE、DELETE)时自动触发执行。触发器的主要作用在于增强数据的完整性和有效性,它们能完成比约束更复杂的数据验证,...

    sql server 2005学习笔记之触发器

    SQL Server 2005中的触发器是一种特殊类型的存储过程,它们在特定的T-SQL语句执行时自动触发,增强了数据库的逻辑控制能力。触发器主要分为两类:DML触发器和DDL触发器。 DML触发器是针对数据操纵语言(Data ...

    触发器学习笔记

    触发器学习笔记 触发器是一种特殊的存储过程,它可以在数据库中自动执行某些操作,以维护数据的一致性和安全性。下面是触发器的详细介绍: 触发器的定义 触发器是数据库系统中的一种机制,它可以在数据库中自动...

    FPGA时序学习之D触发器学习笔记

    本学习笔记将着重探讨D触发器的原理、特性以及在FPGA时序设计中的应用,特别是亚稳态问题及其解决方案。 首先,D触发器的工作原理是基于时钟信号的上升沿(或下降沿,取决于触发器的设计)来捕捉并存储输入数据D,...

    linux运维学习笔记:Mysql日志.pdf

    而row模式则记录了数据行的变更过程,适合于那些使用了存储函数和触发器的复杂复制场景,因为它记录了更详细的数据变化过程,保证了数据的一致性。 总结起来,MySQL日志是数据库维护中不可或缺的一部分,它们对...

    linux运维学习笔记:Mysql备份与恢复.pdf

    --triggers #备份触发器数据 -F #刷新 binlog 日志 --master-data=1|2 #告诉备份时刻的 binlog 位置 -x, --lock-all-tables #锁所有备份表 -l, --lock-tables #锁单表 mysqldump 参数使用详解: ①全库备份:...

    SQLSERVER学习笔记

    SQLSERVER学习笔记涵盖了数据库管理、配置、查询以及高级特性等多个方面。下面将详细解析这些知识点。 1. **端口检查**:SQL Server 默认使用1433端口,通过CMD中的`telnet`命令可以检查该端口是否被占用,如果无法...

    oracle学习笔记(从入门到精通)

    压缩包主要包括15个文档,主要是本人学习oracle过程中的笔记,希望对你有帮助:主要文档如下: 01-常用命令.txt 02-表空间建表.txt 03-基本查询语句学习笔记.txt ...12-触发器学习笔记.txt 13-pl编码.txt

    oralce学习笔记总结(包含存储过程触发器)

    本文件是本人学习oracle的一些总结资料,值得大家借鉴,可以互相交流

    oracle学习笔记

    ### Oracle学习笔记:触发器详解 #### 一、触发器概述 触发器是Oracle数据库中的一个强大特性,它能够在特定的数据库事件发生时自动执行预定义的SQL或PL/SQL语句。这些事件通常包括对表的数据进行插入、更新或删除...

    SQL 学习笔记 课堂讲义 , 游标,触发器,存储过程

    首先,我们来看"SQL学习笔记"中的"课堂讲义"部分。这部分内容通常会涵盖SQL的基本语法,如数据查询(SELECT语句)、数据插入(INSERT语句)、数据更新(UPDATE语句)和数据删除(DELETE语句)。除此之外,还会深入...

    Oracle 10g 学习笔记

    │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置listener.ora【避免出现ORA-12514错误】.txt │ 贴子树状态存储结构.jpg │ 贴子树状态存储结构.sql │ ├─01...

    Oracle学习笔记.pdf

    以下是对Oracle学习笔记中提到的一些关键知识点的详细解释: 1. **SQL执行顺序**: SQL语句的执行顺序是:`FROM` -&gt; `WHERE` -&gt; `SELECT` -&gt; `GROUP BY` -&gt; `HAVING` -&gt; `ORDER BY`。首先从`FROM`子句开始,确定...

    Oracle SQLServer数据库 学习笔记

    这篇学习笔记将深入探讨这两个系统的概念、特性和应用。 一、Oracle数据库系统 Oracle数据库是由甲骨文公司开发的一款强大、高性能的数据库解决方案。其主要特点包括: 1. **分布式数据库**:Oracle支持多节点的...

    zabbix学习笔记:zabbix监控之邮件报警

    在zabbix的使用中,最重要的一点就是完善的报警机制,作为监控平台,...报警涉及的触发器(trigger)一般包括以下几个方面:(1)服务器的基本状态:磁盘容量、内存大小、cpu的负载;(2)基础服务状态:web服务器

    PLSQL学习笔记(1-7)

    本学习笔记涵盖了从基础到进阶的PLSQL知识,旨在帮助读者全面理解和掌握这一强大的数据库编程工具。 1. **基础概念** - **PL/SQL块**:PLSQL程序的基本结构是块,包括声明部分、执行部分和异常处理部分。 - **...

    oracle 个人学习笔记

    以下是对Oracle数据库一些基础知识的详细解释,主要基于提供的个人学习笔记内容。 **第一节:数据库管理** 1. **创建用户**:`CREATE USER`命令用于创建新的数据库用户,如`CREATE USER username IDENTIFIED BY ...

    Microsoft SQL 数据库学习笔记

    【Microsoft SQL 数据库学习笔记】 在数据库领域,Microsoft SQL Server 是一种广泛使用的、关系型数据库管理系统,由微软公司开发和维护。SQL(Structured Query Language)是用于管理关系数据库的标准编程语言,...

Global site tag (gtag.js) - Google Analytics