테스트 환경에 데이터베이스 역할 멤버 자격 배포
작성자 : Jason Lee
이 항목에서는 테스트 환경에 솔루션 배포의 일부로 데이터베이스 역할에 사용자 계정을 추가하는 방법을 설명합니다.
데이터베이스 프로젝트가 포함된 솔루션을 스테이징 또는 프로덕션 환경에 배포하는 경우 일반적으로 개발자가 데이터베이스 역할에 사용자 계정 추가를 자동화하지 않도록 합니다. 대부분의 경우 개발자는 어떤 사용자 계정을 어떤 데이터베이스 역할에 추가해야 하는지 알 수 없으며 이러한 요구 사항은 언제든지 변경될 수 있습니다. 그러나 데이터베이스 프로젝트가 포함된 솔루션을 개발 또는 테스트 환경에 배포하는 경우 상황은 일반적으로 다소 다릅니다.
- 개발자는 일반적으로 하루에 여러 번 정기적으로 솔루션을 다시 배포합니다.
- 데이터베이스는 일반적으로 모든 배포에서 다시 만들어집니다. 즉, 모든 배포 후에 데이터베이스 사용자를 만들고 역할에 추가해야 합니다.
- 개발자는 일반적으로 대상 개발 또는 테스트 환경을 완전히 제어할 수 있습니다.
이 시나리오에서는 배포 프로세스의 일부로 데이터베이스 사용자를 자동으로 만들고 데이터베이스 역할 멤버 자격을 할당하는 것이 유용한 경우가 많습니다.
핵심 요소는 이 작업이 대상 환경에 따라 조건부여야 한다는 것입니다. 스테이징 또는 프로덕션 환경에 배포하는 경우 작업을 건너뛰려고 합니다. 개발자 또는 테스트 환경에 배포하는 경우 추가 개입 없이 역할 멤버 자격을 배포하려고 합니다. 이 항목에서는 이 문제를 해결하는 데 사용할 수 있는 한 가지 방법을 설명합니다.
이 항목은 Fabrikam, Inc.라는 가상 회사의 엔터프라이즈 배포 요구 사항을 기반으로 하는 일련의 자습서의 일부를 구성합니다. 이 자습서 시리즈에서는 샘플 솔루션인 Contact Manager 솔루션을 사용하여 ASP.NET MVC 3 애플리케이션, WCF(Windows Communication Foundation) 서비스 및 데이터베이스 프로젝트를 포함하여 현실적인 수준의 복잡성을 가진 웹 애플리케이션을 나타냅니다.
이 자습서의 핵심인 배포 방법은 프로젝트 파일 이해에 설명된 분할 프로젝트 파일 접근 방식을 기반으로 합니다. 이 방법은 빌드 프로세스가 모든 대상 환경에 적용되는 빌드 지침과 환경별 빌드 및 배포 설정을 포함하는 두 개의 프로젝트 파일에 의해 제어됩니다. 빌드 시 환경별 프로젝트 파일이 환경에 구애받지 않은 프로젝트 파일로 병합되어 전체 빌드 지침 집합을 형성합니다.
작업 개요
이 항목에서는 다음과 같이 가정합니다.
- 프로젝트 파일 이해에 설명된 대로 솔루션 배포에 분할 프로젝트 파일 접근 방식을 사용합니다.
- 빌드 프로세스 이해에 설명된 대로 프로젝트 파일에서 VSDBCMD를 호출하여 데이터베이스 프로젝트를 배포합니다.
데이터베이스 프로젝트를 테스트 환경에 배포할 때 데이터베이스 사용자를 만들고 역할 멤버 자격을 할당하려면 다음을 수행해야 합니다.
- 필요한 데이터베이스를 변경하는 Transact 구조적 쿼리 언어(Transact-SQL) 스크립트를 만듭니다.
- sqlcmd.exe 유틸리티를 사용하여 SQL 스크립트를 실행하는 Microsoft Build Engine(MSBuild) 대상을 만듭니다.
- 테스트 환경에 솔루션을 배포할 때 대상을 호출하도록 프로젝트 파일을 구성합니다.
이 항목에서는 이러한 각 절차를 수행하는 방법을 보여 줍니다.
데이터베이스 역할 멤버 자격 스크립팅
Transact-SQL 스크립트는 다양한 방법과 선택한 위치에서 만들 수 있습니다. 가장 쉬운 방법은 Visual Studio 2010에서 솔루션 내에서 스크립트를 만드는 것입니다.
SQL 스크립트를 만들려면
솔루션 탐색기 창에서 데이터베이스 프로젝트 노드를 확장합니다.
Scripts 폴더를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 폴더를 클릭합니다.
Test를 폴더 이름으로 입력한 다음 Enter 키를 누릅니다.
Test 폴더를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 스크립트를 클릭합니다.
새 항목 추가 대화 상자에서 스크립트에 의미 있는 이름(예: AddRoleMemberships.sql)을 지정하고 추가를 클릭합니다.
AddRoleMemberships.sql 파일에서 다음과 같은 Transact-SQL 문을 추가합니다.
- 데이터베이스에 액세스할 SQL Server 로그인에 대한 데이터베이스 사용자를 만듭니다.
- 필요한 데이터베이스 역할에 데이터베이스 사용자를 추가합니다.
파일은 다음과 유사합니다.
USE $(DatabaseName) GO CREATE USER [FABRIKAM\TESTWEB1$] FOR LOGIN[FABRIKAM\TESTWEB1$] GO USE [ContactManager] GO EXEC sp_addrolemember N'db_datareader', N'FABRIKAM\TESTWEB1$' GO USE [ContactManager] GO EXEC sp_addrolemember N'db_datawriter', N'FABRIKAM\TESTWEB1$' GO
파일을 저장합니다.
대상 데이터베이스에서 스크립트 실행
데이터베이스 프로젝트를 배포할 때 배포 후 스크립트의 일부로 필요한 Transact-SQL 스크립트를 실행하는 것이 가장 좋습니다. 그러나 배포 후 스크립트에서는 솔루션 구성 또는 빌드 속성에 따라 조건부로 논리를 실행할 수 없습니다. 대안은 sqlcmd.exe 명령을 실행하는 Target 요소를 만들어 MSBuild 프로젝트 파일에서 직접 SQL 스크립트를 실행하는 것입니다. 이 명령을 사용하여 대상 데이터베이스에서 스크립트를 실행할 수 있습니다.
sqlcmd.exe –S [Database server] –d [Database name] –i [SQL script]
참고
sqlcmd 명령줄 옵션에 대한 자세한 내용은 sqlcmd 유틸리티를 참조하세요.
MSBuild 대상에 이 명령을 포함하기 전에 스크립트를 실행할 조건을 고려해야 합니다.
- 대상 데이터베이스는 역할 멤버 자격을 변경하기 전에 존재해야 합니다. 따라서 데이터베이스 배포 후에 이 스크립트를 실행해야 합니다.
- 스크립트가 테스트 환경에 대해서만 실행되도록 조건을 포함해야 합니다.
- "what if" 배포를 실행하는 경우 즉, 배포 스크립트를 생성하지만 실제로 실행하지 않는 경우 SQL 스크립트를 실행하면 안 됩니다.
Contact Manager 샘플 솔루션에서 설명한 대로 프로젝트 파일 이해에 설명된 분할 프로젝트 파일 접근 방식을 사용하는 경우 다음과 같이 SQL 스크립트에 대한 빌드 지침을 분할할 수 있습니다.
- 사용 권한을 배포할지 여부를 결정하는 속성과 함께 필요한 환경별 속성은 환경별 프로젝트 파일(예: Env-Dev.proj)으로 이동해야 합니다.
- MSBuild 대상 자체는 대상 환경 간에 변경되지 않는 속성과 함께 유니버설 프로젝트 파일(예: Publish.proj)에서 이동해야 합니다.
환경별 프로젝트 파일에서 사용자가 역할 멤버 자격을 배포할지 여부를 지정할 수 있는 데이터베이스 서버 이름, 대상 데이터베이스 이름 및 부울 속성을 정의해야 합니다.
<PropertyGroup>
<CmTargetDatabase Condition=" '$(CmTargetDatabase)'=='' ">
ContactManager
</CmTargetDatabase>
<DatabaseServer Condition=" '$(DatabaseServer)'=='' ">
TESTDB1
</DatabaseServer>
<DeployTestDBRoleMemberships Condition="'$(DeployTestDBRoleMemberships)'==''">
true
</DeployTestDBRoleMemberships>
</PropertyGroup>
유니버설 프로젝트 파일에서 sqlcmd 실행 파일의 위치와 실행하려는 SQL 스크립트의 위치를 제공해야 합니다. 이러한 속성은 대상 환경에 관계없이 동일하게 유지됩니다. 또한 sqlcmd 명령을 실행하려면 MSBuild 대상을 만들어야 합니다.
<PropertyGroup>
<SqlCmdExe Condition=" '$(SqlCmdExe)'=='' ">
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe
</SqlCmdExe>
</PropertyGroup>
<Target Name="DeployTestDBPermissions"
Condition=" '$(DeployTestDBRoleMemberships)'=='true' AND
'$(Whatif)'!='true' ">
<PropertyGroup>
<SqlScript>
$(SourceRoot)ContactManager.Database\Scripts\Test\AddRoleMemberships.sql
</SqlScript>
<_Cmd>"$(SqlCmdExe)" -S "$(DatabaseServer)"
-d "$(CmTargetDatabase)"
-i "$(SqlScript)"
</_Cmd>
</PropertyGroup>
<Exec Command="$(_Cmd)" ContinueOnError="false" />
</Target>
다른 대상에 유용할 수 있으므로 sqlcmd 실행 파일의 위치를 정적 속성으로 추가합니다. 반면, SQL 스크립트의 위치와 sqlcmd 명령 구문을 대상 내에서 동적 속성으로 정의합니다. 대상이 실행되기 전에 필요하지 않기 때문에. 이 경우 DeployTestDBPermissions 대상은 다음 조건이 충족되는 경우에만 실행됩니다.
- DeployTestDBRoleMemberships 속성이 true로 설정됩니다.
- 사용자가 WhatIf=true 플래그를 지정하지 않았습니다.
마지막으로 대상을 호출하는 것을 잊지 마세요. Publish.proj 파일에서 기본 FullPublish 대상에 대한 종속성 목록에 대상을 추가하여 이 작업을 수행할 수 있습니다. PublishDbPackages 대상이 실행될 때까지 DeployTestDBPermissions 대상이 실행되지 않도록 해야 합니다.
<Project ToolsVersion="4.0"
DefaultTargets="FullPublish"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<PropertyGroup>
<FullPublishDependsOn>
Clean;
BuildProjects;
GatherPackagesForPublishing;
PublishDbPackages;
DeployTestDBPermissions;
PublishWebPackages;
</FullPublishDependsOn>
</PropertyGroup>
<Target Name="FullPublish" DependsOnTargets="$(FullPublishDependsOn)" />
</Project>
결론
이 항목에서는 데이터베이스 프로젝트를 배포할 때 배포 후 작업으로 데이터베이스 사용자 및 역할 멤버 자격을 추가할 수 있는 한 가지 방법을 설명했습니다. 일반적으로 테스트 환경에서 데이터베이스를 정기적으로 다시 만들 때 유용하지만 일반적으로 스테이징 또는 프로덕션 환경에 데이터베이스를 배포할 때는 사용하지 않아야 합니다. 따라서 데이터베이스 사용자 및 역할 멤버 자격이 적절한 경우에만 생성되도록 필요한 조건부 논리를 사용해야 합니다.
추가 정보
VSDBCMD를 사용하여 데이터베이스 프로젝트를 배포하는 방법에 대한 자세한 내용은 데이터베이스 프로젝트 배포를 참조하세요. 다양한 대상 환경에 대한 데이터베이스 배포를 사용자 지정하는 방법에 대한 지침은 여러 환경에 대한 데이터베이스 배포 사용자 지정을 참조하세요. 사용자 지정 MSBuild 프로젝트 파일을 사용하여 배포 프로세스를 제어하는 방법에 대한 자세한 내용은 프로젝트 파일 이해 및 빌드 프로세스 이해를 참조하세요. sqlcmd 명령줄 옵션에 대한 자세한 내용은 sqlcmd 유틸리티를 참조하세요.