다음을 통해 공유


데이터베이스 프로젝트에서 참조 사용

데이터베이스 프로젝트에 여러 형식의 참조를 추가하여 다양한 상황을 처리할 수 있습니다. 사용할 절차는 참조 형식에 따라 약간씩 다릅니다.

다음 표에서는 추가할 수 있는 참조 형식과 각 형식으로 처리할 수 있는 상황을 보여 줍니다.

참조 형식

사용 이유

현재 솔루션의 데이터베이스 프로젝트(.dbproj)

이 참조 형식을 추가하면 다음과 같은 몇 가지 시나리오가 가능해집니다.

  • 참조를 추가하고 서버 이름에 대한 변수(선택적 요소)와 개체가 포함된 데이터베이스의 이름에 대한 변수를 정의하여 한 프로젝트에서 다른 프로젝트의 데이터베이스 개체를 참조할 수 있습니다. 데이터베이스에서 다른 데이터베이스의 개체를 참조하는 경우 이러한 크로스 데이터베이스 참조를 사용합니다. 자세한 내용은 다른 데이터베이스를 참조하는 데이터베이스의 팀 개발 시작을 참조하십시오.

다른 프로젝트에 대한 참조를 추가하되 변수는 정의하지 않을 경우 복합 프로젝트를 만듭니다. 이 형식의 프로젝트를 배포할 때는 다른 프로젝트의 개체도 배포됩니다. 자세한 내용은 이 항목 뒷부분의 참조를 사용하여 복합 프로젝트 만들기를 참조하십시오.

현재 솔루션이나 다른 솔루션에 속한 데이터베이스 프로젝트의 출력(.dbschema 파일)

다른 데이터베이스의 개체를 참조해야 하지만 다른 개발자로부터 이 데이터베이스를 격리하려는 경우 데이터베이스 스키마 파일에 대한 참조를 추가합니다. 데이터베이스 변경을 방지하려는 경우나 데이터베이스를 업데이트할 수 없는 경우 이 방법을 사용할 수 있습니다. 예를 들어 서버에서 공유되고 정의되어 있지만 여러 데이터베이스 프로젝트에서 사용하는 로그인 또는 키를 데이터베이스 프로젝트에서 참조해야 하는 경우 .dbschema 파일에 대한 참조를 추가할 수 있습니다. 자세한 내용은 공유 서버 개체를 참조하는 데이터베이스의 팀 개발 시작을 참조하십시오.

서버 개체에 대한 정의가 포함된 .dbschema 파일을 참조하고, 데이터베이스 프로젝트를 배포할 때 서버의 설정을 확인하지 않을 수 있습니다. 이 시나리오의 경우 master.dbschema 파일에 대한 참조를 추가하고 값이 "master"인 데이터베이스 변수에 대한 리터럴을 정의할 수 있습니다. 이렇게 하면 "마스터" 데이터베이스에 정의된 개체에 대한 참조를 오류 없이 확인할 수 있습니다. 리터럴에 대한 자세한 내용은 이 항목 뒷부분의 리터럴을 사용하여 데이터베이스 참조를 참조하십시오.

시스템 개체의 정의가 포함된 master.dbschema 파일

시스템 저장 프로시저, 시스템 테이블, 시스템 뷰 또는 시스템 카탈로그 등의 시스템 개체를 참조하려는 경우에는 적절한 master.dbschema에 대한 참조를 추가하여 이러한 참조를 확인해야 합니다. 예를 들어 저장 프로시저에서 sys.sysobjects를 참조할 수 있습니다. master.dbschema 파일은 지원되는 각 SQL Server 버전의 Visual Studio Premium와 함께 제공됩니다. .dbschema 파일은 [Program Files]\Microsoft Visual Studio 10.0\VSTSDB\Extensions\SqlServer\Version\DBSchemas에 있습니다. 여기서 Version은 사용 중인 SQL Server의 버전(예: 2005 또는 2008)입니다.

이 시나리오의 경우 적절한 master.dbschema 파일에 대한 참조를 추가하고 값이 "master"인 데이터베이스 변수에 대한 리터럴을 정의할 수 있습니다. 이렇게 하면 "마스터" 데이터베이스에 정의된 개체에 대한 참조를 오류 없이 확인할 수 있습니다. 리터럴에 대한 자세한 내용은 이 항목 뒷부분의 리터럴을 사용하여 데이터베이스 참조를 참조하십시오.

현재 솔루션의 SQL CLR(공용 언어 런타임) 프로젝트

