代码之家  ›  专栏  ›  技术社区  ›  Yordan Georgiev

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

  •  1
  • Yordan Georgiev  · 技术社区  · 15 年前

    我有一个SQL Server 2005标准生产数据库,其中有120个表和150个存储过程。 更新的版本更新除了需要应用层升级外,还需要升级到数据库。根据提供的资源,我打算执行以下升级:

    • 为每个新表创建带有插入数据的脚本(如果有)。请在名为:n.create_table_name.sql的单独文件中输入脚本
    • 为每个新存储过程创建具有权限的脚本。请在n.create_storedprocname.sql中为每个进程编写脚本
    • 为每个alter proc创建名为n.alter_storedprocname.sql的新文件
    • 逐个运行每个脚本到测试数据库。如果测试失败(必须更改某些内容等),请在测试数据库上恢复完整的备份,然后重新开始。

    我有一个DDL触发器,它将每个DDL事件存储在一个表中——例如,我可以很容易地跟踪从某个特定时间点发生的所有变化。

    我可以简单地传递对象的名称,这些名称将为我生成所有DDL语句,以及我可以依赖的权限,除了SSM之外,还有其他脚本工具吗?

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

    2 回复  |  直到 15 年前
        1
  •  0
  •   AlexS    15 年前

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

        2
  •  0
  •   Yordan Georgiev    15 年前

    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:。-脚本所有数据库-权限-清除

    而不仅仅是复制所需对象的文件: 选择不同

      '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