Oracle入门(十四.22)之创建DDL和数据库事件触发器

一、什么是DDL和数据库事件触发器?

DDL语句触发DDL触发器:CREATE,ALTER或DROP。
数据库事件触发器由数据库中的非SQL事件触发,例如:
•用户连接到数据库或与数据库断开连接。
•DBA启动或关闭数据库。

•用户会话中引发了特定的异常。

(1)在DDL语句中创建触发器语法

•ON DATABASE在数据库中的所有模式上触发DDL

•ON SCHEMA仅针对您自己的模式中的对象触发DDL

CREATE [OR REPLACE] TRIGGER trigger_name
Timing
[ddl_event1 [OR ddl_event2 OR ...]]
ON {DATABASE|SCHEMA}
trigger_body

(2)DDL触发器的示例

每次在模式中创建新的数据库对象时,都希望写入日志记录:

CREATE OR REPLACE TRIGGER log_create_trigg
AFTER CREATE ON SCHEMA
BEGININSERT INTO log_tableVALUES (USER, SYSDATE);
END;
只要有任何(类型)的对象被创建,触发器就会触发。 您不能创建引用特定数据库对象的DDL触发器。

(3)DDL触发器的第二个例子

防止从模式中删除任何对象。

CREATE OR REPLACE TRIGGER prevent_drop_trigg
BEFORE DROP ON SCHEMA
BEGINRAISE_APPLICATION_ERROR (-20203, 'Attempted drop – failed');
END;

只要有任何(类型)的对象被删除,触发器就会触发。 同样,您不能创建引用特定数据库对象的DDL触发器。

(4)在数据库事件语法上创建触发器

•ON DATABASE触发数据库中所有会话的事件触发器。
•ON SCHEMA仅为您自己的会话触发触发器。
CREATE [OR REPLACE] TRIGGER trigger_name
timing
[database_event1 [OR database_event2 OR ...]]
ON {DATABASE|SCHEMA}
trigger_body


二、LOGON、LOGOFF和SERVERERROR

示例1:LOGON和LOGOFF触发器

CREATE OR REPLACE TRIGGER logon_trig
AFTER LOGON ON SCHEMA
BEGIN
INSERT INTO log_trig_table(user_id,log_date,action)VALUES (USER, SYSDATE, 'Logging on');
END;

CREATE OR REPLACE TRIGGER logoff_trig
BEFORE LOGOFF ON SCHEMA
BEGIN
INSERT INTO log_trig_table(user_id,log_date,action)VALUES (USER, SYSDATE, 'Logging off');
END;

示例2:SERVERERROR触发器
想保留会话中发生的任何ORA-00942错误的日志:

CREATE OR REPLACE TRIGGER servererror_trig
AFTER SERVERERROR ON SCHEMA
BEGIN
IF (IS_SERVERERROR (942)) THENINSERT INTO error_log_table ...
END IF;
END;


三、触发器中的CALL语句

没有结束;语句,并且在CALL语句结尾处没有分号。

语法:

CREATE [OR REPLACE] TRIGGER trigger_name
timing
event1 [OR event2 OR event3]
ON table_name
[REFERENCING OLD AS old | NEW AS new]
[FOR EACH ROW]
[WHEN condition]
CALL procedure_name

例子:

CREATE OR REPLACE TRIGGER log_employee
BEFORE INSERT ON EMPLOYEESCALL log_execution


四、突变表和行触发器

    突变表是一个当前正在由DML语句修改的表。

    行触发器不能从变异表中选择,因为它会看到不一致的数据集(当触发器尝试读取数据时,表中的数据将会改变)。 但是,如果需要,行触发器可以从不同的表中进行选择。

此限制不适用于DML语句触发器,仅适用于DML行触发器。

突变表:例子

