触发器啥时候使用?有啥功能?举个简单的例子说明一下。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了触发器啥时候使用?有啥功能?举个简单的例子说明一下。相关的知识,希望对你有一定的参考价值。

触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。    数据库领域名词  触发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
  触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
  创建触发器的SQL语法
  DELIMITER |
  CREATE TRIGGER `<databaseName>`.`<triggerName>`
  < [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
  ON <tableName>
  FOR EACH ROW
  BEGIN
  --do something
  END |
  触发器的优点
  触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
  比较触发器与约束
  约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性 (RI) 则应通过 FOREIGN KEY 约束进行强制。在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。
  例如:除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。
  CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。
  约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。
  触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。
  触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。
  如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。
  触发器到底可不可以在视图上创建 在 SQL Server�6�4 联机丛书中,是没有说触发器不能在视图上创建的, 并且在语法解释中表明:
  在 CREATE TRIGGER 的 ON 之后可以是视图。 然而,事实似乎并不是如此,很多专家也说触发器不能在视图上创建。我也专门作了测试,的确如此,不管是普通视图还是索引视图,都无法在上面创建触发器,真的是这样吗?请点击详细,但是无可厚非的是:当在临时表或系统表上创建触发器时会遭到拒绝。 深刻理解 FOR CREATE TRIGGER 语句的 FOR 关键字之后可以跟 INSERT、UPDATE、DELETE 中的一个或多个,也就是说在其它情况下是不会触发触发器的, 包括 SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。相关内容 一个有趣的应用我们看到许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的, 如果直接打开数据库表进行更改,同样可以更改其用户名, 在触发器中利用回滚就可以巧妙地实现无法更改用户名……详细内容 触发器内部语句出错时…… 这种情况下,前面对数据更改操作将会无效。举个例子,在表中插入数据时触发触发器,而触发器内部此时发生了运行时错误,那么将返回一个错误值,并且拒绝刚才的数据插入。不能在触发器中使用的语句 触发器中可以使用大多数 T-SQL 语句,但如下一些语句是不能在触发器中使用的。
  CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
  ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
  DROP 语句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
  DISK 语句,如:DISK INIT、DISK RESIZE。
  LOAD 语句,如:LOAD DATABASE、LOAD LOG。
  RESTORE 语句,如:RESTORE DATABASE、RESTORE LOG。
  RECONFIGURE
  TRUNCATE TABLE 语句在sybase的触发器中不可使用!
  慎用触发器 触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作…… 同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序. [编辑本段]数字电路领域名词  学名“双稳态多谐振荡器(Bistable Multivibrator)”。触发器(Flip Flop)是一种可以存储电路状态的电子元件。最简单的是由两个或非门,两个输入端和两个输出端组成的RS触发器(见图)。复杂一些的有带时钟(CLK)段和D(Data)端,在CLK端为高电平时跟随D端状态,而在CLK端变为低电平的瞬间锁存信号的D触发器。更常用的是两个简单D触发器级联而成的在时钟下跳沿锁存信号的边缘D触发器,广泛应用于计数器、运算器、存储器等电子部件。
  触发器的电路结构和逻辑功能:
  逻辑功能,是指触发器的次态和现态及输入信号之间在稳态下的逻辑关系。这种逻辑关系可以用特性表、特性方程或状态转换图给出。
  根据逻辑功能的不同特点,把触发器分为RS、JK、T、D等几种类型。
  电路结构,是指电路中门电路的种类及组合方式。
  基本RS触发器、同步RS触发器、主从触发器、边缘触发器等是指电路结构的不同形式。由于电路结构形式的不同,带来了各不相同的动作特点。
  同一种逻辑功能的触发器可以用不同的电路结构实现。反过来说,用同一种电路结构形式可以作成不同逻辑功能的触发器。
  触发器的类型:
  按逻辑功能不同分为:RS触发器、D触发器、JK触发器、T触发器。
  按触发方式不同分为:电平触发器、边沿触发器和主从触发器。
  按电路结构不同分为:基本RS触发器和钟控触发器。
  按存储数据原理不同分为:静态触发器和动态触发器。
  按构成触发器的基本器件不同分为:双极型触发器和MOS型触发器。
  照明配件
  用于高强度气体放电灯(H.I.D)的启动,型号繁多.由于高强度气体放电灯启动时需要一个高电压来使气体电离进入等离子态,因而需要一个高压发生器做为启动器。这就是触发器早期的机械型触发器已经淘汰。现在绝大多数触发器都是使用可控硅或高压触发二极管的电子触发器,常用的型号有:OSRAM 的 CD-7 飞利浦的 SI51 SN58 爱伦的ALK400等
参考技术A 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)

