数据库之存储、触发器

一、存储

在mydb数据库运行

select * from  fruit
select * from  Login
select * from  OrderDetails
select * from  Orders
select * from  info
select * from  Family

go
--存储过程,实现用户购买水果的操作,要判断购买数量和库存之间的关系,购买总价和余额之间的关系,如果购买成功修改4个表

create procedure buyfruit --创建一个存储
--定义参数,参数之间用逗号隔开
@uid varchar(50),--用户名
@fcode varchar(50),--要买水果编号
@sl int --要买的水果总量
as
begin
    declare @kc int,@price float--定义变量名及数据类型、库存和单价
    select @kc=numbers,@price=price from Fruit where Ids = @fcode --查出库存和单价(变量赋值的第二种方法,查出数值进行赋值)
    --判断购买的数量是否大于库存
    if @sl>@kc
    begin
        print‘库存不足!‘
    end
    else--可以买
                   begin
                   declare @yue float --定义余额变量
                   select @yue = account from Login where [email protected]对余额进行赋值
                   --判断余额是否大于购买的数量*单价
                    if @yue >= @price * @sl
                    begin--购买之后更改表信息
                    update Fruit set numbers = [email protected] where Ids [email protected]更改库存的数量-购买的数量
                    update Login set Account = Account - @price*@sl where UserName= @uid -- 更改存款金额:现有金额-购买数量*单价
                    declare @sj int--定义一个变量随机
                    set @sj = CAST(RAND()*10000 as    int)--随机生成一个订单号,随机生成0-1之内的数
                    insert into Orders values (@sj,@uid,GETDATE())--getdate获取时间
                    insert into OrderDetails values(@sj,@fcode,@sl)
                    end
                    else--余额不足
                    begin
                           print‘余额不足!‘
                    end
            end

end

go
declare  @s int
exec @s = buyfruit ‘zhangsan‘,‘k001‘,1 --调用存储过程,
print @s

--删除存储过程
drop proc BuyFriut

二、触发器

--触发器,特殊的存储过程,执行的时间和存储过程不一样,存储过程在调用的时候执行,触发器是在执行某种操作的时候触发执行,相当于C#里面的事件

触发器为特殊类型的存储过程,可在执行语言事件时自动生效。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保留修改前的记录

一、删除之后执行for(after) delete

--建立 Loginone、biandong数据库
select * from Loginone
select * from biandong
go
--创建触发器
create trigger TR_LOGINONE_DELETE--create trigger创建触发器
on Loginone --on后面是对那个表执行
for delete --删除的时候执行
--after delete --删除之后执行
--instead of delete --替代执行

as
begin
    declare @uid varchar(50),@name varchar(50)
    select @uid=UserName,@name=Name from deleted--从delect删除表中找2个数据,数据已经删除
    insert into biandong values(@uid,@name,‘删除‘)
end
go
--在对表loginnoe进行删除的时候触发器执行
delete from Loginone where UserName=‘aaa‘

二、替代执行instead of

--instead of触发器
--删除student里面的数据的时候用另外两条语句替代,先删从表再删主表

create trigger TR_STUDENT_DELETE
on Student
instead of delete
as
begin
    declare @sno varchar(20)
    select @sno=sno from deleted
    delete from score where sno=@sno
    delete from student where sno=@sno
end
--执行删除的时候触发
delete from student where sno=‘101‘
select * from student
select * from score
select * from course
select * from teacher
时间: 2024-10-18 12:53:19

数据库之存储、触发器的相关文章

无数据库全脚本触发器设想

从有了计算机发展到今天,人类世界被代码完全改造,没有代码就没有如今的五彩斑斓的社会.对为代码的创造而努力的前辈们,我们应该心怀敬意. 接触过代码的都知道,代码需要数据库的支持可以更好的发挥能量.经过数代人的努力,代码机制的完善达到了无人能打破的瓶颈.我对代码的理解并不深刻,也没高深的码码功底,但本着自己对现有的代码的分析,大胆提出无数据库全脚本触发器设想.不是对前辈们创造的代码的质疑,只是我个人对代码的一个愿景. 数据库的出现,给了代码一个近乎完美的缓冲,我们可以借助代码写入我们想要存储的数据到

数据库:存储引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等

