[SQL] SQLCMD를 사용하여 PostDeployment.sql 스크립트에 조건부 논리
SQLSQLCMD를 사용하여 PostDeployment.sql 스크립트에 조건부 논리
내 프로젝트에 대한 스키마 및 초기 테스트 데이터를 관리하기 위해 (비주얼 스튜디오)는 SQL 2008 데이터베이스 프로젝트를 사용하고 있습니다. "R"구문 atabase 프로젝트는 SQLCMD의를 사용하여 다른 스크립트의 숫자를 포함하는 사후 배포를 사용합니다.
조건부로 SQLCMD 변수에 따라 특정 파일을 포함에 나는 수 있도록하고 싶습니다. 이 날 (멀티 테넌트 (multi-tenant) 시스템에 대한) 데이터의 다른 구성과 설정에 프로젝트를 데이터베이스의 다양한 버전을 우리의 야간 빌드 여러 번 실행 할 수 있습니다.
나는 다음을 시도했다 :
IF ('$(ConfigSetting)' = 'Configuration1')
BEGIN
print 'inserting specific configuration'
:r .\Configuration1\Data.sql
END
ELSE
BEGIN
print 'inserting generic data'
:r .\GenericConfiguration\Data.sql
END
하지만 컴파일 오류가 발생합니다 : SQL01260 : A는 치명적인 파서 오류가 발생했습니다 Script.PostDeployment.sql
사람이 오류를 보거나 이런 방식으로 유연하게 자신의 배치 후 스크립트를 구성하는 데 성공 했습니까? 아니면 내가 완전히 잘못된 방법으로 이것에 대해 갈거야?
감사, 롭
추신 또한 주위 그래서 파일의 경로는이 게시물에 유사한 변수이라고이 변경 시도했습니다. 하지만이 경로가 잘못되었다고 말하는 나에게 오류를 제공합니다.
해결법
-
==============================
1.최신 정보
최신 정보
지금 발견 한 나의 링크 된 스크립트 중 일부는 GO 문을 필요로하기 때문에 나를 위해 일을하지 않습니다 위의 경우 / 다른 구문. 본질적으로이가 무효 sytax가되도록 R은 인라인 스크립트를 가져옵니다.
(나처럼) 그런 다음이 주위에 어떤 쉬운 방법이없는 링크 된 스크립트에서 GO 문이 필요하면 내가 따라 빌드시 주요 포스트 depeployment 스크립트를 덮어 쓸 내 프로젝트를 변경 한 후 몇 가지 사후 배포 스크립트를 생성하고 결국 빌드 구성에. 이것은 지금 필요한 일을하지만, 더 쉬운 방법이 있어야처럼 보인다!
같은 일을 필요로하는 누군가를 위해 -이 게시물에 유용한 발견
그래서 내 프로젝트에 나는 다음 포스트 배치 파일이 있습니다 :
나는 그 (오른쪽 언로드 한 후 마우스 오른쪽 버튼으로 클릭 편집을 클릭) 프로젝트 파일의 끝에 다음을 추가 :
<Target Name="BeforeBuild"> <Message Text="Copy files task running for configuration: $(Configuration)" Importance="high" /> <Copy Condition=" '$(Configuration)' == 'Release' " SourceFiles="Scripts\Post-Deployment\Default.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" /> <Copy Condition=" '$(Configuration)' == 'Debug' " SourceFiles="Scripts\Post-Deployment\Default.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" /> <Copy Condition=" '$(Configuration)' == 'Configuration1' " SourceFiles="Scripts\Post-Deployment\Configuration1.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" /> </Target>
마지막으로, 솔루션의 설치 일치하는 빌드 구성에 필요합니다.
또한, 다른 작업 방법을 시도하는 사람을 위해, 나는 또한 운없이 다음을 시도 :
-
==============================
2.나는 NOEXEC 방법을 사용하여 문제를 해결할 수 있었다.
나는 NOEXEC 방법을 사용하여 문제를 해결할 수 있었다.
그래서, 대신의 :
IF ('$(ConfigSetting)' = 'Configuration1') BEGIN print 'inserting specific configuration' :r .\Configuration1\Data.sql END
나는 조건부 반전 가져온 문을 (들) thusly 히 스킵 NOEXEC ON을 설정합니다 :
IF ('$(ConfigSetting)' <> 'Configuration1') SET NOEXEC ON :r .\Configuration1\Data.sql SET NOEXEC OFF
당신이 당신이 후속 문을 실행하려는 경우 전원이 다시 설정합니다.
-
==============================
3.여기에 내가 디버그에 대한 테스트 데이터를 배포하지만 구성을 해제하지 않도록 사후 배포 프로세스 내에서 조건부 배포를 처리하고 방법입니다.
여기에 내가 디버그에 대한 테스트 데이터를 배포하지만 구성을 해제하지 않도록 사후 배포 프로세스 내에서 조건부 배포를 처리하고 방법입니다.
첫째, 솔루션 탐색기에서 속성 폴더 프로젝트를 열고, 새로운 SqlCmd.variables 파일을 추가 마우스 오른쪽 단추로 클릭합니다.
파일 Debug.sqlcmdvars의 이름을 지정합니다.
파일 내에서 사용자 정의 변수를 추가 한 다음 $ (BuildConfiguration)라는 최종 변수를 추가 및 디버그에 값을 설정합니다.
릴리스에 $ (BuildConfiguration)를 설정하는 Release.sqlcmdvars를 만드는 과정을 반복합니다.
지금, 당신의 설정을 구성합니다 배포 탭으로 프로젝트 속성 페이지를 엽니 다. 상단 드롭 다운 메뉴에서 디버그로 구성을 설정합니다. 하단의 드롭 다운에서 (SQL 명령 변수), 속성 \ Debug.sqlcmdvars에 파일을 설정합니다.
릴리스로 반복합니다 : 상단 드롭 다운 메뉴에서 릴리스로 구성을 설정합니다. 하단의 드롭 다운에서 (SQL 명령 변수), 속성 \ Release.sqlcmdvars에 파일을 설정합니다.
지금, 당신의 Script.PostDeployment.sql 파일 내에서, 당신은 다음과 같은 조건 논리를 지정할 수 있습니다 :
IF 'Debug' = '$(BuildConfiguration)' BEGIN PRINT '***** Creating Test Data for Debug configuration *****'; :r .\TestData\TestData.sql END
솔루션 탐색기에서 마우스 오른쪽 상단 레벨 솔루션 및 오픈 구성 관리자를 클릭합니다. 당신은 당신의 빌드 활성화 된 구성을 지정할 수 있습니다. 또한 MSBuild.exe를 명령 줄에서 구성을 지정할 수 있습니다.
당신은 당신의 릴리스 빌드가 개발자 테스트 데이터를 구축 지금 왔지,하지만하지!
-
==============================
4.롭 밖으로 일로서이 그것을 시작 내에서 / END 문 둥지처럼, GO 문은 연결된 SQL 스크립트를 사용할 수 없습니다.
롭 밖으로 일로서이 그것을 시작 내에서 / END 문 둥지처럼, GO 문은 연결된 SQL 스크립트를 사용할 수 없습니다.
그러나, 나는 그의에 다른 해결책이 - 가능하면, 참조 된 스크립트에서 모든 GO 문을 제거하고 END 문 다음 하나 하나를 넣어 :
IF '$(DeployTestData)' = 'True' BEGIN :r .\TestData\Data.sql END GO -- moved from Data.sql
테스트 스크립트 배포 온 / 오프 날에 켤 수 있습니다 나는 또한 $ (DeployTestData)라고 내 sqlcmdvars 파일에 새 변수를 만들었으므로주의.
-
==============================
5.나는 꽤 잘 일한 MSDN 블로그에서 해킹을 발견했다. 트릭은 임시 스크립트 파일에 명령을 작성하고 그 대신 스크립트를 실행하는 것입니다. 기본적으로 SQLCMD 동적 SQL에 해당.
나는 꽤 잘 일한 MSDN 블로그에서 해킹을 발견했다. 트릭은 임시 스크립트 파일에 명령을 작성하고 그 대신 스크립트를 실행하는 것입니다. 기본적으로 SQLCMD 동적 SQL에 해당.
-- Helper newline variable :setvar CRLF "CHAR(13) + CHAR(10)" GO -- Redirect output to the TempScript.sql file :OUT $(TEMP)\TempScript.sql IF ('$(ConfigSetting)' = 'Configuration1') BEGIN PRINT 'print ''inserting specific configuration'';' + $(CRLF) PRINT ':r .\Configuration1\Data.sql' + $(CRLF) END ELSE BEGIN PRINT 'print ''inserting generic data'';' + $(CRLF) PRINT ':r .\GenericConfiguration\Data.sql' + $(CRLF) END GO -- Change output to stdout :OUT stdout -- Now execute the generated script :r $(TEMP)\TempScript.sql GO
TempScript.sql 파일은 다음 중 하나를 포함합니다 :
print 'inserting specific configuration'; :r .\Configuration1\Data.sql
또는
print 'inserting generic data'; :r .\GenericConfiguration\Data.sql
$의 값 (ConfigSetting)에 따라 그리고이 실행될 때 GO 문 등 아무런 문제가 없을 것입니다.
-
==============================
6.나는 롭 새의 솔루션에 의해 영감을했다. 그러나, 나는 단순히 선택한 빌드 구성에 따라 사후 배포 스크립트를 대체하기 위해 빌드 이벤트를 사용하고 있습니다.
나는 롭 새의 솔루션에 의해 영감을했다. 그러나, 나는 단순히 선택한 빌드 구성에 따라 사후 배포 스크립트를 대체하기 위해 빌드 이벤트를 사용하고 있습니다.
from https://stackoverflow.com/questions/7151021/conditional-logic-in-postdeployment-sql-script-using-sqlcmd by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL : 기본값 대 NULL 값을 사용하여 (0) | 2020.05.19 |
---|---|
[SQL] 저장 프로 시저의 열 이름과 유형의 검색? [복제] (0) | 2020.05.19 |
[SQL] 어떻게 그룹에 월별 날짜 필드에서 SQL을 사용하여 (0) | 2020.05.19 |
[SQL] 백엔드 버전은 디자인 데이터베이스 다이어그램 또는 테이블에 지원되지 않습니다 (0) | 2020.05.19 |
[SQL] SQL 쿼리, 주어진 좌표에 의해 가까운 곳을 선택 [중복] (0) | 2020.05.19 |