请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

猿媛之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 6161|回复: 0

数据库-触发器

[复制链接]

44

主题

48

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2016-1-10 23:01:55 | 显示全部楼层 |阅读模式
        触发器是一种特殊类型的存储过程,它由事件触发,而不是程序调用或手工启动,当数据库有特殊的操作时,对这些操作由数据库中的事件来触发,自动完成这些SQL语句。使用触发器可以用来保证数据的有效性和完整性,完成比约束更复杂的数据约束。
        具体而言,触发器与存储过程的区别如下表所示。
  
触发器
  
  
存储过程
  
  
当某类数据操纵DML语句发生时隐式地调用
  
  
从一个应用或过程中显式地调用
  
  
在触发器体内禁止使用COMMITROLLBACK语句
  
  
在过程体内可以使用所有PL/SQL
  
块中都能使用的SQL语句,包括COMMITROLLBACK
  
  
不能接受参数输入
  
  
可以接受参数输入
  
        根据SQL语句的不同,触发器可分为两类:DML触发器和DLL触发器。
        DML触发器是当数据库服务器发生数据操作语言事件时执行的存储过程,有After和InsteadOf这两种触发器。After触发器被激活触发是在记录改变之后进行的一种触发器。InsteadOf触发器是在记录变更之前,去执行触发器本身所定义的操作,而不是执行原来SQL语句里的操作。DLL触发器是在响应数据定义语言事件时执行的存储过程。
        具体而言,触发器的主要作用表现为如下几个方面的内容:
(1)      增加安全性。
(2)      利用触发器记录所进行的修改以及相关信息,跟踪用户对数据库的操作,实现审计。
(3)      维护那些通过创建表时的声明约束不可能实现的复杂的完整性约束以及对数据库中特定事件进行监控与响应。
(4)      实现复杂的非标准的数据库相关完整性规则、同步实时地复制表中的数据。
(5)      触发器是自动的,它们在对表的数据做了任何修改之后就会被激活,例如可以自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。以某企业财务管理为例,如果企业的资金链出现短缺,并且达到某种程度时,则发送警告信息。
        下面是一个触发器的例子,该触发器的功能是在每周末进行数据表更新,如果当前用户没有访问WEEKEND_UPDATE_OK表的权限,需要重新赋予权限。
  
CREATE OR REPLACE TRIGGER update_on_weekends_check
  
BEFORE UPDATE OF sal ON EMP
  
FOR EACH ROW
  
DECLARE
  
my_count number(4);
  
BEGIN
  
SELECT COUNT(u_name)
  
FROM WEEKEND_UPDATE_OK INTO my_count
  
WHERE u_name = user_name;
  
IF my_count=0 THEN
  
RAISE_APPLICATION_ERROR(20508, 'Update not  allowed');
  
END IF;
  
END;
  
        引申:触发器分为事前触发和事后触发,二者有什么区别?语句级触发和行级触发有什么区别?
        事前触发发生在事件发生之前验证一些条件或进行有一些准备工作;事后触发发生在事件发生之后,做收尾工作,保证事务的完整性。而事前触发可以获得之前和新的字段值。语句级触发器可以在语句执行之前或之后执行,而行级出发在触发器所影响的每一行触发一次。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|猿媛之家    

GMT+8, 2021-10-25 09:55 , Processed in 0.181826 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表