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テーブル内のレコードを削除すると、実行時にエラーが発生するはずです。

このスクリプトをデバッグしようとすると、スクリプトが最初の適切なコード (通常は USE dbNAme) で終了するため、Management Studio はそれを許可しません。

このスクリプトの動作を防ぐ方法はありますか? 私はこれらの構造化された DB スクリプトを多くのプロジェクトで使用していますが、それらを書き直したくありません - 一部はすでに非常に大規模です。

ありがとうございました

4

0 に答える 0