데이터베이스 프로젝트와 함께 배포할 하나 이상의 SQLCLR 개체를 개발 중인 경우 현재 솔루션의 SQLCLR 프로젝트를 참조합니다. 데이터베이스 프로젝트를 배포하면 참조하는 SQLCLR 프로젝트에서 생성된 어셈블리도 함께 배포됩니다. CREATE ASSEMBLY 문은 해당 참조에 대해 지정한 속성에서 빌드됩니다. 자세한 내용은 SQLCLR 개체를 참조하는 데이터베이스의 팀 개발 시작 및 이 항목 뒷부분의 크로스 데이터베이스 참조 정의를 참조하십시오.

현재 솔루션의 프로젝트 또는 다른 소스의 SQLCLR 어셈블리

데이터베이스 프로젝트에서 SQLCLR 어셈블리에 정의되어 있지만 동시에 또는 같은 팀에서 개발하고 있지는 않은 개체를 참조해야 하는 경우 해당 어셈블리에 대한 참조를 추가합니다. 데이터베이스 프로젝트를 배포하면 참조하는 어셈블리도 함께 배포됩니다.

.xsd 파일에 정의된 XML 스키마 정의

스키마를 변수, 매개 변수 또는 열과 연결하여 형식화된 XML 변수, 매개 변수 또는 열을 만들려면 먼저 이 스키마를 등록해야 합니다. 다음 중 어느 하나라도 해당되는 경우 형식화된 XML을 사용할 수 있습니다.

  • XML 데이터에 대한 스키마가 있고 서버에서 이 스키마에 따라 해당 데이터의 유효성을 검사하도록 하려는 경우

  • 형식 정보를 기반으로 저장소 및 쿼리를 최적화하려는 경우

  • 쿼리가 컴파일될 때 형식 정보를 보다 효율적으로 이용하려는 경우

자세한 내용은 XML 스키마 컬렉션을 사용하는 데이터베이스의 팀 개발 시작을 참조하십시오.

크로스 데이터베이스 참조 정의

다른 데이터베이스의 개체를 참조하는 데이터베이스 개체를 만들거나 가져올 경우에는 데이터베이스 프로젝트의 속성에서 해당 참조를 정의해야 합니다. 참조하는 데이터베이스마다 참조할 서버 및 데이터베이스에 해당하는 SETVAR 변수를 정의할 수 있습니다. 참조를 포함하도록 개체 정의를 수정하는 경우 서버 및 데이터베이스의 명시적 이름 대신 이러한 변수를 사용하여 정의할 수 있습니다. 데이터베이스 프로젝트를 빌드하면 지정한 값으로 변수가 대체됩니다.

크로스 데이터베이스 참조 시나리오

Visual Studio Premium에서는 다음과 같은 시나리오를 지원합니다.

  • 데이터베이스 프로젝트를 만들고 기존 데이터베이스에서 스키마를 가져왔습니다. 스키마에는 하나 이상의 다른 데이터베이스에 있는 개체를 참조하는 개체가 들어 있습니다. 프로젝트의 속성에서 해당하는 참조를 정의하고 서버 및 데이터베이스의 명시적 이름을 SETVAR 변수로 대체합니다. 이 정의로 인해 크로스 데이터베이스 참조의 유효성은 디자인할 때 검사할 수 있습니다. 또한 데이터베이스 프로젝트를 격리된 개발 환경에 배포할 수도 있습니다. 격리된 개발 환경에서는 대상 서버의 이름이 프로덕션 환경의 대상 서버 이름과 다를 수 있습니다.

  • 데이터베이스 프로젝트에 크로스 데이터베이스 참조가 들어 있고, 이러한 참조에서는 SETVAR 변수를 사용하여 서버와 데이터베이스를 식별합니다. 이러한 변수 이름을 변경하고 해당 참조가 들어 있는 개체 정의를 업데이트하려고 합니다.

  • 개발 중인 데이터베이스 프로젝트에서 추가 데이터베이스 스키마를 참조하려고 합니다. 다른 데이터베이스 프로젝트는 팀과 공유하지 않으면서 이러한 스키마만 공유하려 합니다. 이 경우 다른 프로젝트의 데이터베이스 스키마 파일(.dbschema)에 대한 참조를 추가하고 이 스키마 파일만 버전 제어에 체크 인할 수 있습니다. 이 방법을 사용하면 참조할 스키마가 들어 있는 데이터베이스 프로젝트에 대한 액세스를 제한할 수 있습니다. 또한 데이터베이스 프로젝트는 배포하지만 종속된 프로젝트는 배포하지 않으려는 경우에도 이 접근 방식을 사용해야 합니다.

데이터베이스 리팩터링을 사용하여 크로스 데이터베이스 참조와 관련된 추가 작업을 수행할 수 있습니다. 자세한 내용은 방법: 서버 또는 데이터베이스에 대한 참조 이름 바꾸기를 참조하십시오.

