1

我必须在生产数据库中实现许多更改,从创建新表到更改一些程序和约束。生产中的实施由第三方供应商手动完成。我必须向他们发送每个脚本的文件。我担心工具会出错或发生任何事情。但是由于我必须在阶段部署与生产中相同的脚本,所以在部署到其他环境之前,我必须制作一个好的验证后脚本。

所以,我有在每个表、视图和过程中留下评论的想法,以便测试它们,但我不太确定使用这种方法。

有一种更好的方法可以测试更改是否成功应用,而无需从表中插入/更新/删除或不运行程序,并从控制台获取“行”,以便部署的人复制并粘贴我的输出消息?

类似于...如果未创建程序或用户无权访问,则打印“ERROR ON THIS”

4

1 回答 1

3
  1. 我会阅读 Andy 关于“数据库测试驱动开发”的博客。 http://sqlblog.com/blogs/andy_leonard/archive/2012/08/07/revisiting-test-driven-database-development.aspx

2. 我会以幂等的方式编写每个脚本。在计算中,幂等操作是指使用相同的输入参数多次调用它时不会产生额外影响的操作。

3. A. 让第三方供应商在运行脚本时向您发送 SSMS 屏幕的“文本输出”或 B. 使用 sqlcmd.exe,并使用日志记录功能,并要求他们向您发送 .log文件。

-o 输出文件

http://msdn.microsoft.com/en-us/library/ms162773.aspx

这是一个“幂等”的 .sql 文件。如果 dbo.Employee.LastName 列最初是 64 个字符,则此脚本会更改它。更改为“不存在”(并删除 CHARACTER_MAXIMUM_LENGTH 检查)以创建以前不存在的任何列(这是我 99% 的脚本在已经“服务”的数据库上的样子)。还要注意变量的 sqlcmd“占位符”。但是我可以运行下面的脚本 1 次或 333 次,结果是一样的。

Use [$(DBNAME)]
GO

:Error $(ErrorOutputFileFromCommandLine) 

IF EXISTS (    SELECT TABLE_SCHEMA , TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Employee' and TABLE_SCHEMA = 'dbo'    )
    BEGIN

        IF EXISTS 
        (
            SELECT * 
                FROM [INFORMATION_SCHEMA].[COLUMNS] 
            WHERE   
                TABLE_NAME = 'Employee' 
                AND TABLE_SCHEMA = 'dbo'
                AND COLUMN_NAME = 'LastName'
                AND CHARACTER_MAXIMUM_LENGTH < 128
        )
            BEGIN
                print 'Altering the column dbo.Employee.*LastName*'

                ALTER TABLE [dbo].[Employee]
                ALTER COLUMN [LastName] varchar(128) NOT NULL;

            END
        ELSE
            BEGIN
                print 'The column dbo.Employee.*LastName* already exists and supports 128 characters.'
            END

    END

GO
于 2013-02-27T14:05:16.853 回答