数据库(触发器、数据库事务、存储练习)

触发器:

触发器为特殊类型的存储过程,可在执行语言事件时自动生效。SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。

当服务器或数据库中发生数据定义语言 (DDL) 事件时将调用 DDL 触发器。登录触发器将为响应 LOGON 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。

当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。

主要讲述DML触发器,DML触发器有两种:AFTER(FOR),INSTEAD OF触发器,同时DML 触发器使用 deleted 和 inserted 逻辑(概念)表。  它们在结构上类似于定义了触发器的表,即对其尝试执行了用户操作的表。  在 deleted 和 inserted 表保存了可能会被用户更改的行的旧值或新值。

  • 对于INSERT 操作,inserted保留新增的记录,deleted无记录
  • 对于DELETE 操作,inserted无记录,deleted保留被删除的记录
  • 对于UPDATE操作,inserted保留修改后的记录,deleted保留修改前的记录

示例一:DELETE触发器的创建和执行,用的Instead Of

示例二:执行删除一条数据,用deleted来表示被删除的那条数据,从中获取

示例三:insert添加一条数据,inserted表示新添加的数据,从中获取教师编号,并且根据教师编号来查看是男是女,调换男女。

数据库事务:

数据库事务(Database Transaction)  是指作为单个逻辑工作单元执行的一系列操作。

事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。

设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作:

更新客户所购商品的库存信息

保存客户付款信息--可能包括与银行系统的交互

生成订单并且保存到数据库中   ·  更新用户相关信息,例如购物数量等等 正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。

数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。

begin tran (或transaction)    --开始事务

commit                                                              --提交事务

rollback                                                              --回滚事务

事务特性:

A原子性(atomicity)

C一致性(consistency)

I隔离性(isolation)

D持久性(durability)

@@ERROR 是判断事务有没有错的条件,无错时值为0,有错时值不为0。

select * from cangku

begin tran  --开始事务

insert into cangku values(10008,‘Boxster‘,70,10,1004)--没有错

if @@ERROR >0

begin--每一个执行语句后面写这句话是为了如果上一句有错误,

--下面不管有多少执行语句,都不会执行,直接到tranrollback

goto tranrollback--到最后一个执行语句的tranrollback

end

insert into cangku values(10002,‘极光‘,66.50,10,1002)--主键约束

if @@ERROR>0

goto tranrollback

insert into cangku values(10009,‘XF‘,40,10,1003)--没有错

if @@ERROR>0

begin

tranrollback:        --需要加上冒号

rollback tran        --回滚所有事务中执行过的命令(撤销所有执行语句)

end

else

begin

commit tran   --提交事务(只有真正的走到了commit才是真正的更改数据库的数据)

end

练习:创建三个表并写一个简单的存储过程,要求可以进货、出货并打印小票。

               在没有此货物并且为进货时,添加上这一行信息;

               在没有此货物并且为出货时,打印没有此货物!

use lianxi
go
create table gong
(
gcode int primary key, --供应商编号
gname varchar(20),  --供应商名称
gtel varchar(20) --供应商电话
)
go
create table cang
(
code int primary key ,  --    货品编号
cname varchar(20),  --货品名称
cshu int, --货品数量
cprice decimal(18,2),  --货品价格
cg  int, --货品供应商编号
)
go
create table men
(
mcode int identity(1000001,1), --货品编号
mname varchar(20), --货品名称
mshu int, --货品数量
mprice decimal(18,2),  --    货品价格
mzong decimal(18,2)
)
go
insert into gong values (1001, ‘天启电器‘,‘13452236789‘)
insert into gong values (1002, ‘Davy家具‘,‘17552223761‘)
insert into gong values (1003, ‘夏华电商‘,‘17232235521‘)
insert into gong values (1004, ‘网易电商‘,‘16532238817‘)
select *from gong
insert into cang values(231001,‘联想 小新Air 13 Pro‘,20,5499,1001)
insert into cang values(231002,‘苹果iPad mini2‘,20,1950,1004)
insert into cang values(231003,‘沙发‘,12,2699,1002)
insert into cang values(231004,‘康佳智能冰箱‘,10,2699,1003)
insert into cang values(231005,‘微软 Surface 3‘,24,3999,1004)