데이터베이스 프로젝트 및 스키마 파일에 대한 참조

데이터베이스 프로젝트에 참조를 추가하는 경우 다른 데이터베이스 프로젝트나 데이터베이스 프로젝트 빌드 시 생성되는 스키마 파일을 지정할 수 있습니다.

다음과 같은 경우 다른 데이터베이스 프로젝트를 참조해야 합니다.

  • 참조가 포함될 데이터베이스와 참조 중인 데이터베이스 모두 스키마를 변경해야 하는 경우. 참조가 들어 있는 데이터베이스 프로젝트를 배포하면 참조 중인 데이터베이스 프로젝트도 함께 배포됩니다.

다음 중 어느 하나라도 해당되는 경우에는 스키마 파일을 참조해야 합니다.

  • 프로젝트가 현재 솔루션에 들어 있지 않은 데이터베이스를 참조해야 하는 경우

  • 종속된 프로젝트를 배포하지 않고 단일 프로젝트만 배포해야 하는 경우

  • 변경 가능성이 없는 데이터베이스 스키마를 참조하고 있는 경우. 이 시나리오에서는 스키마 파일을 버전 제어에 체크 인할 수 있습니다.

크로스 데이터베이스 참조의 제한 사항

데이터베이스 스키마를 가져오는 경우 데이터베이스 프로젝트에서는 참조를 배포하기 전에 해당 참조의 유효성을 검사할 수 없으므로 개체 정의에 다른 데이터베이스에 대한 참조가 있으면 경고가 발생합니다. 이 경우 프로젝트 속성에서 데이터베이스 참조를 정의하면 개체 정의의 유효성을 검사하고 경고를 해결할 수 있습니다. 그런 다음 서버 및 데이터베이스의 이름을 변수로 대체하여 개체 정의를 업데이트하면 됩니다. 또한 리팩터링을 사용하여 이러한 대체 작업을 수행할 수도 있습니다. 자세한 내용은 방법: 데이터베이스 프로젝트에 참조 추가방법: 서버 또는 데이터베이스에 대한 참조 이름 바꾸기를 참조하십시오.

참조하는 서버 및 데이터베이스의 변수와 값은 특정 빌드 구성에만 한정되지 않습니다. 서버와 데이터베이스를 명령 프롬프트에서 지정하려면 배포 시 대체할 수 있는 MSBuild 변수로 해당 서버와 데이터베이스를 참조해야 합니다.

또한 다음과 같은 제한 사항이 적용됩니다.

  • 해당되는 데이터베이스 프로젝트가 있는 경우에만 데이터베이스에 참조를 추가할 수 있습니다.

  • 데이터베이스 프로젝트의 스키마 파일에 대한 참조를 추가하기 전에 해당 데이터베이스 프로젝트를 빌드해야 합니다.

  • 데이터베이스 프로젝트에 대한 크로스 데이터베이스 참조에서 경고가 발생하지 않도록 참조 중인 해당 데이터베이스 프로젝트를 빌드해야 합니다.

  • 참조하는 솔루션 또는 데이터베이스 프로젝트의 빌드 구성을 변경하는 경우 이에 대한 크로스 데이터베이스 참조에서 경고가 발생하지 않도록 솔루션을 다시 빌드해야 합니다.

  • 다른 서버에 있는 데이터베이스 프로젝트의 개체를 참조하는 경우 이를 대상 서버에서 연결된 서버로 정의해야 합니다. 자세한 내용은 방법: 데이터베이스 프로젝트에 참조 추가를 참조하십시오.

  • 마스터 데이터베이스를 참조하는 크로스 데이터베이스 참조는 필요하지 않습니다.

  • SETVAR 변수를 포함하는 참조는 항상 "[$(VariableName)]" 형식을 사용해야 합니다. 여기서 대괄호를 생략하면 데이터베이스 프로젝트를 배포할 수 없습니다.

  • SETVAR 변수 이름은 고유해야 합니다. 서버와 데이터베이스의 이름이 같은 경우 이름은 다르지만 같은 값으로 확인되는 변수를 정의해야 합니다.

보안 고려 사항

데이터베이스 프로젝트를 빌드할 때 생성되는 스키마 파일에는 해당 프로젝트에 대한 스키마 정보가 들어 있습니다. 이러한 스키마 정보를 보호하려면 이 파일 형식에 대한 액세스를 제한해야 합니다. 스키마 파일을 대상 서버에 배포하는 대신 버전 제어에 체크 인하면 이 스키마 파일을 팀과 공유할 수 있습니다. 참조하는 데이터베이스에 대한 데이터베이스 프로젝트가 같은 솔루션에 들어 있는 경우 프로젝트의 다른 개발자들은 버전 제어에 동기화하고 솔루션을 빌드해야 액세스 권한을 가지게 됩니다.