CREATE OR REPLACE TRIGGER check_salaryBEFORE INSERT OR UPDATE OF salary, job_id ON employeesFOR EACH ROW
DECLAREv_minsalary employees.salary%TYPE;v_maxsalary employees.salary%TYPE;
BEGINSELECT MIN(salary), MAX(salary)INTO v_minsalary, v_maxsalaryFROM employeesWHERE job_id = :NEW.job_id;IF :NEW.salary < v_minsalary OR:NEW.salary > v_maxsalary THENRAISE_APPLICATION_ERROR(-20505,'Out of range');END IF;
END;
UPDATE employees
SET salary = 3400
WHERE last_name = 'Davies';
出错:
ORA-04091: table USVA_TEST_SQL01_T01_EMPLOYEES is mutating,
trigger/function may not
see it
ORA-06512: at “USVA_TEST_SQL01_T01.CHECK_SALARY”, line 5
ORA-04088: error during execution of trigger
‘USVA_TEST_SQL01_T01.CHECK_SALARY’
3. WHERE last_name – ‘Davies’;


五、触发器的更多可能用途

    不应该创建触发器来执行某些可以通过其他方式轻松完成的操作,例如通过检查约束或适当的对象权限。 但是有时你必须创建一个触发器,因为没有其他方法可以做需要的事情。
    以下示例只显示了必须创建触发器的三种情况。 还有更多!

(1)第一个例子

数据库安全性(谁可以做什么)通常由系统和对象权限控制。 例如,用户SCOTT需要更新EMPLOYEES行:

GRANT UPDATE ON employees TO scott;

但是,SCOTT被允许这样做时,单凭权限无法控制。 为此,我们需要一个触发器:

CREATE OR REPLACE TRIGGER weekdays_empBEFORE UPDATE ON employees
BEGIN
IF (TO_CHAR (SYSDATE, 'DY') IN ('SAT','SUN')) THENRAISE_APPLICATION_ERROR(-20506,'You may only change data during normal business hours.');
END IF;
END;

(2)第二个例子

数据库完整性(允许DML)通常由约束条件控制。 例如,每个员工的工资必须至少为500美元:

ALTER TABLE employees ADD CONSTRAINT ck_salary CHECK (salary >= 500);

如果一条业务规则指出员工的薪水可以提高但不降低,这个限制并不能阻止员工的薪水从700美元降低到600美元。 为此,我们需要一个行触发器。此代码显示在下一张幻灯片中。

现在我们不再需要约束了。

CREATE OR REPLACE TRIGGER check_salaryBEFORE UPDATE OF salary ON employeesFOR EACH ROWWHEN (NEW.salary < OLD.salaryOR NEW.salary < 500)
BEGINRAISE_APPLICATION_ERROR (-20508,'Do not decrease salary.');
END;

(3)第三个例子

您需要创建一个显示部门总工资单的报表。 你可以声明和使用这个游标:

...
CURSOR tot_sals ISSELECT SUM(salary)FROM employeesWHERE department_id = p_dept_id;
...
但是,如果在一个大型组织中,该部门有10,000名员工呢? 从EMPLOYEES表中抽取10,000行可能太慢。 下面展示了一个更快的方法来做到这一点。

首先,我们在DEPARTMENTS表中添加一个新列以存储每个部门的总工资单:

ALTER TABLE DEPARTMENTS ADD (total_salary NUMBER(12,2));

接下来,只填写当前总工资单的这一栏:

UPDATE departments dSET total_salary = (SELECT SUM(salary) FROM employeesWHERE department_id = d.department_id);

现在,我们必须在更改工资时保持这一新列。 这是通过使用DML行触发器完成的。

CREATE OR REPLACE PROCEDURE increment_salary(p_id IN NUMBER, p_new_sal IN NUMBER) IS
BEGINUPDATE departmentsSET total_salary = total_salary + NVL(p_new_sal,0)WHERE department_id = p_id;
END increment_salary;
CREATE OR REPLACE TRIGGER compute_salary
AFTER INSERT OR UPDATE OF salary OR DELETE
ON employees FOR EACH ROW
BEGIN
IF DELETING THEN increment_salary(:OLD.department_id,(:OLD.salary * -1));
ELSIF UPDATING THEN increment_salary(:NEW.department_id,(:NEW.salary - :OLD.salary));
ELSE increment_salary(:NEW.department_id,:NEW.salary);
END IF;
END;



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio上开发Python?你不可不知道的六大功能!