insert into cang values(231006,‘安吉尔净水器‘,10,1668,1003)
insert into cang values(231007,‘康佳电视 LED55UC2‘,10,4399,1003)
insert into cang values(231008,‘Littleswan烘干洗衣机‘,5,2998,1003)
insert into cang values(231009,‘Dell 灵越 15 5000‘,20,3999,1001)
insert into cang values(231010,‘OPPO R9 全网通‘,14,2499,1004)

insert into cang values(231011,‘衣柜‘,12,566,1002)
insert into cang values(231012,‘小米MAX‘,15,1600,1004)
insert into cang values(231013,‘洛基亚N1‘,30,1199,1004)
insert into cang values(231014,‘红米手机3S‘,50,699,1001)
insert into cang values(231015,‘太阳能‘,7,1999,1003)

insert into cang values(231016,‘连体书桌柜‘,8,1680,1002)
insert into cang values(231017,‘海信LED55EC760UC‘,13,4999,1003)
insert into cang values(231018,‘xbox-one‘,20,3799,1004)
insert into cang values(231019,‘华为P9‘,20,2860,1004)
insert into cang values(231020,‘客厅成套家具‘,3,5644,1002)

insert into cang values(231021,‘索尼相机‘,9,4599,1004)
insert into cang values(231022,‘华硕 W519L‘,17,3500,1001)
insert into cang values(231023,‘数码摄像机‘,10,2798,1003)
insert into cang values(231024,‘三星UA55KS9800‘,5,18099,1003)
insert into cang values(231025,‘三星 900X3L‘,15,8999,1001)
insert into cang values(231026,‘小米平板2‘,37,999,1004)
select *from cang
delete from cang
create proc chuchu
@code int,
@cname varchar(20),  --货品名称
@cshu int, --货品数量
@cprice decimal(18,2),  --货品价格
@cg  int
as
begin
declare @count int
select @count=COUNT(*)from cang where code=@code
declare @shu int
select @shu=cshu from  cang where code=@code
if @count>0
begin
if @cshu>0--进货
update cang set cshu= @shu+@cshu where code=@code
if @cshu<0 --出货
begin
if @shu+@cshu>=0
update cang set cshu=@shu+@cshu where code=@code
declare @scshu int
set @scshu=-@cshu
declare @zong decimal(18,2)
set @zong=@cprice*@scshu
insert into men values(@cname,@cprice,@scshu,@zong)
if @shu+@cshu<0
print ‘货物量不足,请及时补充‘
end
end
else
begin
if @cshu>0
insert into cang values (@code,@cname,@cprice,@cshu,@cg)
if @cshu<0
print ‘仓库中无此货物‘
end
end
go
exec chuchu @code=231001,@cname=‘联想 小新Air 13 Pro‘,@cprice=5499,@cshu=15,@cg=1001
exec chuchu @code=231005,@cname=‘微软 Surface 3‘,@cprice=3999,@cshu=-10,@cg=1004
exec chuchu @code=231030,@cname=‘iphone 3s‘,@cprice=1200,@cshu=10,@cg=1001
exec chuchu @code=231031,@cname=‘乐视tv‘,@cprice=1200,@cshu=-10,@cg=1002
select *from cang
select *from men
时间: 2024-10-07 11:36:57

数据库(触发器、数据库事务、存储练习)的相关文章

数据库之——索引、触发器、事务(存储引擎)

