`
zhaolicric
  • 浏览: 145895 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论
阅读更多

触发器是一种特殊的存储过程,在使用触发器之前可以与存储过程进行比较,触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用。

触发器主要优点如下:

触发器是自动的:当对表中的数据作了任何修改之后立即被激活,触发器与数据库中的表紧密相关,比如当对表执行INSERT、UPDATE或DELETE操作时,触发器就会自动执行。

触发器可以对数据库中的表进行嵌套的触发,一个触发器执行启动另一个触发器的操作,这样的嵌套可以达到32层。

触发器可以强制限制,可以防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比CHECK约束定义的限制更为复杂的其他限制,虽CHECK约束已经在表定义的时候建立好了,但触发器可以实现很多其它的约束限制,在约束所支持的功能无法满足应用程序的功能要求时,触发器的优点就会体现。

在SQL Server中,已经包括两大类触发器:DML 触发器和 DDL 触发器。 DDL触发器为SQL Server 2005中新增的。

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

DDL 触发器是一种特殊的触发器,它在响应数据定义语言 (DDL) 语句时触发。它们可以用于在数据库中执行管理任务,例如,审核以及规范数据库操作。像常规触发器一样,DDL 触发器将激发存储过程以响应事件。但与 DML 触发器不同的是,它们不会为响应针对表或视图的 UPDATE、INSERT 或 DELETE 语句而激发。相反,它们会为响应多种数据定义语言 (DDL) 语句而激发。这些语句主要是以 CREATE、ALTER 和 DROP 开头的语句。DDL 触发器可用于管理任务,例如审核和控制数据库操作。

insert  触发器

--当person表 新增 一条person记录时 
--将 该记录的主键personName 保存在changeTable表中
USE TestDB
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'personInsert' AND type = 'TR')
   DROP TRIGGER personInsert
GO
CREATE TRIGGER personInsert
ON person
FOR INSERT
AS

   INSERT INTO TestDB.dbo.changeTable
  (changeTableName, changeType, changeTablePK, changeTablePKValue)
  SELECT 'person','INSERT','personName',personName FROM INSERTED
GO

 delete 触发器

--当person表 删除 一条person记录时 
--将 该记录的主键personName 保存在changeTable表中

USE TestDB
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'personDelete' AND type = 'TR')
   DROP TRIGGER personDelete
GO
CREATE TRIGGER personUpdate
ON person
FOR DELETE
AS

   INSERT INTO TestDB.dbo.changeTable
  (changeTableName, changeType, changeTablePK, changeTablePKValue)
  SELECT 'person','DELETE','personName',personName FROM DELETED
GO


 update 触发器

--当person表 修改 一条person记录时 
--将 该记录的主键personName 保存在changeTable表中

USE TestDB
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'personUpdate' AND type = 'TR')
   DROP TRIGGER personUpdate
GO
CREATE TRIGGER personUpdate
ON person
FOR UPDATE
AS

   INSERT INTO TestDB.dbo.changeTable
  (changeTableName, changeType, changeTablePK, changeTablePKValue)
  SELECT 'person','UPDATE','personName',personName FROM INSERTED
GO

 oracle中触发器的写法

触发器代码类似存储过程,以PL/SQL脚本编写。下面是一个触发器的示例:

新建员工工资表salary

create table SALARY
(
  EMPLOYEE_ID NUMBER, --员工ID
 MONTH       VARCHAR2(6), --工资月份
 AMOUNT      NUMBER --工资金额
)

创建与salary关联的触发器salary_trg_rai

1   Create or replace trigger salary_trg_rai

2   After insert on salary

3   For each row

4     declare

5   Begin

6     Dbms_output.put_line(‘员工ID:’ || :new.employee_id);

7     Dbms_output.put_line(‘工资月份:’ || :new.month);

8     Dbms_output.put_line(‘工资:’ || :new.amount);

9     Dbms_output.put_line(‘触发器已被执行’);

10   End;

打开一个SQL Window窗口(使用PL/SQL Developer工具),或在sqlplus中输入:

Insert into salary(employee_id, month, amount) values(1, ‘200606’, 10000);

执行后可以在sqlplus中,或在SQL Window窗口的Output中见到

员工ID:1

工资月份:200606

工资:10000

触发器已执行

 在代码的第一行,定义了数据库对象的类型是trigger,定义触发器的名称是salary_trg_rai
第二行说明了这是一个after触发器,在DML操作实施之后执行。紧接着的insert说明了这是一个针对insert操作的触发器,每个对该表进行的insert操作都会执行这个触发器。

第三行说明了这是一个针对行级的触发器,当插入的记录有n条时,在每一条插入操作时都会执行该触发器,总共执行n次。

Declare后面跟的是本地变量定义部分,如果没有本地变量定义,此部分可以为空

Begin和end括起来的代码,是触发器的执行部分,一般会对插入记录进行一致性检查,在本例中打印了插入的记录和“触发器已执行”。

其中:new对象表示了插入的记录,可以通过:new.column_name来引用记录的每个字段值

oracle中的语法

CREATE OR REPLACE TRIGGER trigger_name

<before | after | instead of> <insert | update | delete> ON table_name

[FOR EACH ROW]

WHEN (condition)

DECLARE

BEGIN

       --触发器代码

END;

 

Trigger_name是触发器的名称。<before | after | instead of>可以选择before或者afterinstead ofBefore表示在DML语句实施前执行触发器,而after表示在在dml语句实施之后执行触发器,instead of触发器用在对视图的更新上。<insert | update | delete>可以选择一个或多个DML语句,如果选择多个,则用or分开,如:insert or updateTable_name是触发器关联的表名。

[FOR EACH ROW]为可选项,如果注明了FOR EACH ROW,则说明了该触发器是一个行级的触发器,DML语句处理每条记录都会执行触发器;否则是一个语句级的触发器,每个DML语句触发一次。

WHEN后跟的condition是触发器的响应条件,只对行级触发器有效,当操作的记录满足condition时,触发器才被执行,否则不执行。Condition中可以通过new对象和old对象(注意区别于前面的:new:old,在代码中引用需要加上冒号)来引用操作的记录。

 

触发器代码可以包括三种类型:未涉及数据库事务代码,涉及关联表(上文语法中的table_name)数据库事务代码,涉及除关联表之外数据库事务代码。其中第一种类型代码只对数据进行简单运算和判断,没有DML语句,这种类型代码可以在所有的触发器中执行。第二种类型代码涉及到对关联表的数据操作,比如查询关联表的总记录数或者往关联表中插入一条记录,该类型代码只能在语句级触发器中使用,如果在行级触发器中使用,将会报ORA-04091错误。第三种类型代码涉及到除关联表之外的数据库事务,这种代码可以在所有触发器中使用。

从触发器的功能上来看,可以分成3类:

l         重写列(仅限于before触发器)

l         采取行动(任何触发器)

l         拒绝事务(任何触发器)

“重写列”用于对表字段的校验,当插入值为空或者插入值不符合要求,则触发器用缺省值或另外的值代替,在多数情况下与字段的default属性相同。这种功能只能在行级before触发器中执行。“采取行动”针对当前事务的特点,对相关表进行操作,比如根据当前表插入的记录更新其他表,银行中的总帐和分户帐间的总分关系就可以通过这种触发器功能来维护。“拒绝事务”用在对数据的合法性检验上,当更新的数据不满足表或系统的一致性要求,则通过抛出异常的方式拒绝事务,在其上层的代码可以捕获这个异常并进行相应操作。

分享到:
评论

相关推荐

    Multisim仿真实验三 触发器_触发器_multisimd触发器_serviceq66_T触发器仿真_double34t_源

    本实验的主题围绕着“Multisim仿真实验三 触发器”,主要关注触发器的逻辑功能、触发器之间的转换以及如何利用JK触发器构建双向时钟脉冲电路。下面我们将详细探讨这些知识点。 首先,触发器是数字电路中的基本存储...

    mysql触发器之创建多个触发器操作实例分析

    本文实例讲述了mysql触发器之创建多个触发器操作。分享给大家供大家参考,具体如下: 这次记录的内容mysql 版本必须得是5.7.2+的哈,之前的会不好使的。废话不多说,咱们开始正文哈。 在mysql 5.7.2+版本之前,我们...

    RS触发器与SR触发器区别有哪些

    RS触发器和SR触发器是数字电路中常见的基本逻辑门,它们都是利用电子开关实现的信号存储电路,但它们之间存在一些基本的差异。理解这两者的区别,对于学习数字逻辑电路设计和分析是非常重要的。 RS触发器,全称为...

    触发器触发器触发器触发器

    在"触发器9.18触发器9.18触发器9.18触发器触发器9.18触发器9.18触发器9.18触发器"这个描述中,可能是在强调某个特定的事件或者场景,例如9月18日的数据库维护或者某个特定的触发器测试。 在大多数关系型数据库系统...

    mysql触发器之触发器的增删改查操作示例

    MySQL触发器是数据库管理系统提供的一种机制,用于在特定的数据操作(如INSERT、UPDATE、DELETE)发生之前或之后自动执行预定义的SQL语句。这些触发器可以用来实现复杂的业务规则,确保数据的一致性和完整性,或者...

    jk触发器波形图怎么画?主从jk触发器波形图

    JK触发器是一种广泛应用于数字电路设计中的基本单元,具有较强的通用性和稳定性。JK触发器的波形图绘制是理解其工作原理的关键步骤,尤其是在分析主从JK触发器的行为时。主从JK触发器由两个独立的JK触发器组成,一个...

    触发器与逻辑电路介绍

    在数字电路领域,触发器和逻辑电路是构建复杂数字系统的基础。触发器,特别是RS触发器和门控触发器,是时序逻辑电路的核心,它们能够记忆电路的状态,并根据输入信号的变化来更新这个状态。 1. **触发器**: - **...

    SqlServer触发器调用WebService

    ### SqlServer触发器调用WebService知识点详解 #### 一、SqlServer触发器简介 在了解如何通过Sql Server触发器调用WebService之前,我们首先需要对触发器有一个基本的认识。触发器是一种特殊的存储过程,它被定义...

    Quartus 2 RS、D、JK、T、触发器实验报告 D触发器构成二分频、四分频电路

    在这个实验报告中,我们关注的是不同类型的触发器,包括RS、D、JK、T触发器,以及如何利用它们实现分频电路。 1. **RS触发器**: RS触发器是一种基本的无稳态触发器,由两个与非门或或非门以正反馈方式构成。当R和...

    oracle_触发器的种类和触发事件

    触发器可以分为四种类型:DML触发器、DDL触发器、替代触发器和数据库事件触发器。 DML触发器是定义在表上的触发器,由DML事件引发。DML事件包括INSERT、UPDATE和DELETE三种。DML触发器可以在 BEFORE 或 AFTER 触发...

    数据库实验6 触发器

    ### 数据库实验6:触发器 #### 一、实验背景及目标 本次实验的主要目的是让学生深入理解并掌握数据库触发器的使用方法。触发器是一种特殊类型的存储过程,它被自动执行,当特定事件(如数据的插入、更新或删除)...

    触发器实验报告.doc

    实验3主要探讨了四种类型的触发器:基本RS触发器、JK触发器、D触发器以及触发器间的相互转换。触发器作为基础的存储元件,其核心特性在于它们能维持两种稳定状态,代表二进制的0和1,并在特定条件下能够从一种状态...

    触发器分析应用实验报告

    实验报告“触发器分析应用”主要探讨了四种基本类型的触发器——RS触发器、JK触发器、D触发器以及地址寄存器,并通过VHDL描述和波形仿真进行了深入研究。以下是这些触发器的详细知识及应用: 1. RS触发器: RS...

    RS触发器原理图+Proteus仿真

    RS触发器,全称为“Reset-Set触发器”,是数字逻辑电路中的一种基本逻辑单元,主要用于数据存储和状态保持。它的主要特点是可以根据输入信号RS(复位和置位)来改变其输出状态,通常有两个输入端:R(Reset)和S...

    数字电路集成触发器功能测试及转换实验报告

    实验报告“数字电路集成触发器功能测试及转换”旨在深入理解和掌握数字电路中常见的几种触发器,包括RS、D、JK触发器以及三态触发器和锁存器的工作原理、功能测试方法和相互转换。实验由胡媛媛、郑三元等人编写,...

    rs触发器的逻辑功能

    RS触发器,全称为Reset-Set触发器,是数字电子技术中一类基础的存储元件。它属于顺序逻辑电路,主要用于存储一位二进制信息,即逻辑“1”或“0”。在数字系统中,RS触发器可以用作基本的存储单元和各种时序逻辑电路...

    mysql中触发器使用详解.docx

    MySQL中的触发器是一种数据库对象,它与特定的表相关联,并在对表执行INSERT、UPDATE或DELETE操作之前或之后自动执行预定义的SQL语句。触发器的主要作用是增强数据库的逻辑控制,确保数据完整性、记录操作日志以及...

    (Multisim数电仿真指导)D触发器及应用

    ### Multisim 数电仿真指导:D触发器及其应用 #### 实验背景及目标 本实验旨在通过使用Multisim软件进行数字电子技术的仿真,帮助学习者深入了解D触发器的功能及其在实际电路设计中的应用。实验的具体目标包括: ...

    JK触发器的EDA设计

    JK 触发器的 EDA 设计 JK 触发器是一种基本的数字电路触发器,广泛应用于数字电路设计中。JK 触发器的EDA设计是指使用hardware description language(HDL)编写JK触发器的数字电路模型,并使用电子设计自动化(EDA...

    边沿D触发器原理图+Proteus仿真

    边沿D触发器是数字电路中的重要组成部分,尤其在时序逻辑电路中起到关键作用。它是一种双稳态电路,其状态更新仅发生在特定的时钟边沿,通常是上升沿或下降沿,这也是其被称为“边沿D触发器”的原因。这种特性使得它...

Global site tag (gtag.js) - Google Analytics