SQL Server存储过程(数据库引擎)使用详解

news2024/11/17 21:23:54

存储过程(数据库引擎)

  • 一、背景知识
    • 1.1、使用存储过程的好处
    • 1.2、存储过程的类型
  • 二、创建存储过程
  • 三、修改存储过程
  • 四、删除存储过程
  • 五、执行存储过程
    • 5.1、建议
    • 5.2、使用 Transact-SQL执行存储过程
  • 六、授予对存储过程的权限
    • 6.1、授予对存储过程的权限
    • 6.2、授予对架构中所有存储过程的权限
  • 总结

一、背景知识

SQL Server 中的存储过程是一组一个或多个 Transact-SQL 语句的引用。过程类似于其他编程语言中的构造,因为它们可以:

  • 接受输入参数并以输出参数的形式向调用程序返回多个值。

  • 包含在数据库中执行操作的编程语句。其中包括调用其他过程。

  • 向调用程序返回状态值,以指示成功或失败(以及失败的原因)。

1.1、使用存储过程的好处

(1)减少服务器/客户端网络流量。
过程中的命令作为单批代码执行。这可以显著减少服务器和客户端之间的网络流量,因为只有执行过程的调用才会通过网络发送。如果没有过程提供的代码封装,每一行代码都必须跨网络。

(2)更强的安全性。
多个用户和客户端程序可以通过一个过程对基础数据库对象执行操作,即使用户和程序对这些基础对象没有直接权限也是如此。该过程控制执行哪些流程和活动,并保护基础数据库对象。这消除了在单个对象级别授予权限的要求,并简化了安全层。

(3)可以在 CREATE PROCEDURE 语句中指定 EXECUTE AS 子句,以启用模拟其他用户,或者使用户或应用程序能够执行某些数据库活动,而无需对基础对象和命令具有直接权限。

(4)通过网络调用过程时,只有执行过程的调用可见。因此,恶意用户无法查看表和数据库对象名称、嵌入自己的 Transact-SQL 语句或搜索关键数据。

(5)使用过程参数有助于防范 SQL 注入攻击。由于参数输入被视为文本值而不是可执行代码,因此攻击者更难将命令插入过程内的 Transact-SQL 语句并危及安全性。

(6)过程可以加密,有助于混淆源代码。

(7)代码的重用。
任何重复数据库操作的代码都是过程中封装的完美候选项。这消除了对相同代码的不必要重写,减少了代码不一致,并允许拥有必要权限的任何用户或应用程序访问和执行代码。

(8)更易于维护。
当客户端应用程序调用过程并将数据库操作保留在数据层中时,只有过程必须针对基础数据库中的任何更改进行更新。应用层保持独立,不必知道对数据库布局、关系或进程的任何更改。

(9)改进的性能。
默认情况下,过程在第一次执行时进行编译,并创建一个在后续执行中重复使用的执行计划。由于查询处理器不必创建新计划,因此处理该过程所需的时间通常更少。如果过程引用的表或数据发生了重大更改,则预编译计划实际上可能会导致过程执行速度变慢。在这种情况下,重新编译过程并强制使用新的执行计划可以提高性能。

1.2、存储过程的类型

(1)User-defined。
可以在User-defined数据库中或在除 Resource 数据库之外的所有系统数据库中创建用户定义过程。