一. 数据库 数据库(DataBase)是按照数据结构来组织.存储和管理数据的仓库.其主要特点有如下几个方面: 实现数据共享 数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享: 减少数据的冗余度 同文件系统相比,由于数据库实现了数据共享,从而避免了用户各自建立应用文件.减少了大量重复数据,减少了数据冗余,维护了数据的一致性: 数据的独立性 数据的独立性包括逻辑独立性(数据库中数据库的逻辑结构和应用程序相互独立)和物理独立性(数据物理结构的变

数据库 --- 索引、触发器、事务(存储引擎)

一.数据库  -----   按照数据结构来组织.存储和管理数据的仓库 主要特点: 实现数据共享: 减少数据的冗余度: 数据的独立性: 数据实现集中控制: 数据一致性和可维护性,以确保数据的安全性和可靠性: 故障恢复. 二.其他相关 1.索引:作用于表中的某列,并将其进行排序,有助于快速地进行查询. 索引是对数据库表中一个或多个列的值进行排序的数据结构,是用于提高在数据库表中访问数据的速度的数据库对象.其实索引相当于一本书的目录,如果没有索引,要想在数据库中查找某一特定的值就需要遍历整个数据库表

mysql中索引,触发器,事务,存储引擎的理解

1.索引:作用于表中的某列,并将其进行排序,有助于快速地进行查询. 索引是对数据库表中一个或多个列的值进行排序的数据结构,是用于提高在数据库表中访问数据的速度的数据库对象.其实索引相当于一本书的目录,如果没有索引,要想在数据库中查找某一特定的值就需要遍历整个数据库表,但是有了索引之后就可以在索引当中查找,有助于更快地获取信息: 索引可分为聚集索引和非聚集索引: 聚集索引:是按照数据存放的物理位置为顺序的: 非聚集索引中,表数据存储顺序与索引顺序无关:一张表上只能创建一个聚集索引,因为真实数据的物

重新学习MySQL数据库3:Mysql存储引擎与数据存储原理

重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有两个词非常容易混淆,也就是数据库和实例: 数据库:物理操作文件系统或其他形式文件类型的集合: 实例:MySQL 数据库由后台线程以及一个共享内存区组成: 对于数据库和实例的定义都来自于 MySQL 技术内幕:InnoDB 存储引擎 一书,想要了解 InnoDB 存储引擎的读者可以阅读这本书籍. 数据

数据库触发器详讲

一:触发器的概念: 数据库触发器是一个与表相关联的,存储的plsql语句. 作用:每当一个特定的数据操作语句,(insert,update,delete)在指定的表发出时,Oracle自动地执行触发器中定义的语句序列 第一个触发器:每当成功插入新员工后   自动打印“插入新员工成功” create trigger 触发器名字(saynewemp) after (执行操作之后) insert on 操作的表(emp) declare begin dbms_output.put_line('成功插入

关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)

本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies 紧接上一篇文章,本文翻译了如下章节: 一. Log manager(日志管理) 通过前面的章节,我们已经知道,为了提升性能,数据库会将数据缓存在内存中.但是,如果在事务提交过程中,数据库服务器崩溃了.缓存在内存的数据就会丢失

免费开放阅读 | 数据库管理系统的事务原理(上)

作者介绍: 那海蓝蓝,腾讯技术工程事业群计费平台部金融云TDSQL数据库T4级专家,熟悉PostgreSQL.MySQL.Informix等数据库内核技术,著有<数据库查询优化器的艺术>一书.<数据库事务处理的艺术>为最新出版力作,经机械工业出版社授权,"腾讯技术工程官方号"将独家免费开放阅读,我们将分期为读者奉上那海蓝蓝的技术盛宴. 本篇介绍数据库管理系统的事务处理技术,从数据库的事务理论出发界定事务处理技术的范围,讨论了事务机制应对的问题.事务处理的理论基础

MySQL数据库引擎、事务隔离级别、锁

MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行效率比InnoDB类型更快,但是不支持事务,而InnoDB提供事务支持以及外键等高级数据库功能. 具体实现的区别: InnoDB不支持FULLTEXT类型的索引 InnoDB中不保存表的具体行数,也就是说,执行查询SQL时,InnoDB要扫描一遍整个表来计算有多少行,而MyISAM只要简单的

【赵强老师】利用数据库触发器实现数据的同步

一.什么是触发器 数据库触发器是一个与表相关联的,存储的PL/SQL 语句.每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列. 触发器的应用场景如下: 复杂的安全性检查 数据的确认 数据库审计 数据的备份和审计 二.创建Oracle触发器的语法 CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE

SharePoint 2010 数据库xxx的事务日志已满

http://www.cnblogs.com/sygwin/p/6222428.html 接到领导安排,说客户有问题 请求协助解决,对方给我展示的错误日志,如下: 数据库'WSS_Content_xxxx'的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅sy.databases中的log_reuse_wait_dec列 导致的结果是用户再也无法上传文件到文档库了. 看来一下对应的数据库文件,日志文件大的惊人,已经超过1.8T 作为老司机,理论上解决这样的问题,就是收缩数据库.可是咱是个