sqlserver 触发器实例代码
理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
2 红塔山人为峰 100 22.0000 2200.0000
第三条数据(云南映像)中,[库存金额]不等于[库存数量]乘以[库存单价],不符合业务规则。
为了能更清晰的表述触发器的作用,表结构存在数据冗余,且不符合第三范式,这里特此说明。
创建触发器[T_INSERT_卷烟库存表],这个触发器较简单。
(
for Update --为什么事件触发
CREATE TABLE 卷烟库存表
Delete BorrowRecord
第二条数据(红塔山人为峰)中,[库存金额]空,不符合业务规则,
--业务规则:库存金额 = 库存数量 * 库存单价 业务规则。
FOR INSERT
GO
StudentID int , --学号
删除时 不存储记录 存放被删除的记录
COMMIT TRANSACTION
Create Table BorrowRecord( --学生借书记录表
GO
SELECT '玉溪',0,30,0
等等。
BEGIN TRANSACTION
复制代码 代码如下:
As在表记录新增时 存放新增的记录 不存储记录
说明: 每当[卷烟库存表]发生 INSERT 动作,则引发该触发器。
GO
销售金额 MONEY NULL
注意: [INSERTED]、[DELETED]为系统表,不可创建、修改、删除,但可以调用。
从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。
请注意在插入数据后,检查[卷烟库存表]中的数据是否 库存金额 = 库存数量 * 库存单价。
SELECT '红塔山新势力',100,12,1200 UNION ALL
--查询数据
复制代码 代码如下:
..../*
4 玉溪 0 30.0000 .0000
--业务规则:销售金额 = 销售数量 * 销售单价 业务规则。
(所影响的行数为 4 行)
for Delete
SELECT '红塔山人为峰',100,22,NULL UNION ALL
ON 卷烟库存表
定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
(
GO
As --事件触发后所要做的事情
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷烟销售表')
针对[卷烟库存表],插入测试数据:
end
)
修改时 存放用来更新的新记录 存放更新前的记录
一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:
StudentID int primary key, --学号
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 from INSERTED)
CREATE TRIGGER T_INSERT_卷烟库存表
购货商 VARCHAR(40) NULL,
复制代码 代码如下:
重要: 这两个系统表的结构同插入数据的表的结构。Create Trigger truStudent
/*
BorrowRecord int identity(1,1), --流水号
if Update(StudentID)
Create trigger trdStudent
...
--触发器示例2
)
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷烟库存表')
GO
/*
卷烟品牌 VARCHAR(40) PRIMARY KEY NOT NULL,
Where br.StudentID=d.StudentID
--强制执行下列语句,保证业务规则
*/
SELECT * FROM 卷烟库存表
DROP TABLE 卷烟销售表
SQL触发器实例2
GO
GO
UPDATE 卷烟库存表
对于2,创建一个Delete触发器
AS
ReturnDAte Datetime, --归还时间
复制代码 代码如下:
库存数量 INT NULL,常见的触发器有三种:分别应用于Insert , Update , Delete 事件。
BorrowDate datetime, --借出时间
--提交事务处理
这时候可以用到触发器。对于1,创建一个Update触发器:
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷烟库存表')
)
DROP TRIGGER T_INSERT_卷烟库存表
注意,第一条数据(红塔山新势力)中的数据符合业务规则,
1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
卷烟品牌 VARCHAR(40) PRIMARY KEY NOT NULL,
DROP TABLE 卷烟库存表
SET 库存金额 = 库存数量 * 库存单价
)
一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表
begin
From BorrowRecord br , Delted d
/*
建立虚拟测试环境,包含:表[卷烟库存表],表[卷烟销售表]。
我为什么要使用触发器?比如,这么两个表:
Update BorrowRecord
-------- ------------ -------- ------- ---------
CREATE TABLE 卷烟销售表
Set StudentID=i.StudentID
结果集
*/
销售数量 INT NULL,
Create Table Student( --学生表
请大家注意跟踪这两个表的数据,体会触发器到底执行了什么业务逻辑,对数据有什么影响。
SELECT '云南映像',100,60,500 UNION ALL
--创建触发器,示例1
第四条数据库存数量为0。
库存单价 MONEY NULL,
RecordId 卷烟品牌 库存数量 库存单价 库存金额
*/
GO
1 红塔山新势力 100 12.0000 1200.0000
销售单价 MONEY NULL,
2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
触发器功能: 强制执行业务规则,保证插入的数据中,库存金额 = 库存数量 * 库存单价。
USE Master
*/
Where br.StudentID=d.StudentID
On Student
3 云南映像 100 60.0000 6000.0000
GO
库存金额 MONEY NULL
用到的功能有:
On Student --在Student表中创建触发器
复制代码 代码如下:
INSERT INTO 卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额)相关热词: 实例
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/sql/mssql/1430.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
sql server 关于设置null的一
时间:2020-12-28
-
详解SQL游标的用法
时间:2020-12-27
-
vs code连接sql server数据库步
时间:2020-12-27
-
图书管理系统的sqlserver数
时间:2020-12-25
-
详解SQL 通配符
时间:2020-12-25
-
sql四大排名函数之ROW_NUM
时间:2020-12-25
-
SQLServer数据库处于恢复挂
时间:2020-12-24
-
Win10 64位安装个人版SQL20
时间:2020-12-24
热门文章
-
sqlserver中查询横表变竖表的sql语句简析
时间:2020-12-08
-
关于SQL Server查询语句的使用
时间:2020-12-13
-
SQL Server简单模式下误删除堆表记录恢复方
时间:2020-12-12
-
MSSQL教程_mssql数据库教程_MSSQL基础教程_第
时间:2020-12-13
-
详解SQL游标的用法
时间:2020-12-27
-
sql server 关于设置null的一些建议
时间:2020-12-28
-
jdbc连接sql server数据库问题分析
时间:2020-12-10
-
mssql关于一个表格结构的另外一种显示(表
时间:2020-12-11
-
SQL Server数据库入门学习总结
时间:2020-12-10
-
使用SqlBulkCopy时应注意Sqlserver表中使用缺
时间:2020-12-09
