我要在生产数据库中实现许多更改,从创建新表到更改某些过程和约束。生产中的实施由第三方供应商手动完成。我要为每个脚本发送一个文件。我担心工具会出现一些错误或发生任何事情。但是,由于我要在舞台上部署与生产中相同的脚本,因此我需要在部署到其他环境之前制作一个好的后验证脚本。
所以,我想在每个表,视图和程序中留下评论,以便测试它们,但我不太确定使用这种方法。
有一种更好的方法可以测试更改是否成功应用而没有从表中插入/更新/删除或不运行过程,并从控制台获取“行”以便部署复制和粘贴的人我的输出消息?
类似于......如果没有创建过程或者用户没有访问权限,则打印“错误此处”
答案 0 :(得分:3)
2。 我会以幂等的方式编写每个脚本。 在计算中,幂等操作是一个没有额外效果的操作,如果使用相同的输入参数多次调用它。
3。 或 A.让第三方供应商在运行脚本时向您发送SSMS屏幕的“文本输出” 要么 B. 使用sqlcmd.exe,并使用日志记录功能,并要求他们向您发送.log文件。
-o output_file
http://msdn.microsoft.com/en-us/library/ms162773.aspx
这是一个“幂等”的.sql文件。如果dbo.Employee.LastName列最初为64个字符,则此脚本将更改它。更改为“NOT EXISTS”(并删除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