问题描述:
通常我们在对一个系统再开发时,因为业务的扩展需要在已创建的表中新增字段,也需要修改相应的存储过程,而存储过程却是外面客户正在大量使用。这时候一不小心就会影响到客户。
举例:就拿我们平常最常用的用户表来说吧。
已有条件 :
表 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 的用户不受到影响。