我为什么要使用触发器?比如,这么两个表:

Create Table Student( --学生表
StudentID int primary key, --学号
....
)

Create Table BorrowRecord( --学生借书记录表
BorrowRecord int identity(1,1), --流水号
StudentID int , --学号
BorrowDate datetime, --借出时间
ReturnDAte Datetime, --归还时间
...
)

用到的功能有:
1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
等等。

这时候可以用到触发器。对于1,创建一个Update触发器:

Create Trigger truStudent
On Student --在Student表中创建触发器
for Update --为什么事件触发
As --事件触发后所要做的事情
if Update(StudentID)
begin

Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表
Where br.StudentID=d.StudentID

end

理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。 一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:
虚拟表Inserted 虚拟表Deleted在表记录新增时 存放新增的记录 不存储记录
修改时 存放用来更新的新记录 存放更新前的记录
删除时 不存储记录 存放被删除的记录
一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

对于2,创建一个Delete触发器
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID

从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。
这里我们只讲解最简单的触发器。复杂的容后说明。
事实上,我不鼓励使用触发器。触发器的初始设计思想,已经被“级联”所替代
参考技术B

1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);

2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。这时候可以用到触发器。

触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。

触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。      数据库领域名词    触发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。

触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。

XML中DOM有些啥用,它具体有很多的对象和方法,他们有啥用,具体举个例子用在哪?!

最好大家能举个例子来说明下。

我来回答这个问题.我软件专业的,学过XML.下面是我自己的理解:

XML主要用于数据的处理与表达.因为html等其它标记语言无法准确表达其本质内容,而主要是表现样式.导致带来很多不便.这样,XML就诞生了.

XML的DOM其实就是映射在内存中的数据.XML是树型结构,操作很麻烦.DOM的出现就是解决这个问题的.利用DOM,可以轻松地在节点间进行读取,增加,删除等一系列操作.

下面举个例子吧,我上课时候的题目:

<html>
<head>
<title>ex 08 - code by MacroChin 10:08 2008-5-23</title>
<style>
tr,td
border-bottom: #0000FF solid 1px;
font-size: 11px;
font-family: Arial;

</style>
<script language="VBScript" defer>
<!--
Function listProc(str)
s=""
tds = split(str, " ")
For i=0 To UBound(tds)
s = s & "<td>" & tds(i) &"</td>"
Next
listProc=s
End Function
//-->
</script>
<script language="javascript" defer>
<!--

function list(qrystr)

var sHTML=\'\';
sHTML += \'<table>\\
<tr><td>学号</td><td>姓名</td><td>性别</td><td>年龄</td>\\
<td>C语言</td><td>XML</td><td>JSP</td><td>数据结构</td><td>SQL</td></tr>\\
\';
var xml=new ActiveXObject("Microsoft.XMLDOM");
if(!xml.load("ex08.xml")) return;
var stus=xml.selectNodes(qrystr);
for(var i=0; i<stus.length; i++)

sHTML += \'<tr>\' + listProc(stus.item(i).getAttribute(\'s_ID\') + \' \' + stus.item(i).text) + \'</tr>\';

