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;
分享到:
相关推荐
SQL Server 2005中的触发器是一种特殊类型的存储过程,它会在执行特定的T-SQL语句(如INSERT、UPDATE、DELETE)时自动触发执行。触发器的主要作用在于增强数据的完整性和有效性,它们能完成比约束更复杂的数据验证,...
SQL Server 2005中的触发器是一种特殊类型的存储过程,它们在特定的T-SQL语句执行时自动触发,增强了数据库的逻辑控制能力。触发器主要分为两类:DML触发器和DDL触发器。 DML触发器是针对数据操纵语言(Data ...
触发器学习笔记 触发器是一种特殊的存储过程,它可以在数据库中自动执行某些操作,以维护数据的一致性和安全性。下面是触发器的详细介绍: 触发器的定义 触发器是数据库系统中的一种机制,它可以在数据库中自动...
本学习笔记将着重探讨D触发器的原理、特性以及在FPGA时序设计中的应用,特别是亚稳态问题及其解决方案。 首先,D触发器的工作原理是基于时钟信号的上升沿(或下降沿,取决于触发器的设计)来捕捉并存储输入数据D,...
而row模式则记录了数据行的变更过程,适合于那些使用了存储函数和触发器的复杂复制场景,因为它记录了更详细的数据变化过程,保证了数据的一致性。 总结起来,MySQL日志是数据库维护中不可或缺的一部分,它们对...
--triggers #备份触发器数据 -F #刷新 binlog 日志 --master-data=1|2 #告诉备份时刻的 binlog 位置 -x, --lock-all-tables #锁所有备份表 -l, --lock-tables #锁单表 mysqldump 参数使用详解: ①全库备份:...
SQLSERVER学习笔记涵盖了数据库管理、配置、查询以及高级特性等多个方面。下面将详细解析这些知识点。 1. **端口检查**:SQL Server 默认使用1433端口,通过CMD中的`telnet`命令可以检查该端口是否被占用,如果无法...
压缩包主要包括15个文档,主要是本人学习oracle过程中的笔记,希望对你有帮助:主要文档如下: 01-常用命令.txt 02-表空间建表.txt 03-基本查询语句学习笔记.txt ...12-触发器学习笔记.txt 13-pl编码.txt
本文件是本人学习oracle的一些总结资料,值得大家借鉴,可以互相交流
### Oracle学习笔记:触发器详解 #### 一、触发器概述 触发器是Oracle数据库中的一个强大特性,它能够在特定的数据库事件发生时自动执行预定义的SQL或PL/SQL语句。这些事件通常包括对表的数据进行插入、更新或删除...
首先,我们来看"SQL学习笔记"中的"课堂讲义"部分。这部分内容通常会涵盖SQL的基本语法,如数据查询(SELECT语句)、数据插入(INSERT语句)、数据更新(UPDATE语句)和数据删除(DELETE语句)。除此之外,还会深入...
│ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置listener.ora【避免出现ORA-12514错误】.txt │ 贴子树状态存储结构.jpg │ 贴子树状态存储结构.sql │ ├─01...
以下是对Oracle学习笔记中提到的一些关键知识点的详细解释: 1. **SQL执行顺序**: SQL语句的执行顺序是:`FROM` -> `WHERE` -> `SELECT` -> `GROUP BY` -> `HAVING` -> `ORDER BY`。首先从`FROM`子句开始,确定...
这篇学习笔记将深入探讨这两个系统的概念、特性和应用。 一、Oracle数据库系统 Oracle数据库是由甲骨文公司开发的一款强大、高性能的数据库解决方案。其主要特点包括: 1. **分布式数据库**:Oracle支持多节点的...
在zabbix的使用中,最重要的一点就是完善的报警机制,作为监控平台,...报警涉及的触发器(trigger)一般包括以下几个方面:(1)服务器的基本状态:磁盘容量、内存大小、cpu的负载;(2)基础服务状态:web服务器
本学习笔记涵盖了从基础到进阶的PLSQL知识,旨在帮助读者全面理解和掌握这一强大的数据库编程工具。 1. **基础概念** - **PL/SQL块**:PLSQL程序的基本结构是块,包括声明部分、执行部分和异常处理部分。 - **...
以下是对Oracle数据库一些基础知识的详细解释,主要基于提供的个人学习笔记内容。 **第一节:数据库管理** 1. **创建用户**:`CREATE USER`命令用于创建新的数据库用户,如`CREATE USER username IDENTIFIED BY ...
【Microsoft SQL 数据库学习笔记】 在数据库领域,Microsoft SQL Server 是一种广泛使用的、关系型数据库管理系统,由微软公司开发和维护。SQL(Structured Query Language)是用于管理关系数据库的标准编程语言,...