存储过程的修改

问题描述:

通常我们在对一个系统再开发时,因为业务的扩展需要在已创建的表中新增字段,也需要修改相应的存储过程,而存储过程却是外面客户正在大量使用。这时候一不小心就会影响到客户。

 

举例:就拿我们平常最常用的用户表来说吧。

 

已有条件

Tab_UserInfo

存储过程: Proc_UserInfo_Insert (前提 UsrI_ID 是自动增长)

--=================================================--

-- Author:     mocklystone

--Createtime:  2009-11-28

--Describ:     添加用户信息

--=================================================--

create procedure Proc_UserInfo_Insert

@username nchar ( 10),

@userpwd nchar ( 10)

as

insert into Tab_UserInfo( UsrI_LoginName, UsrI_Loginpwd)

values ( @username, @userpwd)

 

业务需求改动

假如我想给用户添加类型,于是需要添加字段 usrI_Type ,且该字段必须有值。

 

那么就会出现两种情况:

1、  用户表 Tab_UserInfo 有数据,如果 usrI_Type 不允许空的话,无法在表中插入此字段。

因为如果设为不允许空的话,则其它以前的数据新增的这个字段就没有相应的值,所以不允许插入此字段)

2、  用户表 Tab_UserInfo 无数据,则不会出现上述情况。

 

接下来重点讲第一种情况的解决方法。

 

先在用户表 Tab_UserInfo 插入 usrI_Type 字段,属性设置允许为空,然后新建查询

update Tab_UserInfo set UsrI_Type= 0

然后再修改表 Tab_UserInfo UsrI_Type 字段属性,为不允许为空,即可。

 

存储过程修改:

--=================================================--

-- Author:        mocklystone

--Createtime:     2009-11-28

--Describ:        添加用户信息

--LastUPdateTime: 2009-11-28 mocklystone 添加参数 @usertype

--=================================================--

create procedure Proc_UserInfo_Insert

@username nchar ( 10),

@userpwd nchar ( 10),

@usertype int = 0

as

insert into Tab_UserInfo( UsrI_LoginName, UsrI_Loginpwd, UsrI_Type)

values ( @username, @userpwd, @usertype)

 

最大的不同在于存储过程中的 @usertype int = 0 是有默认值的。这样就会使外面正在使用没有参数 @usertype 存储过程 Proc_UserInfo_Insert 的用户不受到影响。

 
<think> 嗯,用户这次的问题很明确,就是想知道SQL Server存储过程修改后的保存方法。看来用户之前可能遇到了保存困惑,特别是引用[1]提到的那个常见误区——把执行按钮当成单纯的执行操作。 用户应该是在SSMS修改存储过程时遇到了保存困难,可能习惯性找保存图标但没找到。引用[1]提到的案例特别典型:很多人以为F5是执行,但其实在修改存储过程时它实际触发的是ALTER操作。这个设计确实有点反直觉,尤其对从Visual Studio转过来的开发者。 从用户引用的资料看,ta已经注意到"Modify"操作会自动生成ALTER语句这个细节了,但可能还不清楚具体保存机制。需要重点解释三种保存方式的本质区别: 1. F5执行ALTER语句(最隐蔽但最高效) 2. 显式写ALTER脚本(最规范) 3. 生成脚本到文件(最安全) 用户可能没意识到权限问题,所以补充了ALTER权限说明。另外引用[2]提到的依赖关系检查也很重要,避免用户修改后导致其他对象失效。 注意到用户引用的资料都比较旧(SQL Server 2005),但方法至今通用。不过可以提一句新版SSMS其实在工具栏加了"保存"按钮(虽然底层仍是执行ALTER),这对习惯GUI操作的用户更友好。 最后生成的问题特意加入了"修改后如何验证"这个实用场景,因为很多用户改完存储过程不确定是否生效。事务回滚那个问题是考虑到用户引用[3][5]提到过CDC和事务,可能对错误处理感兴趣。 </think> 在 SQL Server 中修改存储过程后,保存修改需通过执行 `ALTER PROCEDURE` 语句或使用 SSMS 的特定操作实现,而非传统的文件保存方式。以下是具体方法: --- ### 一、通过 SSMS 图形界面保存(推荐) 1. **打开修改窗口** - 在 SSMS 中展开:数据库 → `可编程性` → `存储过程` - 右键目标存储过程 → 选择 `修改` - **关键提示**:此时自动生成 `ALTER PROCEDURE` 语句(引用[1]) ```sql ALTER PROCEDURE [dbo].[存储过程名] AS ... ``` 2. **修改代码并保存** - 编辑存储过程逻辑后,**点击工具栏的 `执行` 按钮(或按 `F5`)** - ⚠️ 注意: - 此操作本质是执行 `ALTER PROCEDURE` 语句(不是运行存储过程) - *SSMS 无显式“保存”按钮,这是保存修改的唯一方式*(引用[1]) 3. **验证修改** ```sql -- 查看修改后的定义 SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('存储过程名'); ``` --- ### 二、通过 T-SQL 脚本直接保存 1. **显式编写 ALTER 语句** ```sql USE [数据库名]; GO ALTER PROCEDURE [dbo].[存储过程名] @参数1 INT, @参数2 VARCHAR(50) AS BEGIN -- 修改后的逻辑 SELECT * FROM 名 WHERE 条件; END GO ``` - 执行此脚本即完成保存 2. **生成修改脚本** - 右键存储过程 → `编写存储过程脚本为` → `ALTER 到` → 文件/新窗口 - 修改后执行脚本保存 --- ### 三、注意事项 1. **权限要求** - 用户需具备 `ALTER PROCEDURE` 权限(引用[2]) 2. **依赖关系检查** - 修改前建议右键存储过程 → `查看依赖关系`,避免影响关联对象(引用[2]) 3. **加密存储过程** - 若原存储过程用 `WITH ENCRYPTION` 创建,修改时也需包含该选项,否则加密会失效 --- ### ⚠️ 常见误区 - **误点“执行”按钮**:在修改窗口点击 `F5` 是 **保存修改**,而非运行存储过程(引用[1]) - **直接关闭窗口**:未执行 `ALTER` 语句时,关闭窗口会导致修改丢失 - **文件保存无效**:在 SSMS 中编辑的代码仅存在于内存,必须执行才能保存到系统(引用[4]) --- ### 示例:完整修改流程 ```sql -- 1. 修改前查看原定义 EXEC sp_helptext 'pro_教师信息'; -- 2. 执行ALTER保存修改 ALTER PROCEDURE dbo.pro_教师信息 AS BEGIN -- 新逻辑(例如增加筛选条件) SELECT * FROM 教师 WHERE 学院='计算机学院'; END GO -- 3. 验证 EXEC pro_教师信息; -- 执行验证逻辑 ``` > 此机制确保存储过程修改是事务性的,避免未保存的中间状态影响生产环境(引用[3][5])。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值