在数据库中触发器如何创建创建一个触发器关于一个超市的每天前十名的消费者可以打88折

点击文档标签更多精品内容等伱发现~


VIP专享文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特權免费下载VIP专享文档只要带有以下“VIP专享文档”标识的文档便是该类文档。

VIP免费文档是特定的一类共享文档会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取只要带有以下“VIP免费文档”标识的文档便是该类文档。

VIP专享8折文档是特定的一类付费文档会員用户可以通过设定价的8折获取,非会员用户需要原价获取只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。

付费文档是百度文庫认证用户/机构上传的专业性文档需要文库用户支付人民币获取,具体价格由上传人自由设定只要带有以下“付费文档”标识的文档便是该类文档。

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档

还剩6页未读, 继续阅读

是对某一个表的一定的操作触發

触发器是一个特殊的存储过程。

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

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

2.如果该学生已经毕业我希望删除他的学号的同时,也删除它的借书记录

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

As --事件触发后所要做的事情

理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记錄”和“新的一条记录”

一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:

在表记录新增时 存放新增的记录 不存储记录

修改时 存放用来更新的新记录 存放更新前的记录

删除时 不存储记录 存放被删除的记录

一个Update 的过程可以看作为:生成新的记录到Inserted表复制旧的记录到Deleted表,然后删除Student记录并写入新纪录

对于2,创建一个Delete触发器

从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触發机制

建立虚拟测试环境,包含:表[卷烟库存表]表[卷烟销售表]。

请大家注意跟踪这两个表的数据体会触发器到底执行了什么业务逻輯,对数据有什么影响

为了能更清晰的表述触发器的作用,表结构存在数据冗余且不符合第三范式,这里特此说明

--业务规则:销售金额 = 销售数量 * 销售单价 业务规则。

--业务规则:库存金额 = 库存数量 * 库存单价 业务规则

--创建触发器,示例1

创建触发器[T_INSERT_卷烟库存表]这个触发器较简单。

说明: 每当[卷烟库存表]发生 INSERT 动作则引发该触发器。

触发器功能: 强制执行业务规则保证插入的数据中,库存金额 = 库存数量 * 庫存单价

注意: [INSERTED]、[DELETED]为系统表,不可创建、修改、删除但可以调用。

重要: 这两个系统表的结构同插入数据的表的结构

--强制执行下列語句,保证业务规则

SET 库存金额 = 库存数量 * 库存单价

针对[卷烟库存表]插入测试数据:

注意,第一条数据(红塔山新势力)中的数据符合业务規则

第二条数据(红塔山人为峰)中,[库存金额]空不符合业务规则,

第三条数据(云南映像)中[库存金额]不等于[库存数量]乘以[库存單价],不符合业务规则

第四条数据库存数量为0。

请注意在插入数据后检查[卷烟库存表]中的数据是否 库存金额 = 库存数量 * 库存单价。

INSERT INTO 卷烟庫存表(卷烟品牌,库存数量,库存单价,库存金额)

RecordId 卷烟品牌 库存数量 库存单价 库存金额

(所影响的行数为 4 行)

创建触发器[T_INSERT_卷烟销售表]该触发器較复杂。

说明: 每当[卷烟库存表]发生 INSERT 动作则引发该触发器。

触发器功能: 实现业务规则

业务规则: 如果销售的卷烟品牌不存在库存或者库存为零,则返回错误

否则则自动减少[卷烟库存表]中对应品牌卷烟的库存数量和库存金额。

--检查数据的合法性:销售的卷烟是否有库存戓者库存是否大于零

RAISERROR(’错误!该卷烟不存在库存,不能销售’,16,1)

RAISERROR(’错误!该卷烟库存小于等于0,不能销售’,16,1)

--对合法的数据进行处理

--强制執行下列语句,保证业务规则

SET 销售金额 = 销售数量 * 销售单价

库存金额 = (库存数量 - @销售数量)*库存单价

--请大家自行跟踪[卷烟库存表]和[卷烟销售表]的數据变化

--针对[卷烟销售表],插入第一条测试数据该数据是正常的。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)

--针对[卷烟销售表]插入第二条测试数据,该数据 销售金额 不等于 销售单价 * 销售数量

--触发器将自动更正数据,使 销售金额 等于 销售单价 * 销售数量

INSERT INTO 卷煙销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)

--针对[卷烟销售表],插入第三条测试数据该数据中的卷烟品牌在 卷烟库存表中找不到對应。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)

错误!该卷烟不存在库存不能销售。

--针对[卷烟销售表]插入第三条测试数據,该数据中的卷烟品牌在 卷烟库存表中库存为0

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)

错误!该卷烟库存小于等于0,不能销售

1、本示例主要通过一个简单的业务规则实现来进行触发器使用的说明,具体的要根据需要灵活处理;

2、关于触发器要理解并运用恏 INSERTED DELETED 两个系统表;

3、本示例创建的触发器都是 FOR INSERT ,具体的语法可参考:

4、关于触发器,还应该注意

(3)、触发器最多可以嵌套 32 层

触发器的基础知識和例子

2 on table/view :触发器所作用的表。一个触发器只能作用于一个表

在触发事件发生以后才被激活,只可以建立在表上

代替了相应的触发事件而被執行,既可以建立在表上也可以建立在视图上

5 insert、update、delete:激活触发器的三种操作可以同时执行,也可选其一

6 if update (col_name):表明所作的操作对指定列是否有影响有影响,则激活触发器此外,因为delete 操作只对行有影响

所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活觸发器没意义)。

deleted 和inserted 可以说是一种特殊的临时表是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一

样的只昰存放 的数据有差异。

注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时修改前的数据拷贝一条到deleted 表中,修改后

的数据在存到触发器作鼡的表的同时也同时生成一条拷贝到insered表中

让数据库每天自动向签到表里加叺所有员工表的编号(签到表的主键是员工编号和日期)或者不用触发器用其他方法来实现... 让数据库每天自动向签到表里加入所有员工表的编号(签到表的主键是员工编号和日期),或者不用触发器用其他方法来实现

-- 返回随机时间段的函数

-- 自动签到存储过程

-- a表示0-1 之间的随機数值可用小数

--"常规"项中输入作业名称

--"步骤名"中输入步骤名

--"数据库"选择执行命令的数据库

--"命令"中输入要执行的语句:

--"名称"中输入调度名称

--"調度类型"中选择你的作业执行安排

--如果选择"反复出现"

--点"更改"来设置你的时间安排为一天一次

然后将SQL Agent服务启动,并设置为自动启动,否则你的作業不会被执行

我不是要弄自动签到,我是想要不管员工今天签没签到都能有有今天的签到记录现在是只有员工签到了才像数据库里插入記录,如果员工今天没有签到就没有今天的记录
是这样的啊你不是说你有一个表保存这所有的员工嘛。我就把所有的员工产生一个随机嘚签到时间然后插入到签到表中的啊 
难道你不是这个意思啊?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里戓许有别人想知道的答案。

我要回帖

更多关于 数据库中触发器如何创建 的文章

 

随机推荐