目录
什么是数据库触发器?
事件
AFTER触发器
INSTEAD OF触发器
特殊数据库对象
定义
用于触发器
复杂的审计
执行业务规则
派生列值
触发器很棘手!
数据库触发器是在数据库中发生特定操作时运行的特殊存储过程。大多数触发器定义为在对表的数据进行更改时运行。触发器可以定义为替代或在DML(数据操纵语言)-如INSERT, UPDATE, and DELETE-之后来运行。
触发器可帮助数据库设计人员确保完成某些操作(如维护审计文件),而不管哪个程序或用户对数据进行了更改。
程序被称为触发器,因为事件(例如向表中添加记录)会触发它们的执行。
触发器及其实现特定于数据库供应商。在本文中,我们将重点介绍Microsoft SQL服务器;但是,Oracle和MySQL中的概念相同或相似。
注意:本课程的所有示例均基于Microsoft SQL Server Management Studio和AdventureWorks2012数据库。
触发器可以在DML操作之后发生,也可以不发生。触发器与数据库DML操作INSERT,UPDATE和DELETE相关联。触发器定义为在特定表上执行这些操作时运行。
一旦DML操作(例如INSERT)完成,就会执行AFTER触发器。以下是AFTER触发器的一些关键特性:
顾名思义,INSTEAD OF触发器代替导致它们触发的DML动作。使用INSTEAD OF触发器时要考虑的事项包括:
触发器使用两个特殊的数据库对象INSERTED和DELETED来访问受数据库操作影响的行。在触发器的范围内,INSERTED和DELETE对象具有与触发器表相同的列。
INSERTED表包含所有新值;而DELETED表包含旧值。以下是表格的使用方法:
为特定表和一个或多个事件定义触发器。在大多数数据库管理系统中,每个表只能定义一个触发器。
以下是AdventureWorks2012数据库的示例触发器。
您会注意到触发器的语法与存储过程的语法非常相似。事实上,触发器使用相同的语言来实现其逻辑,就像存储过程一样。在MS SQL中,这是T-SQL;而在Oracle中则是PL/SQL。
以下是触发器的一些重要部分:
以下是触发器的一些常见用法:
您可以使用触发器来跟踪对表所做的更改。在上面的示例中,对WorkOrder表所做的更改将记录在TransactionHistory表中。
通常在创建审计跟踪时,您将使用AFTER触发器。
您可能认为这是多余的,因为数据库日志中记录了许多更改,但日志用于数据库恢复,用户程序无法轻松访问。TransactionHistory表易于引用,可以合并到最终用户报告中。
触发器可用于在执行DML操作之前检查所有数据。您可以使用INSTEAD OF触发器“拦截”挂起的DML操作,应用任何业务规则,并最终完成事务。
示例业务规则可以是客户状态定义为:
可以定义INSTEAD OF触发器,以便在每次添加或修改客户记录时检查客户状态。状态检查将涉及创建所有客户购买的总和,并确保新状态与过去12个月的购买总和相对应。
触发器可用于计算列值。例如,对于每个客户,您可能希望在客户记录上维护TotalSales列。当然,为了保持准确,每次销售时都必须更新。
这可以使用Sales表的INSERT,UPDATE和DELETE语句上的AFTER触发器来完成。
一般来说,我的建议是避免使用触发器,除非绝对必要。
您应该避免使用触发器代替内置功能。例如,不是依靠触发器来强制执行引用完整性,而是最好使用关系。
以下是我回避他们的一些原因: