文章目录
前言
数据库原理及其应用也同样的经过漫长的学习过后完成,当然很感谢老师的精彩讲解,这次主要是对于这10周学习数据库的一个总结,从开学到现在我也是更着老师从最开始数据库的原理一直到数据库的应用一路走到最后,想想还是有很多知识还是比较陌生。可能自己没有理解到吧,今天我就照着最后一次的数据库原理的课程之后遗留的一个问题来讲述吧。主要是关于触发器的操作。
一、触发器是什么?
触发器是一种特殊的存储过程,它不同于存储过程。触发器是SQL Server 提供的除过约束以外的另外一种保证数据完整性的方法,它可以实现约束不能实现的更复杂的完整性要求。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程的名字而被直接调用。
而触发器的主要的作用就就是其能够*实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其他的许多功能:
- 强化约束:触发器能够实现比CHECK语句更为复杂的约束。
- 跟踪变化:触发器可以侦测数据库内的操作,从而可以禁止数据库中未经许可的更新和变化。
- 级联运行:触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含另外一个表的数据操作(增删改查)而该操作又会导致触发器被触发。
- 存储过程的调用:为了响应数据库的更新,触发器可以调用一个或者多个存储过程,甚至可以通过外部过程的调用而在DBMS本身之外进行操作。
二、触发器的分类
DML触发器
当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。DML触发器的主要作用在于强制执行业 务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。
DDL触发器
它是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。
登录触发器
登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。
三、模拟案例
这里我就按照我们老师给我们的一个案例来大致说说该实现操作:
首先我们模拟的是一个自动进行补货的触发器,这里面有的表主要是Inventory(清单表),Orders(销售表),Minlevel(最小补货表),Row(商品表),Rorder(计数表)
Inventory(清单表)字段:itemID,level(数量)
Orders(销售表)字段:itemID,amount(销售数量)
Minlevel(最小补货表)字段:itemID,level(临界补货数量,也就是说小于该字段时需要提醒商家补货操作)
Rorder(计数表)字段:itemID,count(计数)备注:该表主要是记录每个商品要补货的数量
到这里,我们基本上把所有的表大致都已经写写好了,在这里我可能写的不是很完善,后续我也还会再给大家补充完整,我在写该篇文章的时候也还是不太明白其中的个别知识点,希望以后明白更加深刻的时候在看该文章的时候有一个大的进步。废话不多说,直接上SQL
create
tigger tigger_ReOrder
after
update of level on Inventory Referencing old row as Orow , new row as Nrow for each
when
Nrow < (select level from minlevel when minlevel.itemID = Nrow.itemID
and
Orow.level > (select level from minlevel where minllevel.itemID = Orow.itemID))
begin
insert into orders ( select itemID , amount from Rorder where Rorder.itemID = Orow.itemID )
end
大致思路:我们创建一个触发器用来跟新清单表中的数量,这里的数量有原始数量,和跟新之后的数量,也就是old 和new .这里我们第一个select的时候我们主要是操作该数量是不是小于最小需要补货的数量也就是minlevel中的字段level同时我们这里还需要判断补货前一次是否大于该最后补货字段的level,(这里如果不判断的话,那么我们假如最小补货是小于10件商品才补货,那么第一次小于10件的时候,我们补货,那么当在补货期间的时候又有买家产生订单,此时我们触发器再次补货,这样我们就失去了本来补货的意义了 也就是说在极端情况下补10次货了)下面begin之后就是我们需要补货是查找到哪个货物,起先我们需要在字段中设置每个商品补货件数,也就是我们需要Rorder表中的count字段,这里也就给我们规定了每个商品应该补多少货*(这里如果少了该字段的话,我们每次补货所有商品都是补一样多,那么也就失去了我们想要的结果了)*
总结
数据库真是一个神奇的东西,看似很简单,但是想要学好还是需要很多时间以及需要我们要有一定的兴趣,路还很长,加油!