SQL Serever学习14——存储过程和触发器

简介: 存储过程在数据库中很多查询都是大同小异,编写他们费时费力,将他们保存起来,以后执行就很方便了,把SQL语句“封装”起来。存储过程的概念存储过程是一组SQL语句集,经过编译存储,可以”一次编译,多次执行“。

存储过程

在数据库中很多查询都是大同小异,编写他们费时费力,将他们保存起来,以后执行就很方便了,把SQL语句“封装”起来。

存储过程的概念

存储过程是一组SQL语句集,经过编译存储,可以”一次编译,多次执行“。除了第一次调用需要编译,后面都可以直接执行,执行速度更快,而不是普通SQL语句一样,每一次执行都要编译。

提供一种安全机制,如果某用户满意特定视图的使用权限,但是有使用存储过程的权限,通过执行存储过程,依旧可以获取存储过程中的表。

存储过程的优点

  • 改善系统性能,一次编译,多次执行,而普通SQL是每一次都编译执行
  • 安全机制
  • 重用性,可以反复调用
  • 共享性
  • 减少网络流量,存储过程是服务器上编译好的T-sql代码,对一个可能需要几百行的T-sql操作,在客户端只需要通过一条执行语句完成,而不是发送几百行代码

存储过程分类

分为3类:

系统存储过程

通常以sp_开头,有sp_helpdb查看数据库名称和大小

所在位置

 

还有sp_helptext用于小时规则,默认值,触发器

sp_renamedb重命名数据库

sp_rename 重命名表,列,用户定义的类型

sp_helplogins看用户登录的数据

 

用户存储过程

用户编写的存储过程(主要是的的就是这个部分)

 

扩展存储过程

为扩展sqlserver提供的方法,可以动态的加载和执行动态链接库的函数,以xp_开头

 

存储过程的创建语句

CREATE PROC[EDURE] 存储过程名

[@参数名    参数类型  =默认值 ]  OUTPUT

WITH  RECOMPILE

FOR  REPLICATION

AS SQL语句组

  

说明:OUTPUT是输出参数,

RECOMPILE表示sqlserver不对存储过程计划进行高速缓存,每一次重新编译,

FOR  REPLICATION表示存储过程只能在复制过程中使用,而且不和WITH  RECOMPILE一起使用。

 

存储过程执行语法格式

EXEC[UTE]   [@状态值=] 存储过程名   [@参数名=] 参数值

存储过程重新编译

sqlserver强制重新编译存储过程3种方法:

  • 系统存储过程 ,EXEC sp_recompile 存储过程名
  • 可以创建的时候使用WITH  RECOMPILE
  • 指定WITH  RECOMPILE选项,EXEC  存储过程  WITH  RECOMPILE

存储过程修改

就是把创建语句的CREATE 换成ALTER ,仅此而已。

ALTER PROC[EDURE] 存储过程名

[@参数名    参数类型  =默认值 ]  OUTPUT

WITH  RECOMPILE

FOR  REPLICATION

AS SQL语句组

  

存储过程删除

可以一次删除多个存储过程

DROP PROCEDURE PROC_3 , PROC_4

 

创建一个简单的存储过程

CREATE PROC 简单的存储过程
AS
BEGIN
	SELECT 商品编号 ,商品名称,销售价
	FROM 商品表
	WHERE 商品名称='笔记本'
END
GO

 

存储过程中输入输出参数在AS之前,申明,局部变量在AS之后,申明。

创建带参数的存储过程

CREATE PROC 带参数的存储过程
@SPM VARCHAR(20) ='笔记本'
AS
BEGIN
	DECLARE @JG SMALLMONEY
	SELECT @JG=销售价
	FROM 商品表
	WHERE 商品名称=@SPM

	RETURN @JG
END
GO

使用带参数,有返回值的存储过程

DECLARE @MAXJG SMALLMONEY
EXEC @MAXJG=带参数的存储过程
SELECT @MAXJG AS 最高的实际销售价格

 

 数据库的触发器

触发器的概念

触发器是特殊的存储过程,只不过它是在操作数据表(增删改)之前或者之后,自动执行的,不能铜鼓名称来调用。

优点

自动,操作表之后立即激活

实施更为复杂的数据约束

级联修改数据库中相关表,自动触发其他与之相关操作

跟踪变化,撤销和回滚

返回自定义错误信息(一般的约束是无法返回信息的)

 可以调用更多的存储过程

分类

触发器分为2类:

DML

DDL

DML触发器

进行了增删改之后自动激活,有分为AFTER触发(操作后触发,执行优先级在约束检查之后),和INSTEAD OF 触发(不会执行增删改操作,而是执行INSTEAD OF指定操作,执行优先级在约束检查之前)。

