我习惯于使用基于表的更改脚本,dbVersion
并且数据库中的每个更改都在 if 语句中。
例如:
DECLARE @DbVersion BIGINT,
@now DATETIME = GETDATE()
IF NOT EXISTS (SELECT 1 FROM sysobjects WHERE TYPE = 'U' and NAME = 'dbversion') BEGIN
CREATE TABLE dbversion
(
Id BIGINT NOT NULL IDENTITY PRIMARY KEY,
Version INT NOT NULL,
Description NVARCHAR(2048) NULL,
Created DATETIME2 NOT NULL DEFAULT GETDATE(),
Stamp TIMESTAMP NOT NULL
)
INSERT INTO dbversion (version, description, created)
VALUES (0, 'Create version table for database', GETDATE())
END
SELECT @DbVersion = MAX(version) FROM dbversion
IF @DbVersion = 0 BEGIN
CREATE TABLE AppUserRole
(
Id BIGINT NOT NULL PRIMARY KEY,
RoleName NVARCHAR(16) NOT NULL,
RoleDescription NVARCHAR(64) NOT NULL,
CreatedDate DATETIME2 NOT NULL DEFAULT GETDATE()
)
INSERT INTO AppUserRole(Id, RoleName, RoleDescription, CreatedDate)
VALUES (1, 'role 1', 'role description', @now),
(2, 'role 2', 'role description', @now),
(3, 'role 3', 'role description', @now)
SET @DbVersion = @DbVersion + 1
INSERT INTO dbversion (version, description, created)
VALUES (@DbVersion, 'description', @now)
END
还行吧。我在下一个版本中CreatedDate
从表中删除一列:AppUserRole
IF @DbVersion = 1
BEGIN
ALTER TABLE AppUserRole DROP COLUMN CreatedDate
SET @DbVersion = @DbVersion + 1
INSERT INTO dbversion (version, description, created)
VALUES (@DbVersion, 'description', @now)
END
我开始为 SQL Server 13.0 使用 SQL Server Management Studio v17.1。在旧版本的 Management Studio 中,脚本始终运行没有错误。
在新版本编辑器中,出现错误
列名“CreatedDate”无效
并且脚本甚至没有运行。
此行为只会在更新表结构缓存时开始 - 直到那时我可以一遍又一遍地运行脚本而不会出错。
在我看来,Management Studio 不应该显示这个错误,因为在脚本中的这个位置实际上是没有错误的。如果有人删除dbVersion
表中的记录,则错误应该在运行时发生。
当我尝试调试此脚本时,Management Studio 将不允许它,因为脚本以第一个正确的代码结束(通常使用 dbNAme)
有什么办法可以防止这种脚本行为?我在许多项目中使用这些结构化的数据库脚本,我不想重写它们——有些已经非常广泛了。
谢谢