2

我习惯于使用基于表的更改脚本,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)

有什么办法可以防止这种脚本行为?我在许多项目中使用这些结构化的数据库脚本,我不想重写它们——有些已经非常广泛了。

谢谢

4

0 回答 0