编写SQL Server 2008架构更改脚本的最佳实践

时间:2014-05-28 13:19:32

标签: sql-server-2008 stored-procedures version-control scripting

目前,我们正在维护TFS中的表和proc更改。

存储过程包括create proc语句和drop proc语句:

IF OBJECT_ID ('ResponseTracking_Get_Requests') IS NOT NULL DROP PROCEDURE ResponseTracking_Get_Requests
GO

CREATE PROCEDURE [dbo].[ResponseTracking_Get_Requests]
 ( @RequestID int = null)

 AS

 SELECT 
    RequestID, 
    Category, 
    Title, 
    DateReceived, 
    Source, 
    ResponseRequired, 
    ResponseDateDue, 
    ApprovalLevelRequired, 
    FollowUpDate, 
    Request, 
    Status, 
    Notes, 
    ClosedDate, 
    EmployeeID, 
    CreationDateTime

FROM dbo.Request
Where (@RequestID IS NULL OR Request.RequestID = @RequestID)

随着初始表的更改,我已经检查了表对象是否存在:

IF OBJECT_ID ('Approval') IS NULL
      CREATE TABLE [dbo].[Approval](
        [RequestID] [int] NULL,
        [EmployeeID] [nvarchar](10) NULL,
        [CreationDateTime] [datetime2](0) NULL,
        [Level] [nvarchar](50) NULL,
        [FirstName] [nvarchar](50) NULL,
        [LastName] [nvarchar](50) NULL,
        [DateSent] [datetime2](0) NULL,
        [DateApproved] [datetime2](0) NULL,
        [Comments] [nvarchar](max) NULL,
        [SSMA_TimeStamp] [timestamp] NOT NULL
    ) ON [PRIMARY]
GO

我需要帮助弄清楚如何在初始create语句之后编写对表的任何修改/更改脚本。对我的proc脚本的任何建议都会很感激。

1 个答案:

答案 0 :(得分:0)

如果要在表格中添加新列,您可以尝试以下方式:

if not exists (select * from INFORMATION_SCHEMA.COLUMNS c where c.TABLE_NAME='Foo' and c.COLUMN_NAME='Bar')
    alter table Foo add Bar varchar(50) not null
go

这将检查表中是否存在新列,并且只有在数据库模式中找不到该列时才添加它。如果要删除列,可以反转逻辑。

如果您正在更改列定义,那么每次只执行ALTER TABLE Foo ALTER COLUMN Bar ...语句 - 检查模式以确定是否需要更改时没有真正的优势。

还有一点需要提及:删除和重新创建存储过程通常不是一个好主意,因为您将丢失为其配置的任何安全性(例如,授予执行)。我总是发现这种模式是更好的选择:

if not exists (select * from INFORMATION_SCHEMA.ROUTINES r where r.ROUTINE_NAME='getFoo' and r.ROUTINE_TYPE='PROCEDURE')
       exec('create procedure [getFoo] as select [Now]=getdate()')
go

alter procedure [getFoo](@someParam int) as
    SELECT * 
    FROM [Foo]
    WHERE SomeValue=@someParam
go

这样做意味着存储过程只创建一次,但每次运行脚本后都会更新。