Visual Studio 2013/2015 搭配 Python Tools for Visual Studio 扩充套件让 Visual Studio 能提供对 Python 程序语言高度整合的开发环境&#xff0c;并完整发挥 Visual Studio 强大的功能&#xff0c;协助您在 Visual Studio 内开发 Python 程序上如虎添翼&#xff0c;提升开发…

qt中sendevent_Qt中postEvent和sendEvent函数

Qt中postEvent和sendEvent函数部分内容参考http://blog.csdn.net/lvmengzou/article/details/65450908qt事件循环需要维护一个事件队列&#xff0c;在Qt的main函数中最后一般调用QApplication::exec()成员函数来保持程序对事件队列的处理&#xff0c;exec()的实质是不停调用pro…

IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目

看到本篇的题目&#xff0c;大家可能感到有点奇怪&#xff01;下面&#xff0c;我们就来看看这到底是什么意思。 大家可能遇到过这样的一种情况&#xff1a;希望根据某些请求用户的特性&#xff0c;将用户的请求导向不同的站点&#xff08;请大家这里区分“亲缘性”的概念&…

Oracle入门(十四.23)之管理触发器

一、触发器需要特权要在模式中创建触发器&#xff0c;需要&#xff1a; •CREATE TRIGGER系统特权 •触发器主体中引用的其他架构中的对象的普通对象特权&#xff08;SELECT&#xff0c;UPDATE&#xff0c;EXECUTE等&#xff09; •与触发器关联的表或视图上的ALTER特权。触发器…

为什么哲学是最难的学科_什么是哲学哲学对大师来说可能非常理论化,没有一定哲学基础肯能很难 爱问知识人...

我的总结是科学哲学是从哲学角度考察科学的一门学科。它以科学活动和科学理论为研究对象&#xff0c;探讨科学的本质、科学知识的获得和检验、科学的逻辑结构等有关科学认识论和科学方法论的基本问题。哲学是什么&#xff1f;这是一个问题&#xff0c;一个既简单又复杂的问题。…

8.es更新文档通过版本号实现并发控制

【README】 1.本文介绍了es更新文档时的并发控制策略&#xff1b;2.通过版本号实现并发控制&#xff08;类似于mysql中基于版本号的乐观锁&#xff09;&#xff1b;3.Es为支持并发控制&#xff0c;为每篇文章设置了版本号_version。初始值为1&#xff0c;每更新1次加1。…

Oracle入门(十五)之数据库锁

一、锁的概念 锁是数据库用来控制共享资源并发访问的机制。锁用于保护正在被修改的数据直到提交或回滚了事务之后&#xff0c;其他用户才可以更新数据二、锁定的优点 一致性 - 一次只允许一个用户修改数据完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存&a…

.NET 和 Mono 的一点历史

提到微软公司研发 .NET Framework 的初衷&#xff0c;难免要提到 SUN 公司1995年推出的 Java 语言。由于 Java 在业界得到了广泛的支持而且迅速建立了庞大的生态系统&#xff0c;微软也不得不考虑如何加以应对&#xff0c;毕竟自己手里的 Visual Basic 和 Visual C 和 Java 一比…

lisp 角平分线_证明冯奥贝尔定理的3种方法

怎样证明冯奥贝尔定理&#xff1f;Von.Aubel定理: 以任意四边形ABCD的边为斜边作四个转向相同的等腰直角三角形ΔABE&#xff0c;ΔBCF&#xff0c;ΔCDG&#xff0c;ΔDAH。则:EGFH&#xff0c;EG⊥FH。关于上述定理的几点说明:(1)&#xff0c;条件是任意四边形&#xff0c;所…

java迭代实现二叉树先中后序遍历(非递归)

【README】 本文复习了通过java迭代实现 二叉树先序&#xff0c;中序&#xff0c;后序遍历&#xff1b; 本文引入了 栈&#xff0c;替换了递归&#xff0c;对二叉树进行遍历&#xff1b; 补充&#xff1a;使用递归遍历二叉树缺点&#xff1a; 众所周知&#xff0c;每次递归…