sHTML += \'</table>\\
<BR>\';
document.getElementById(\'sbox\').innerHTML = sHTML;


//-->
</script>
</head>
<body>
<a href="#" onClick="list(\'//student\');">1.输出所有学生信息</a><BR>
<a href="#" onClick="list(\'//student[@s_ID=\\\'SA01003\\\']\')">2.输出学号(s_ID)为SA01003的学生信息</a><BR>
<a href="#" onClick="list(\'//student[sex=\\\'男\\\']\')">3.输出性别为“男”的所有学生信息</a><BR>
<a href="#" onClick="list(\'//student[age<\\\'20\\\']\')">4.输出年龄小于20的学生信息</a><BR>
<a href="#" onClick="list(\'//student[grade[XML>=\\\'90\\\' and C语言>=\\\'90\\\']]\')">5.输出xml和c语言课程都在90分以上(包括90)的学生信息</a><BR>
<BR><BR>
<div id="sbox"></div>
</body>
</html>

把这个代码保存为ex08.htm文件.

然后再写一个ex08.xml文件,内容如下:
<?xml version="1.0" encoding="GB2312"?>
<students>
<student s_ID="SA01001">
<name>赵毅</name>
<sex>男</sex>
<age>23</age>
<grade>
<C语言>91</C语言>
<XML>90</XML>
<JSP>76</JSP>
<a数据结构>93</a数据结构>
<SQL>83</SQL>
</grade>
</student>
<student s_ID="SA01002">
<name>李晓红</name>
<sex>女</sex>
<age>22</age>
<grade>
<C语言>71</C语言>
<XML>81</XML>
<JSP>76</JSP>
<a数据结构>65</a数据结构>
<SQL>89</SQL>
</grade>
</student>
<student s_ID="SA01003">
<name>欧阳涛</name>
<sex>男</sex>
<age>20</age>
<grade>
<C语言>90</C语言>
<XML>93</XML>
<JSP>78</JSP>
<a数据结构>68</a数据结构>
<SQL>86</SQL>
</grade>
</student>
<student s_ID="SA01004">
<name>李明</name>
<sex>男</sex>
<age>19</age>
<grade>
<C语言>72</C语言>
<XML>77</XML>
<JSP>95</JSP>
<a数据结构>87</a数据结构>
<SQL>78</SQL>
</grade>
</student>
</students>

运行ex08.htm,然后进行一些操作,看看是不是很酷?

以上是我自己的见解,希望对你有帮助.
参考技术A DOM是一些节点的集合,由于文档中可能包含有不同类型的信息,所以定义了几种不同类型的节点。DOM中最常见的节点类型有:
(1)元素:
元素是XML的基本构件。元素的子节点可以是其它元素、文本节点或两者都有。元素节点还可以只含有属性这一唯一类型的节点。
(2)属性:
属性节点包含关于元素节点的信息,但它不是元素的子节点
(3)文本:
文本节点文本信息,或干脆是空白的文本。
(4)文档:
文档节点是整个文档中所有其它节点的父节点
元素是一种很重要的类型节点,元素节点可以是其他节点的容器。
参考技术B 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。
JAXP接口包含了三个包:
(1) org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口。
(2) org.xml.sax 用于对XML进行语法分析的事件驱动的XML简单API(SAX)
(3) javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以满意条件了。
殊语法分析器。

以上是关于触发器啥时候使用?有啥功能?举个简单的例子说明一下。的主要内容,如果未能解决你的问题,请参考以下文章

XML中DOM有些啥用,它具体有很多的对象和方法,他们有啥用,具体举个例子用在哪?!

oracle数据库,触发器有啥用途,请用实例说明一下。

3NF 与BCNF 有啥区别? 求举个例子说明下~谢谢

3NF 与BCNF 有啥区别? 求举个例子说明下~谢谢

oracle中触发器有啥作用

举一个好例子说明java中啥情况下用过滤器,啥时候用拦截器,啥时候用侦听(没分了,但想知道真相)