数据库-- 触发器

触发器是特殊的存储过程,它的执行不由程序调用,也不是手动启动,而是由事件来触发,比如当对一个表进行操作(INSERT、UPDATE、DELETE等,不包括SEARCH)时就会被激活,从而执行。另外一个与存储过程不同的地方在于,存储过程更多的是为了返回数据,而触发器更多的作用是维护数据完整性。所以触发器经常用于加强数据的完整性约束和业务规则等。

触发器有三种常规的类型:DML触发器、DDL触发器和登陆触发器。

DDL触发器:当服务器或数据库中发生数据定义语言(DDL)事件时会调用DDL触发器。

登陆触发器:为响应LOGON事件而激发存储过程。

DML触发器:当数据库发生数据操作语言(DML)事件时调用DML触发器,DML事件包括在指定表或者视图中修改数据的INSERT语句、UPDATE语句或者是DELETE语句。DML触发器可以查询其他表,还可以包含复杂的语句。可以将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误,事务即回滚。

在触发器的应用中,我们通常会用到两张表:deleted表inserted表。它们存储于高速缓存中,针对当前触发器的局部表,与触发器所在表的结构相同。当触发DELETE触发器时,从受影响的表中删除的数据行的副本将被放置到deleted表中。同理,当触发INSERTED触发器时,inserted表中保存刚被插入的数据行的副本。

触发器可以嵌套执行,当一个触发器执行触发另一个触发器的执行时,是可以发生嵌套的。最多可嵌套32层。

DML触发器的主要优点在于:它们能在包含代码的复杂处理逻辑。DML触发器可以支持约束的所有功能,但是DML触发器给于给定功能并非是最好的方法。预编译,已优化,执行效率高,避免了SQL语句在网络传输然后再解释的低效率。可以重复使用,减少开发人员的工作量。业务逻辑封装性较好。安全,不会出现SQL语句注入问题。

实体完整性应该是在最低级别上通过索引进行强制,这些索引应是PRIMARY KEY和UNIQUE约束的一部分,或者是独立于约束而创建的。域完整性应通过CHECK约束进行强制,而引用完整性(RI)则应通过FOREING KEY约束进行强制。但是在约束支持的功能无法满足应用程序的功能要求时,DML触发器非常有用。

缺点:触发器占有较多的资源,对服务器的压力大。触发器排除困难,而且数据容易造成不一样,后期维护不方便。此外,触发器有一个较大的缺点在于:触发器是后置触发,总是在事情发生之后才执行补救措施。而存储过程中如果逻辑构造合理便可以避免这个问题。

DML触发器:可通过数据库中的相关表实现级联更改。DML触发器可以防止恶意或错误的操作,并强制执行比CHECK约束定义的限制更为复杂的其他限制。与CHECK约束不同的是,DML触发器可以引用其他表中的列。

DML触发器有三种类型:AFTER触发器(在执行完语句操作后之后执行,只能在表上指定)、INSTEAD OF触发器(执行INSTEAD OF触发器代替通常的触发动作,支持视图操作)、CLR触发器(CLR触发器可以是AFTER触发器或INSTEAD OF触发器。CLR触发器还是触发器,CLR触发器将执行在托管代码中编写的方法,而不用执行存储过程)。

AFTER触发器和INSTEAD OF触发器的区别:1、INSTEAD OF触发器代替执行DML语句的触发操作。还可以对视图触发。2、在执行语句操作之后执行AFTER触发器。我们多采用AFTER触发器。

创建DML触发器:

CREATE TRIGGER 触发器名

ON 表名 或 视图名

WITH ENCRYPTION  --    加密的选项

(FOR  |  AFTER  |  INSTEAD OF ){ [DELETE] [,] [INSERT] [,]  [UPDATE] }

AS

SQL 处理语言

示例:

示例:检测表插入数据时提醒

删除触发器: drop trigger 触发器名

触发器嵌套:

时间: 2024-08-10 15:09:19

数据库-- 触发器的相关文章

数据库触发器详讲

一:触发器的概念: 数据库触发器是一个与表相关联的,存储的plsql语句. 作用:每当一个特定的数据操作语句,(insert,update,delete)在指定的表发出时,Oracle自动地执行触发器中定义的语句序列 第一个触发器:每当成功插入新员工后   自动打印“插入新员工成功” create trigger 触发器名字(saynewemp) after (执行操作之后) insert on 操作的表(emp) declare begin dbms_output.put_line('成功插入

更新数据库触发器

//复制优惠券表解钩 Use HSHDBNew SELECT * INTO TempExistCoupon FROM DiscountActivityPager WHERE 1=2 --update触发器 Create TRIGGER tri_update   ON  DiscountActivityPager           AFTER update  as begin  if update(UDSateID) and (select top 1 UDSateID  from Discou

【赵强老师】利用数据库触发器实现数据的同步

一.什么是触发器 数据库触发器是一个与表相关联的,存储的PL/SQL 语句.每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列. 触发器的应用场景如下: 复杂的安全性检查 数据的确认 数据库审计 数据的备份和审计 二.创建Oracle触发器的语法 CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE

Oracle数据库——触发器的创建与应用

一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数据库后才能向该表中执行DML操作.(第1题中,user是系统函数,返回当前用户.字符串中使用两个单引号表示一个单引号.) 要求:分别以system用户和scott用户对emp 表执行DML操作,试验触发器的运行效果. (1)在scott用户下创建触发器 语句: create or replace t

数据库触发器

触发器的作用 [1] 触发器有如下作用: 可在写入数据表前,强制检验或转换数据. 触发器发生错误时,异动的结果会被撤销. 部份数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器. 可依照特定的情况,替换异动的指令 (INSTEAD OF). 2分类 [2] SQL Server 包括三种常规类型的触发器:DML 触发器.DDL 触发器和登录触发器. DML触发器 当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的D

数据库触发器 、包

触发器是特定事件出现的时候,自动执行的代码块.类似于存储过程,但是用户不能直接调用他们. 功能: 1 . 允许 / 限制对表的修改 2 . 自动生成派生列,比如自增字段 3 . 强制数据一致性 4 . 提供审计和日志记录 5 . 防止无效的事务处理 6 . 启用复杂的业务逻辑 开始 : create trigger biufer_employees_department_id   before insert or update   of department_id   on employees

数据库触发器简介与实例

触发器 其是一种特殊的存储过程.一般的存储过程是通过存储过程名直接调用,而触发器主要是 通过事件(增.删.改)进行触发而被执行的.其在表中数据发生变化时自动强制执行. 常见的触发器有两种:after(for).instead of,用于insert.update.delete事件. after(for)        表示执行代码后,执行触发器 instead of        表示执行代码前,用已经写好的触发器代替你的操作 触发器语法: create trigger 触发器的名字   on

mysql数据库 触发器简单实例

触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete) 语法: create trigger triggerName after/before insert/update/delete on 表名 for each row   #这句话在mysql是固定的 begin sql语句; end

数据库——触发器(转)

触发器 其是一种特殊的存储过程.一般的存储过程是通过存储过程名直接调用,而触发器主要是 通过事件(增.删.改)进行触发而被执行的.其在表中数据发生变化时自动强制执行. 常见的触发器有两种:after(for).instead of,用于insert.update.delete事件. after(for)        表示执行代码后,执行触发器 instead of        表示执行代码前,用已经写好的触发器代替你的操作 触发器语法: create trigger 触发器的名字   on