SQL Server 데이터베이스의 경우 스키마 업데이트를 추적하기 위해 버전 관리 체계를 사용하고 있습니다. 스키마를 이전 버전에서 현재 버전으로 가져 오려면이 스크립트를 실행할 수 있어야합니다. 마스터 스크립트를 다시 실행하면 최신 스키마 업데이트 만 실행해야합니다.T-SQL "re-runnable"데이터베이스 업데이트 스크립트 - 열 삭제
스크립트의 구조는 다음과 같다 : 이것은 일반적으로 매우 잘 작동
SELECT @Installed = InstallDate FROM SystemSchemaVersion WHERE Major=1 AND Minor=0 AND Patch=0
IF (@Installed IS NULL)
BEGIN
...
INSERT INTO SystemSchemaVersion (Major, Minor, Patch, InstallDate) VALUES (1, 0, 0, GetDate())
END
ELSE PRINT 'Version 1.0.0 was already installed on ' + Convert(varchar(10), @Installed)
SELECT @Installed = InstallDate FROM SystemSchemaVersion WHERE Major=1 AND Minor=0 AND Patch=1
IF (@Installed IS NULL)
BEGIN
...
INSERT INTO SystemSchemaVersion (Major, Minor, Patch, InstallDate) VALUES (1, 0, 1, GetDate())
END
ELSE PRINT 'Version 1.0.1 was already installed on ' + Convert(varchar(10), @Installed)
. 그러나 스키마 업데이트가 이전 INSERT에 포함 된 열을 DROP 할 때 문제가 발생했습니다. 즉, 우리는 다음과 같은 것을 가지고 있습니다 :
SELECT @Installed = InstallDate FROM SystemSchemaVersion WHERE Major=1 AND Minor=0 AND Patch=0
IF (@Installed IS NULL)
BEGIN
INSERT [foo] ([a], [b], [OrganizationId]) VALUES (N'a', N'b', N'1');
INSERT INTO SystemSchemaVersion (Major, Minor, Patch, InstallDate) VALUES (1, 0, 0, GetDate());
END
ELSE PRINT 'Version 1.0.0 was already installed on ' + Convert(varchar(10), @Installed)
SELECT @Installed = InstallDate FROM SystemSchemaVersion WHERE Major=1 AND Minor=0 AND Patch=1
IF (@Installed IS NULL)
BEGIN
ALTER TABLE [foo] DROP COLUMN [OrganizationId];
INSERT INTO SystemSchemaVersion (Major, Minor, Patch, InstallDate) VALUES (1, 0, 1, GetDate());
END
ELSE PRINT 'Version 1.0.1 was already installed on ' + Convert(varchar(10), @Installed)
이것은 처음 실행될 때 잘 동작합니다; 버전 1.0.1이 실행되고 열이 삭제됩니다. 그러나, 스크립트를 제 2 시간 수율 러닝이다
Msg 207, Level 16, State 1, Line 7118 Invalid column name 'OrganizationId'.
는 버전 1.0.0 블록 내부 INSERT가 실행되고 있지 않은 경우에도, 여전히 해석되고 그리고 잘못된 열의 오류를 발생시킨다.
이 문제를 해결하는 방법에 대한 제안 사항이 있으십니까? 이상적으로는 조건문을 사용하여 INSERT를 보호하여 구문 분석을 수행하지 않더라도 문제가 발생하지 않는 것으로 보입니다. sp_ExecuteSql() 호출 내에서 동적으로 INSERT를 수행 할 수는 있지만 (많은 갱신 작업이 필요하지는 않습니다).
감사합니다 -
--Andy
감사합니다. Ron. 기존에 생성 된 스크립트를 편집 할 수있는 대안이 있기를 바랬지 만 적어도 앞으로의 경로가 있습니다. –