漫画:什么是分布式锁

转载自 漫画&#xff1a;什么是分布式锁分布式锁的实现有哪些&#xff1f;1.Memcached分布式锁利用Memcached的add命令。此命令是原子性操作&#xff0c;只有在key不存在的情况下&#xff0c;才能add成功&#xff0c;也就意味着线程得到了锁。2.Redis分布式锁和Memcached的方式…

程序员求职面试三部曲之一:选择合适的工作单位

前不久在知乎上看到一个话题&#xff0c;大概是说中国比国外好的有哪些方面&#xff0c;网友们例举了一大堆&#xff0c;其中有一条是说“在中国找工作比较容易”。 是的&#xff0c;特别对于我们IT从业者来说&#xff0c;找工作真的是小菜一碟&#xff1b;只要肯在网络上公开简…

处理api返回的数据_API 乐队指挥家,网关服务正式上线

随着知晓云小伙伴们业务的发展&#xff0c;对我们服务的支持又有了新的要求&#xff0c;比如在对接第三方服务时&#xff0c;需要自定义数据结构等。为此&#xff0c;经过 32 次的需求讨论会以及工程师们的紧张开发后&#xff0c;知晓云 API 网关诞生了。你可以通过可视化界面配…

数据结构排序总结

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析个人的学习心得体会&#xff0c;源代码均为原创&#xff1b; 0.2&#xff09; 本文列出了数据结构中基本上所有的数据结构排序算法&#xff0c; 整理了相关的博文&#xff08;源代码&#xff09;&#xff1b; 0.3…

IIS负载均衡-Application Request Route详解第六篇:使用失败请求跟踪规则来诊断ARR

失败请求跟踪规则&#xff08;FailedRequest Tracing Rules&#xff09;是IIS7中对请求处理进行诊断的强大的工具。我们本篇文章将会带领大家一步步的来配置失败请求跟踪规则&#xff0c;并且告诉大家如何使用这些信息来诊断ARR。 要真正的理解本篇文章要讲述的知识&#xff0c…

减一天 日期函数_一文掌握excel中的日期函数

在excel中&#xff0c;因为日期的特殊性&#xff0c;大部分关于日期的运算都要用到特有的函数。对于大多数小伙伴们可能没有专门去学习过日期函数都有哪些&#xff1f;如何运用&#xff1f;可以实现什么样的功能&#xff1f;今天小编就为大家整理出来并详细介绍一下常用的日期函…

软件开发的微信公众号分享

一、已阅 &#xff08;1&#xff09;程序员面试&#xff08;mvpjob&#xff09;&#xff08;2&#xff09;程序员小灰&#xff08;chengxuyuanxiaohui&#xff09;&#xff08;3&#xff09;Hollis&#xff08;hollischuang&#xff09;&#xff08;4&#xff09;Java技术栈&am…

算法递归简论

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c;旨在了解设计 递归程序 的相关法则和技巧&#xff1b; 0.2&#xff09; 我记忆尤新的一点是&#xff1a; 凡事可以用循环代替的递归函数&#xff0c;它就不是一个好的递归函数&#xff0c;对我帮助很大…

python三维矩阵可视化_科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数)...

Mlab了解Mlab是Mayavi提供的面向脚本的api&#xff0c;他可以实现快速的三维可视化&#xff0c;Mayavi可以通过Mlab的绘图函数对Numpy数组建立可视化。过程为&#xff1a;.建立数据源.使用Filter(可选)对数据进行加工.添加可视化模块&#xff0c;我们可以通过修改可视化模块的属…

程序员求职面试三部曲之二:提高面试的成功率

一、选择有招聘诚意的企业 一则好的招聘信息应该是准确、清晰和真实的。任何夸大宣传、提供虚假信息的企业都可以认为缺乏招聘诚意。 我们通过解读企业的招聘信息&#xff0c;主观上能够判断这家企业是否很有招聘诚意&#xff0c;我觉得主要体现为以下两个方面&#xff1a; 1.、…