存储引擎概念数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能.现在许多不同的数据库管理系统都支持多种不同的数据引擎. 存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated . InnoDB(B+树) InnoDB 底层存储结构为B+树, B树的每个节点对应i

查看和改动MySQL数据库表存储引擎

要做一名合格的程序猿,除了把代码写的美丽外,熟知数据库方面的知识也是不可或缺的.以下总结一下怎样查看和改动MySQL数据库表存储引擎:        1.查看数据库所能支持的存储引擎:show engines;        2.查看某个数据库中某个表所使用的存储引擎:show table status from db_name where name='table_name';(注:将where条件去掉后能够查看某个数据库中全部表的存储引擎情况)        3.改动表引擎方法:alter t

SharedPreferences数据、openFileOutput文件、SQLite数据库文件存储位置

在模拟器中: SharedPreferences将XML文件保存在/data/data/<package name>/shared_prefs目录下, openFileOutput方法将文件保存在/data/data/<package name>/files目录下 SQLite数据库文件存放在/data/data/<package name>/databases目录下 SharedPreferences数据.openFileOutput文件.SQLite数据库文件存储位

数据库后台优化——触发器

为了保证数据库的完整性和一致性,很多的时候需要执行多条sql语句才能达到想要的目的. 在一对多的数据库关系中,比如卡号类别与卡号之间的关系.如果要取消某个类别的时候,就要连同齐下的所有卡号都删除.在现实中,注册的时候一般都会进行充值,当我想card表里面写东西的时候,就要向recharge表里面写一条充值记录.完成这两个操作才算完成这个功能的实现. 对于以上的需求,每个功能的实现 都伴随着多条sql语句的执行. 为了解决上面的问题,一共有两种解决方法.一是存储过程,二是触发器.上篇博客中已经讲解

数据库中存储日期的字段类型到底应该用varchar还是datetime

将数据库中存储时间的数据类型改为varchar(),这时最好让这些时间是数据库中自动生成的(一个没有格式的输入也可能会导致输出错误),因为存储类型为varchar(),所以获取到的值也就被认为是一个字符串,直接将数据库中的时间字符串进行转化(这时那些转化函数是能识别数据库中的时间函数的),客户端的时间格式不再影响转换过程. 不过数据库中存储时间的类型如果为字符型也会带来一些麻烦: 数据库中的时间仅仅是用来显示.查找的,那么影响还不算大,但如果对时间字段进行一些算法如计算星期.DateDiff.D

MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析

文/何登成 导读:   来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解InnoDB存储引擎实现的多版本控制技术(简称:MVCC). 基本知识 假设对于多版本控制(MVCC)的基础知识,有所了解.MySQL数据库InnoDB存储引擎为了实现多版本的一致性读,采用的是基于回滚段的协议. 行结构 MySQL数据库InnoDB存储引擎表数据的组织方式为主键聚簇索引.由于采用索引

在数据库中 存储图片 以及 在界面中显示图片(存储图片路径)- 这种方法相对与存储二进制文件好

花了一下午时间,终于学会了在数据库中存储图片,以及在界面中显示图片了. 存储图片有两种方法: 一种是:直接把图片转换成二进制文件存储在数据库中. 一种是:存储图片的路径到数据库,用的时候直接调用路径给image等图像控件即可. 两种方法,有利有弊,第一种方法适合存储量少且重要的图片信息.第二种方法适合存储量大但不是太重要的图片. 我使用的是第二种方法,简单,实用. 下面就是我具体的实现过程: 首先我新建了两个网页文件,insert_photo.aspx / select_photo.apsx 第

MySQL数据库InnoDB存储引擎

MySQL数据库InnoDB存储引擎Log漫游  http://blog.163.com/zihuan_xuan/blog/static/1287942432012366293667/ MySQL数据库InnoDB存储引擎,布布扣,bubuko.com

SQL Server 2008 R2 下移动数据库的存储位置

使用场景:1. 该数据库增长的较大,存储磁盘空间不足:   2. 在特定情况下该数据库需要移动到另外一块磁盘上(呵呵...我的情况就是之前的磁盘要还给别人) 步骤: 1. 新建查询 SELECT name, physical_name FROM sys.master_files WHERE database_id = DB_ID('yourDataBaseName'); GO 查看到结果会看到数据库主文件以及日志的名称和物理存储的地址名称   2.新建查询 use master alter da