DDL触发器

在执行CREATE, ALTER  , GRANT , DENY , REVOKE, UPDATE STATISTICS语句触发。

 

触发器专用临时表

有2个触发器专用临时表INSERTED  和DELETED

表存在INSERT触发器(DDL触发器),插入数据,系统自动创建一个与表一样结构的INSERTED临时表,新的记录同时,添加到触发器表和INSERTED中,INSERTED保存的副本,方便用户查找当前插入数据。

表存在DELETE触发器,删除数据,系统自动创建一个DELETED临时表,用来保存被删除记录。

修改表,就是删除一条记录,然后插入一条记录,删除记录添加到DELETED表,新增记录添加到INSERTED表。

 

触发器的创建和触发

DML触发器

CREATE TRIGGER 触发器  ON  表名

FOR | AFTER | INSTEAD OF   INSERT  ,UPDATE  , DELETE

AS  SQL语句

 

DDL触发器

CREATE TRIGGER 触发器 ON  ALL  SERVER  |  DATABASE

FOR |  AFTER 事件种类

AS   SQL语句

触发器的修改

和创建类似,就是把CREATE 改为ALTER

 

触发器的删除

DROP TRIGGER 触发器, 触发器2

 

触发器的启用与禁用

禁用触发器

ALTER TABLE 表名

DISABLE TRIGGER 触发器名

 

 

DISABLE  TRIGGER  触发器名

 

 

禁用数据库级别触发器

DISABLE TRIGGER 触发器名  ON  DATABASE

  

启用触发器

ALTER TABLE 表名

ENABLE TRIGGER 触发器名

 

 

ENABLE TRIGGER  触发器  ON  表名

 

 

简单的触发器

USE 销售管理
GO
CREATE TRIGGER tr_insert_mj
ON 买家表 FOR INSERT --指定触发类型
AS
BEGIN
	PRINT '有新买家插入到买家表'
END
GO

验证,插入一条数据

INSERT INTO 买家表
VALUES('M05','MARS',12232323,'J01')
GO

看消息,触发器运行了

 

 

创建一个DDL触发器,当删除数据库中的表时,就撤销该操作,并提示:禁止删除数据库表!

USE 销售管理
GO
CREATE TRIGGER tr_drop_dll
ON DATABASE
FOR DROP_TABLE
AS
BEGIN
	ROLLBACK TRANSACTION
	PRINT '禁止删除数据表!'
END
GO

验证一下,删除表

DROP TABLE 买家表
GO

看信息提示

 

 禁用触发器

ALTER TABLE 买家表
DISABLE TRIGGER tr_insert_mj

或者

DISABLE TRIGGER tr_insert_mj ON 买家表

  

 

启用触发器

ALTER TABLE 买家表
ENABLE TRIGGER tr_insert_mj

或者

ENABLE TRIGGER tr_insert_mj ON 买家表

  

 

目录
相关文章
|
存储 SQL 数据库
SQL Server存储过程的优缺点
【10月更文挑战第18天】SQL Server 存储过程具有提高性能、增强安全性、代码复用和易于维护等优点。它可以减少编译时间和网络传输开销,通过权限控制和参数验证提升安全性,支持代码共享和复用,并且便于维护和版本管理。然而,存储过程也存在可移植性差、开发和调试复杂、版本管理问题、性能调优困难和依赖数据库服务器等缺点。使用时需根据具体需求权衡利弊。
474 1
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
1488 57
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
938 11
|
SQL 安全 前端开发
Web学习_SQL注入_联合查询注入
联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
963 2
|
存储 SQL 数据库
SQL Server存储过程的优缺点
【10月更文挑战第17天】SQL Server 存储过程是预编译的 SQL 语句集,存于数据库中,可重复调用。它能提高性能、增强安全性和可维护性,但也有可移植性差、开发调试复杂及可能影响数据库性能等缺点。使用时需权衡利弊。
383 3
|
存储 SQL 缓存
SQL Server存储过程的优缺点
【10月更文挑战第22天】存储过程具有代码复用性高、性能优化、增强数据安全性、提高可维护性和减少网络流量等优点,但也存在调试困难、移植性差、增加数据库服务器负载和版本控制复杂等缺点。
742 1
|
存储 SQL 数据库
Sql Server 存储过程怎么找 存储过程内容
Sql Server 存储过程怎么找 存储过程内容
924 1
|
SQL 存储 数据库
SQL学习一:ACID四个特性,CURD基本操作,常用关键字,常用聚合函数,五个约束,综合题
这篇文章是关于SQL基础知识的全面介绍,包括ACID特性、CURD操作、常用关键字、聚合函数、约束以及索引的创建和使用,并通过综合题目来巩固学习。
704 1
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法