크로스 데이터베이스 참조 예제

ReportDb와 DependentDb라는 두 개의 데이터베이스 프로젝트가 있는 경우 ReportDb에서 DependentDb의 개체를 참조해야 할 수 있습니다. 이 경우 DependentDb 데이터베이스 프로젝트의 속성에 참조를 추가하고 변수를 다음과 같이 정의하여 작업을 시작할 수 있습니다.

  • RefServer

  • RefDatabase

RefServer의 값은 DependentDb가 있는 서버의 이름입니다. RefDatabase의 값은 DependentDb 프로젝트를 통해 배포되는 대상 데이터베이스의 이름입니다. 이 예제에서 RefServer의 값은 StageSvr이고, RefDatabase의 값은 DepDb입니다.

DependentDb의 Employee 테이블에 있는 모든 열을 표시하는 뷰를 ReportDb에 추가할 수 있습니다. StageSvr이라는 서버의 DepDb라는 데이터베이스에 이 테이블을 배포합니다. 다음 문을 추가하여 이 뷰에 대한 개체 정의를 만들 수 있습니다.

CREATE VIEW [dbo].[DependentView]
AS
SELECT * FROM [$(RefServer)].[$(RefDatabase)].[dbo].[Employee]
;

참조를 사용하여 복합 프로젝트 만들기

데이터베이스 및 서버 프로젝트에서 데이터베이스 개발 중 발생할 수 있는 모든 시나리오를 처리할 수 있는 것은 아닙니다. 보다 복잡한 시나리오를 처리하려면 두 개 이상의 다른 프로젝트에서 복합 프로젝트를 만듭니다.

데이터베이스 프로젝트에 다른 데이터베이스 또는 서버 프로젝트에 대한 참조를 추가하되 참조하는 프로젝트의 서버 및 데이터베이스 변수에 대한 값은 제공하지 않을 경우 복합 프로젝트를 만듭니다. 이 참조 형식을 추가하면 참조를 추가한 프로젝트에 참조가 가리키는 프로젝트의 모든 개체 및 설정이 포함됩니다.

복합 프로젝트를 만들면 다음과 같은 시나리오가 가능해집니다.

  • 공유 로그인 또는 키를 참조하는 데이터베이스 스키마를 관리할 수 있습니다. 자세한 내용은 공유 서버 개체를 참조하는 데이터베이스의 팀 개발 시작을 참조하십시오.

  • 큰 데이터베이스를 여러 개의 하위 프로젝트로 분할하여 성능을 향상시키거나 스키마 또는 개체 형식을 구분할 수 있습니다. 여러 데이터베이스에서 일부 개체를 공유하지만 공유 방식은 다른 경우에도 이 변경 작업을 수행할 수 있습니다. 변경 작업으로 인해 순환 참조가 만들어지지 않는 경우에만 프로젝트를 둘 이상의 하위 프로젝트로 분할할 수 있습니다.

복합 프로젝트를 배포하면 이 프로젝트에서 참조하는 모든 데이터베이스 프로젝트의 개체도 함께 배포됩니다. 자세한 내용은 대용량 데이터베이스의 팀 개발 시작을 참조하십시오.

리터럴을 사용하여 데이터베이스 참조

데이터베이스 참조 변수를 정의하여 대상 배포 환경에서 참조되는 데이터베이스의 이름을 지정할 수 있습니다. SQLCMD 변수를 사용하지 않으려는 경우, 개발 환경에서 대상 데이터베이스 이름은 항상 동일하므로 참조되는 데이터베이스의 이름을 값으로 갖는 리터럴을 대신 지정할 수 있습니다.

변수를 사용할 경우 구문은 다음과 같습니다.

CREATE VIEW [dbo].[View1] AS SELECT * FROM [($MasterDbVar)].[dbo].[spt_values].

리터럴을 대신 사용할 경우 구문은 다음과 같습니다.

CREATE VIEW [dbo].[View1] AS SELECT * FROM [master].[dbo].[spt_values]

리터럴 값을 지정하는 방법에 대한 자세한 내용은 방법: 데이터베이스 프로젝트에 참조 추가를 참조하십시오.

참고 항목

작업

방법: 서버 또는 데이터베이스에 대한 참조 이름 바꾸기

방법: 데이터베이스 프로젝트에 참조 추가

개념

데이터베이스 개체와 서버 개체 만들기 및 수정