如何使用< 10表和< 20存储过程管理sql server 2005数据库升级的生产部署

时间:2010-02-10 20:47:55

标签: sql-server-2005 testing

我有一个Sql Server 2005 Standard生产数据库,其中包含一些&lt; 120表和<150个存储过程。 较新的版本更新除了应用程序层升级之外还需要升级到db。根据提供的资源,我打算按如下方式执行升级:

  • 为每个新表创建使用插入数据创建脚本(如果有)。请将脚本命名为:n.Create_Table_Name.sql
  • 为每个新存储过程创建具有权限的脚本。请为n.Create_StoredProcName.sql
  • 中的每个proc编写脚本
  • 为每个名为n.Alter_StoredProcName.sql
  • 的alter proc新文件创建
  • 逐个运行每个脚本到TEST db。如果测试失败(必须更改某些内容等,请在测试数据库之上恢复full_backup并重新开始。

我有一个DDL触发器,它将每个DDL事件存储在一个表中 - 例如我可以轻松跟踪特定时间点内所有内容的变化。

除了SSMS之外还有任何脚本工具我可以简单地传递对象的名称,这些对象将为我生成所有ddl语句+我可以依赖的权限吗?

整个过程有点慢,但已经工作了好几次,但是如果有任何改进的话我会徘徊(除了SSMS之外没有其他软件可以在我们的PROD服务器上安装)

2 个答案:

答案 0 :(得分:0)

您可以创建将使用SMO的PowerShell脚本并为您完成工作。一旦SSMS实际上基于SMO,您就可以依赖它。

答案 1 :(得分:0)

Here is the cmd for running the sql files

使用ScriptDb.exe结束,或者您可以使用SSMS。在Windows 7和SQL Server 2008上一开始没有正确构建。不得不首先找到合适的dll来构建它......

ScriptDb.exe -con:server =(local); trusted_connection = yes -outDir:。 -ScriptAllDatabases -Permissions -Purge

并且只复制所需对象的文件:     选择不同的

  'COPY D:\Temp\Temp\DBNAME\Programmability\StoredProcedures\' + 
  ObjectName + '.sql D:\temp\temp\DBNAME\1.2.8\StoredProcedures\'
  + ObjectName + '.sql'

FROM tbDataMeta_ChangeLog
where ObjectType = 'PROCEDURE' 
AND EventDate>'2010-02-10'






USE [MY_DB]
GO

IF  EXISTS (SELECT * FROM dbo.sysobjects 
WHERE id = OBJECT_ID(N'[DF_EventsLog_EventDate]') AND type = 'D')
BEGIN
ALTER TABLE [dbo].[DbObjectsChangeStore] DROP CONSTRAINT [DF_EventsLog_EventDate]
END

GO

USE [MY_DB]
GO

/****** Object:  Table [dbo].[DbObjectsChangeStore]    
Script Date: 02/11/2010 17:58:00 ******/
IF  EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[DbObjectsChangeStore]') AND type in (N'U'))
DROP TABLE [dbo].[DbObjectsChangeStore]
GO

USE [MY_DB]
GO

/****** Object:  Table [dbo].[DbObjectsChangeStore]    
Script Date: 02/11/2010 17:58:00 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[DbObjectsChangeStore](
    [LogId] [int] IDENTITY(1,1) NOT NULL,
    [DatabaseName] [varchar](256) NOT NULL,
    [EventType] [varchar](50) NOT NULL,
    [ObjectName] [varchar](256) NOT NULL,
    [ObjectType] [varchar](25) NOT NULL,
    [SqlCommand] [varchar](max) NOT NULL,
    [EventDate] [datetime] NOT NULL,
    [LoginName] [varchar](256) NOT NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[DbObjectsChangeStore] 
ADD  CONSTRAINT [DF_EventsLog_EventDate]  
DEFAULT (getdate()) FOR [EventDate]
GO


IF  EXISTS (SELECT * FROM sys.triggers
 WHERE parent_class_desc = 'DATABASE' AND name = N'trig_BackUpDbObjects')
DISABLE TRIGGER [trig_BackUpDbObjects] ON DATABASE

GO

USE [MY_DB]
GO

/****** Object:  DdlTrigger [trig_BackUpDbObjects]   
 Script Date: 02/11/2010 17:58:49 ******/
IF  EXISTS (SELECT * FROM sys.triggers 
WHERE parent_class_desc = 'DATABASE' 
AND name = N'trig_BackUpDbObjects')
DROP TRIGGER [trig_BackUpDbObjects] ON DATABASE
GO

USE [MY_DB]
GO

/****** Object:  DdlTrigger [trig_BackUpDbObjects]    Script Date: 02/11/2010 17:58:49 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



create trigger [trig_BackUpDbObjects]
on database
for create_procedure, alter_procedure, drop_procedure,
create_table, alter_table, drop_table,
create_function, alter_function, drop_function
as

set nocount on

declare @data xml
set @data = EVENTDATA()

insert into [dbo].[DbObjectsChangeStore](databasename, eventtype, 
objectname, objecttype, sqlcommand, loginname)
values(
@data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)'),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)'), 
@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)'), 
@data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)'), 
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)'), 
@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)')
)




GO

SET ANSI_NULLS OFF
GO

SET QUOTED_IDENTIFIER OFF
GO

DISABLE TRIGGER [trig_BackUpDbObjects] ON DATABASE
GO