私はテーブルに基づいてスクリプトを変更するのに慣れていて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 スクリプトを多くのプロジェクトで使用していますが、それらを書き直したくありません - 一部はすでに非常に大規模です。
ありがとうございました