(2)Temporary。
Temporary过程是用户定义过程的一种形式。临时过程类似于永久过程,只是临时过程存储在 tempdb 中。有两种类型的临时过程:本地和全局。它们在名称、可见性和可用性方面彼此不同。地方临时程序的名称的第一个字符为一个数字符号(#);它们仅对当前用户连接可见,并且在连接关闭时将被删除。全局临时程序有两个数字符号 (##) 作为其名称的前两个字符;创建后,任何用户都可以看到它们,并且使用该过程在最后一个会话结束时将其删除。

(3)System。
System过程包含在 SQL Server 中。它们以物理方式存储在内部隐藏的资源数据库中,并在逻辑上出现在每个系统和用户定义数据库的 sys 模式中。此外,msdb 数据库还包含 dbo 架构中用于计划警报和作业的系统存储过程。由于系统过程以前缀 sp_ 开头,因此建议您在命名用户定义过程时不要使用此前缀。

(4)Extended User-Defined。
Extended User-Defined过程允许使用编程语言(如 C)创建外部例程。这些过程是 SQL Server 实例可以动态加载和运行的 DLL。

二、创建存储过程

需要数据库中的“创建过程”权限,以及对在其中创建过程的架构的“更改”权限。

示例:使用不同的过程名称创建存储过程。

USE AdventureWorks;  
GO  
CREATE PROCEDURE HumanResources.uspGetEmployeesTest2   
    @LastName nvarchar(50),   
    @FirstName nvarchar(50)   
AS   

    SET NOCOUNT ON;  
    SELECT FirstName, LastName, Department  
    FROM HumanResources.vEmployeeDepartmentHistory  
    WHERE FirstName = @FirstName AND LastName = @LastName  
    AND EndDate IS NULL;  
GO

要运行该过程,执行如下指令:

EXECUTE HumanResources.uspGetEmployeesTest2 N'Ackerman', N'Pilar';  
-- Or  
EXEC HumanResources.uspGetEmployeesTest2 @LastName = N'Ackerman', @FirstName = N'Pilar';  
GO  
-- Or  
EXECUTE HumanResources.uspGetEmployeesTest2 @FirstName = N'Pilar', @LastName = N'Ackerman';  
GO

三、修改存储过程

修改存储过程具有如下限制:

  • 不能将事务处理 SQL 存储过程修改为 CLR 存储过程,反之亦然。

  • 如果以前的过程定义是使用 WITH ENCRYPTION 或 WITH RECOMPILE 创建的,则仅当这些选项包含在 ALTER PROCEDURE 语句中时,才会启用这些选项。

需要的权限:需要对过程具有“更改过程”权限。

使用示例:
(1)创建的过程返回 Adventure Works Cycle 数据库中所有供应商的名称、他们提供的产品、他们的信用评级和可用性。

IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL   
    DROP PROCEDURE Purchasing.uspVendorAllInfo;  
GO  
CREATE PROCEDURE Purchasing.uspVendorAllInfo  
WITH EXECUTE AS CALLER  
AS  
    SET NOCOUNT ON;  
    SELECT v.Name AS Vendor, p.Name AS 'Product name',   
      v.CreditRating AS 'Rating',   
      v.ActiveFlag AS Availability  
    FROM Purchasing.Vendor v   
    INNER JOIN Purchasing.ProductVendor pv  
      ON v.BusinessEntityID = pv.BusinessEntityID   
    INNER JOIN Production.Product p  
      ON pv.ProductID = p.ProductID   
    ORDER BY v.Name ASC;  
GO

注意:删除并重新创建现有存储过程会删除已显式授予该存储过程的权限。请改用 ALTER。

(2)修改了该过程。删除该子句并修改过程的主体,以仅返回提供指定产品的供应商。和函数自定义结果集的外观。

ALTER PROCEDURE Purchasing.uspVendorAllInfo  
    @Product varchar(25)   
AS  
    SET NOCOUNT ON;  
    SELECT LEFT(v.Name, 25) AS Vendor, LEFT(p.Name, 25) AS 'Product name',   
    'Rating' = CASE v.CreditRating   
        WHEN 1 THEN 'Superior'  
        WHEN 2 THEN 'Excellent'  
        WHEN 3 THEN 'Above average'  
        WHEN 4 THEN 'Average'  
        WHEN 5 THEN 'Below average'  
        ELSE 'No rating'  
        END  
    , Availability = CASE v.ActiveFlag  
        WHEN 1 THEN 'Yes'  
        ELSE 'No'  
        END  
    FROM Purchasing.Vendor AS v   
    INNER JOIN Purchasing.ProductVendor AS pv  
      ON v.BusinessEntityID = pv.BusinessEntityID   
    INNER JOIN Production.Product AS p   
      ON pv.ProductID = p.ProductID   
    WHERE p.Name LIKE @Product  
    ORDER BY v.Name ASC;  
GO

要运行修改后的存储过程执行以下:

EXEC Purchasing.uspVendorAllInfo N'LL Crankarm';  
GO

四、删除存储过程

限制:删除过程可能会导致依赖对象和脚本在对象和脚本未更新以反映过程的删除时失败。但是,如果创建了同名和相同参数的新过程来替换已删除的过程,则引用它的其他对象仍将成功处理。

权限:需要对过程所属的架构具有 ALTER 权限,或对过程具有 CONTROL 权限。

使用示例:
(1)获取要在当前数据库中删除的存储过程的名称。

SELECT name AS procedure_name
    , SCHEMA_NAME(schema_id) AS schema_name
    , type_desc
    , create_date
    , modify_date
FROM sys.procedures;

(2)从当前数据库中删除的存储过程。

DROP PROCEDURE [<stored procedure name>];
GO

五、执行存储过程

有两种不同的方法来执行存储过程。第一种也是最常见的方法是让应用程序或用户调用该过程。第二种方法是将过程设置为在 SQL Server 实例启动时自动运行。当应用程序或用户调用过程时,将在调用中显式声明 Transact-SQL EXECUTE 或 EXEC 关键字。如果该过程是 Transact-SQL 批处理中的第一个语句,则可以在没有 EXEC 关键字的情况下调用和执行该过程。

限制:

  • 匹配系统过程名称时使用调用数据库排序规则。因此,在过程调用中始终使用系统过程名称的确切大小写。
  • 如果用户定义过程与系统过程同名,则用户定义过程可能永远不会执行。

5.1、建议

(1)执行系统存储过程。
系统过程以前缀ysy开头。由于它们在逻辑上出现在所有用户和系统定义的数据库中,因此可以从任何数据库执行它们,而不必完全限定过程名称。但是,建议使用架构名称对所有系统过程名称进行架构限定,以防止名称冲突。下面的示例演示调用系统过程的建议方法。

EXEC sys.sp_who;

(2)执行用户定义的存储过程。
执行用户定义的过程时,建议使用架构名称限定过程名称。这种做法可以稍微提高性能,因为数据库引擎不必搜索多个架构。如果数据库在多个架构中具有同名的过程,它还可以防止执行错误的过程。

USE AdventureWorks2019;  
GO  
EXEC dbo.uspGetEmployeeManagers @BusinessEntityID = 50;
GO

或者

EXEC AdventureWorks2019.dbo.uspGetEmployeeManagers 50;  
GO

如果指定了非限定的用户定义过程,数据库引擎将按以下顺序搜索该过程:

  • 当前数据库的架构。s

  • 调用方的默认架构(如果它是在批处理中还是在动态 SQL 中执行)。或者,如果非限定过程名称出现在另一个过程定义的正文中,则接下来将搜索包含此其他过程的架构。

  • 当前数据库中的架构。

(3)自动执行存储过程。
每次 SQL Server 启动时都会执行标记为自动执行的过程,并在该启动过程中恢复数据库。将过程设置为自动执行对于执行数据库维护操作或使过程作为后台进程连续运行非常有用。
自动执行的过程使用与 sysadmin 固定服务器角色成员相同的权限进行操作。该过程生成的任何错误消息都将写入 SQL Server 错误日志。
可以拥有的启动过程数量没有限制,但请注意,每个启动过程在执行时都会消耗一个工作线程。如果必须在启动时执行多个过程,但不需要并行执行它们,请将一个过程设置为启动过程,并让该过程调用其他过程。这仅使用一个工作线程。

(4)设置、清除和控制自动执行。
只有系统管理员 才能将过程标记为自动执行。此外,该过程必须位于数据库中,并且不能具有输入或输出参数。
使用sp_procoption可以:

  • 将现有过程指定为启动过程。

  • 停止在 SQL Server 启动时执行过程。

5.2、使用 Transact-SQL执行存储过程

(1)示例一,执行存储过程:示如何执行需要一个参数的存储过程。该示例使用指定为参数的值 6 执行存储过程。

USE AdventureWorks2019;  
GO  
EXEC dbo.uspGetEmployeeManagers 6;  
GO

(2)示例二,设置或清除自动执行的过程:启动过程必须位于数据库中,并且不能包含 INPUT 或 OUTPUT 参数。当恢复所有数据库并在启动时记录“恢复已完成”消息时,存储过程的执行将开始。

EXEC sp_procoption @ProcName = N'<procedure name>'   
    , @OptionName = 'startup'   
    , @OptionValue = 'on';
GO

(3)示例三,阻止过程自动执行:使用 sp_procoption 停止过程自动执行。

EXEC sp_procoption @ProcName = N'<procedure name>'      
    , @OptionName = 'startup'
    , @OptionValue = 'off';
GO

六、授予对存储过程的权限

可以将权限授予数据库中的现有用户、数据库角色或应用程序角色。

授予者(或使用 AS 选项指定的主体)必须具有具有 GRANT OPTION 的权限本身,或者具有暗示要授予的权限的更高权限。需要对过程所属的架构具有 ALTER 权限,或对过程具有 CONTROL 权限。

6.1、授予对存储过程的权限

示例:向应用程序角色授予对存储过程的权限。

USE AdventureWorks2012;   
GRANT EXECUTE ON OBJECT::HumanResources.uspUpdateEmployeeHireInfo  
    TO Recruiting11;  
GO

6.2、授予对架构中所有存储过程的权限

示例:向架构中存在或将要存在的所有存储过程授予应用程序角色的权限。

USE AdventureWorks2012;   
GRANT EXECUTE ON SCHEMA::HumanResources
    TO Recruiting11;  
GO

总结

不要从自动执行的过程返回任何结果集。由于该过程由 SQL Server 而不是应用程序或用户执行,因此结果集无处可去。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

院士联合指导+超强专家阵容+丰厚奖金机会,第十二届“麒麟杯”大赛报名正式开启!

当前&#xff0c;开放、协作、共享的开源模式已成为全球软件技术和产业创新的主导&#xff0c;也为信息技术国产自主化提供了强大助力。高校师生作为国产开源建设的主要技术群体之一&#xff0c;是国产开源未来发展的中坚力量。 2023年第十二届“麒麟杯”全国开源应用软件开发…

强制变成Android的形状,iPhone这波更新严重违背祖训

众所周知&#xff0c;苹果每年要开两次发布会。 秋季发布会的主角是新 iPhone &#xff0c;而6月的 WWDC 全球开发者大会则会以软件为主。 WWDC 2023 将于6月5日举行&#xff0c;iOS 17、macOS 14 及新版本 tvOS、WatchOS 都将发布。 同时新的混合现实设备所搭载的 xrOS 也有…

创建Windows 11恢复U盘的两种方法

我们在使用电脑的过程中&#xff0c;无法预知未来会出现什么问题。当您遇到一些严重的系统问题时&#xff0c;您可能需要从故障的计算机中恢复。不幸的是&#xff0c;对于大多数用户来说&#xff0c;这意味着从头开始&#xff0c;因为他们没有提前创建恢复媒体。 虽然Windows 1…

每日学术速递4.20

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Avatars Grow Legs: Generating Smooth Human Motion from Sparse Tracking Inputs with Diffusion Model(CVPR 2023) 标题&#xff1a;化身长腿&#xff1a;使用扩散模型从稀疏跟踪…

知识蒸馏之自蒸馏【附代码】

知识蒸馏的核心思想就是将大模型的知识传给小模型。 这里的知识通常就是模型所学的数据分布。大模型特点一般是具有非常高的精度&#xff0c;但可能在速度上不行&#xff0c;或者是不易部署&#xff0c;小模型通常是易部署&#xff0c;速度快但精度不如大模型。 因此可以将大…

【程序员面试金典】面试题 02.07. 链表相交

【程序员面试金典】面试题 02.07. 链表相交 题目描述解题思路 题目描述 描述&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#…

使用Storm proxies动态代理IP浅析影响在线代理IP质量的因素?

影响在线代理IP质量的因素有很多&#xff0c;主要包括以下几个方面&#xff1a; 服务器稳定性&#xff1a;在线代理IP的稳定性和可用性与其所在的服务器质量密切相关。如果服务器配置低、网络不稳定、带宽不足等因素&#xff0c;都可能导致在线代理IP的质量下降。IP地址的稳定性…

【LeetCode】剑指 Offer 66. 构建乘积数组 p312 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/gou-jian-cheng-ji-shu-zu-lcof/ 1. 题目介绍&#xff08;66. 构建乘积数组&#xff09; 给定一个数组 A[0,1,…,n-1]&#xff0c;请构建一个数组 B[0,1,…,n-1]&#xff0c;其中 B[i] 的值是数组 A 中除了下标 i 以外的元素…

5.1.1树的定义,基本术语及性质

空树&#xff1a;结点数为0的树 除了根节点外&#xff0c;任何一个结点都有且仅有一个前驱。 子树也可看成一个新的树 所以树其实是一个递归结构 树形逻辑结构的应用 下面我们来看树的基本术语 1.节点之间的关系描述 F是你的兄弟结点&#xff0c;GHIJ就是你的堂兄弟结点。 还…

海信激光电视将亮相中国家电及消费电子博览会 科技定义家庭观影

4月27日至30日,中国家电及消费电子博览会(简称AWE)将在上海新国际博览中心举办。本届AWE强势回归,展馆规模扩大至14个,展示面积超过16万平方米,将吸引超过1200家国内外企业参展,参观人次预计将突破40万。 作为亚洲规模最大的国际家电及消费电子展览会,本届AWE以“智科技,创未来…

设计模式简介及面向对象设计原则

文章目录 前言一、什么是设计模式1、从面向对象谈起2、深入理解面向对象3、软件设计固有的复杂性4、软件设计复杂的根本原因——“变化”5、如何解决复杂性&#xff1f;6、软件设计的目标 二、常用设计模式及分类1、常用的七种设计模式2、设计模式分类 三、面向对象设计原则1、…

半导体封装用除泡烤箱真空压力可编程PID控制的解决方案

摘要&#xff1a;真空压力除泡机和除泡烤箱在电子行业的应用十分广泛&#xff0c;但现有除泡机存在的最大问题是选择了开关式阀门&#xff0c;无法实现真空和压力既准确又快速的控制。为此&#xff0c;本文提出了升级改造技术方案&#xff0c;即采用双向PID控制器和快速电动球阀…

Docker部署开源密码管理器Bitwarden, 并申请免费ssl证书自动刷新永不过期

GitHub传送阵 废话 出于一种习惯&#xff0c;我基本上不会在不同的应用上使用相同的密码&#xff0c;这种习惯使得我需要在备忘录上不胜其烦地记录大量的账号密码&#xff0c;每次登录一个系统&#xff0c;如果chrome的密码管理器不可用&#xff0c;我就需要打开备忘录检索。…

基于matlab使用波束成形生成 802.11ad 波形

一、前言 本示例说明如何使用WLAN工具箱和相控阵系统工具箱对带有相控阵的IEEE 802.11ad DMG波形进行波束成形。 二、介绍 IEEE 802.11ad 定义了工作在 60 GHz 的定向千兆位 &#xff08;DMG&#xff09; 传输格式。为了克服在 60 GHz 下遇到的大路径损耗&#xff0c;IEEE 802.…

进阶必看 | 有关BIMer强推的5本书,看过的都竖大拇指!

大家好&#xff0c;还是我&#xff0c;建模助手。 本期的主题都是围绕着&#xff1a;热点。除了建模助手的品牌资讯之外&#xff0c;还有一些与行业相关的热点。 这不&#xff0c;4月23日是正好的世界读书日&#xff0c;给大家搞一波书籍推荐&#xff01; 小编认为&#xff…

【Dubbo核心 详解二】Dubbo服务消费的详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Dubbo专栏 文章目录 引言介绍 Dubbo 服务消费的详解的目的和背景概述 Dubbo 服务消费的过程和核心概念一、Dubbo 服务消费的基础知识1. Dubbo 服务消费的架…

动力节点springsecurity笔记-SpringSecurity 集成thymeleaf

15 SpringSecurity 集成thymeleaf 此项目是在springsecurity-12-database-authorization-method 的基础上进行 复制springsecurity-12-database-authorization-method 并重命名为springsecurity-13-thymeleaf 15.1 添加thymeleaf依赖 | org.springframework.boot spring-…

h5逻辑_解决h5页面嵌入ios兼容性问题

安全区域 如下图所示&#xff5e; 蓝色部分为安全区域。处于安全区域内的内容不受圆角、齐刘海、小黑条的影响。 若是将h5页面嵌入app中&#xff0c;就需要进行适配—> 让h5页面展示在安全区域内。 tips: 安全区域是在ios11之后并且是iPhoneX及以上机型才有的。 因此我们只…

【微信小程序】详解behaviors,如何使用behaviors

一&#xff0c;behaviors 1.1什么是 behaviors&#xff1f; behaviors 是小程序中&#xff0c; 用于实现组件间代码共享的特性 &#xff0c;类似于 Vue.js 中的 “mixins”。 1.2behaviors 的工作方式 每个 behavior 可以包含一组 属性、数据、生命周期函数和方法 。组件引…

【PE】inline hook的实现

【PE】inline hook的实现 hook思路 最基本的5字节的hook思路如下&#xff0c;有了这个思路&#xff0c;可以用更多的方式进行hook 通过修改目标函数开头的5个字节为jmp …&#xff0c;劫持程序执行流跳转过去之后&#xff0c;再把API开头5字节改回来&#xff08;UnHook&…