15-07-22 数据库--存储过程、触发器

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 [email protected]
    delete from student where [email protected]
end
--执行删除的时候触发
delete from student where sno=‘101‘
select * from student
select * from score
select * from course
select * from teacher
时间: 2024-07-29 12:24:37

15-07-22 数据库--存储过程、触发器的相关文章

Mysql数据库的触发器、存储引擎和存储过程

数据库的触发器 1.触发器 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句): DELETE,INSERT,UPDATE 我们可以监视某表的变化,当发生某种变化时,触发某个操作. 能监视:增,删,改 触发操作:增,删,改 2.触发器应用场景: 1.当向一张表中添加或删除记录时,需要在相关表中进行同步操作.比如,当一个订单产生时,订单所购的商品的库存量相应减少. 2.当表上某列数据的值与其他表中的数据有联系时.比如,当某客户进行欠款消费

读取SQLServer数据库存储过程列表及参数信息

得到数据库存储过程列表: select * from dbo.sysobjects where OBJECTPROPERTY(id, N'IsProcedure') = 1 order by name 得到某个存储过程的参数信息:(SQL方法) select * from syscolumns where ID in      (SELECT id FROM sysobjects as a     WHERE OBJECTPROPERTY(id, N'IsProcedure') = 1     

存储过程 & 触发器

触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用.当对某一表进行诸如UPDATE. INSERT. DELETE 这些操作时, 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则. 触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性.除此之外,触发器还有其它许多不同的功能: (1)强化约束(Enforce restriction) 触发器能够实现比CHECK 语句更为复杂的约束.

SQLserver数据库之触发器

在SQLserver数据库中触发器中大致分为两种:DDL.DML触发器,即系统触发器与表触发器,系统触发器是对数据库对象进行操作的触发器,表触发器是对表格的增删改时候所进行的触发器.在这里我们就只说表的触发器. 表的触发器也分为两种,分别为:instead of.after(for):分别在表操作之前与表操作之后进行触发.而且两种触发器都有三个触发条件:insert.delete.update.基本语法为: create trigger tgr_name on table_name with e

达梦数据库的触发器管理

达梦数据库的触发器管理 触发器类型有分为操作前触发.操作后触发.DLL事件触发.系统事件触发.时间触发等等,触发器与存储过程的区别是触发器不能单独执行调用,而是在用户执行特定语句时自动触发执行触发器.以下举例常见的插入事件.更新事件做演示. 1.创建BEFORE触发器测试准备工作创建触发器前先建两张测试表(数据表和结果表),目的在数据表插入前就执行触发器里的语句,触发器里的语句是统计当前数据库的记录数.create table tab_before(id int, name varchar(20

索引、视图、SQL优化以及数据库存储过程

一.索引 索引是查询优化最有效和最常用的技术 索引是一个单独的.物理的数据库结构,它是指向表中某一列或若干列上的指针列表. mysql中,一个表的物理存储由两部分组成,一部分用于存放表的数据,另一部分存放索引,当进行数据搜索时,mysql会首先搜索索引,从中找到所需数据的起始位置的指针,再直接通过指针查找目标数据. 1.创建索引: CREATE INDEX 索引名 on 表名(要添加索引的列名) 可以给一个表中的多个列添加索引 通过在查询sql语句前加一句Explain可以分析索引效率, 有这样

SQL数据库——存储过程

SQL数据库--存储过程 语法格式: use 数据库名 在存储过程第一行就要首先声明所在数据库 go create(alter) proc 存储过程名 形参(@-), - as begin 执行体 (return) end go 注意:建立一个存储过程后,修改的话应该把create 改为alter. 执行体内的语法: 1.定义变量:declare 变量名(@-) 数据类型 2.赋值语法:set/select 变量名=表达式 3.if语句格式: if- begin - end else begin

数据库—存储过程。

存储过程: 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程的建立: 选中存储过程,右击--新建存储过程,则出现下面的代码. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ===========

MySQL数据库存储过程动态表建立(PREPARE)

PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/ DEALLOCATE PREPARE statement_name /*删除定义*/ 这是我项目当中用到的,用作参考使用: DELIMITER $$ DROP PROCEDURE IF EXISTS `gpsdata`.`sp_test`$$ CREATE DEFINER=`r

让你提前认识软件开发(28):数据库存储过程中的重要表信息的保存及相关建议

第2部分 数据库SQL语言 数据库存储过程中的重要表信息的保存及相关建议 1. 存储过程中的重要表信息的保存 在很多存储过程中,会涉及到对表数据的更新.插入或删除等,为了防止修改之后的表数据出现问题,同时方便追踪问题,一般会为一些重要的表建立一个对应的debug表.这个debug表中的字段要包括原表的所有字段,同时要增加操作时间.操作码和操作描述等字段信息. 例如,在某项目中,包括了如下一个重要的表tb_XXX: create table tb_XXX (      AAA