데이터베이스 프로젝트, 빌드 및 배포 문제 해결

업데이트: 2010년 7월

데이터베이스 프로젝트를 생성, 수정, 빌드 또는 배포하는 경우 다음 문제가 발생할 수 있습니다.

  • 데이터베이스 개체 오류

  • Microsoft SQL Server 2005의 새 예약어 사용

  • 명령줄 빌드의 차이

  • 종속성 및 업데이트 스크립트

  • 따옴표 붙은 식별자로 인해 프로젝트 다시 로드 문제가 발생할 수 있음

  • 데이터베이스의 내부 상태가 그 내용과 일치하지 않음

  • 보류 중인 변경 내용 취소

  • Windows NT 사용자 또는 그룹을 찾을 수 없음

  • 중복된 개체 이름 및 제외된 파일

  • 데이터베이스 및 서버 정규화 이름

  • 데이터베이스 스키마 가져오기 성능

  • 빌드 오류 탐색

  • 크로스 데이터베이스 참조 사용 시 구문 오류

  • SQLCLR 프로젝트 및 어셈블리 이름 바꾸기

  • 지원되지 않는 FULLTEXT STOPLIST 구문

  • SORT_IN_TEMPDB 절을 가져올 수 없음

  • 여러 문이 포함된 테이블 반환 함수를 가져올 경우 따옴표 붙은 식별자 상태가 손실됨

  • 프로젝트를 다시 빌드한 후에도 일부 프로젝트 오류가 제거되지 않음

  • 배포 후 스크립트의 잘못된 구문

데이터베이스 개체 오류

데이터베이스 개체에 하나 이상의 구문 오류가 있는 경우 오류 목록 창에 관련된 오류 메시지가 나타납니다.

참고

오류 목록 창에 표시된 오류 메시지에서 오류를 해결할 수 있는 작업 정보를 제공해야 합니다. 오류를 해결하고 데이터베이스 개체를 저장하면 해당 데이터베이스 개체의 아이콘이 정상 상태로 돌아가고 오류 목록 창에서 해당 오류가 제거됩니다.

Microsoft SQL Server 2005의 새 예약어 사용

SQL Server 2005에서 예약된 새 키워드에는 EXTERNAL, PIVOT, REVERT, TABLESAMPLE, UNPIVOT 등이 있습니다. Microsoft SQL Server 2005 또는 SQL Server 2008을 대상으로 하는 데이터베이스 프로젝트의 스키마 개체 이름으로 이러한 예약된 키워드를 사용하면 출력 창에 오류가 나타납니다.

참고

이 제한을 해결하기 위해 스키마 개체 이름을 따옴표로 묶을 수 있습니다. 예를 들어 "CREATE TABLE [External] (c1 INT)"를 사용할 수 있습니다.

명령줄 빌드의 차이

Visual Studio에서 프로젝트를 열고 명령줄 빌드를 수행하면 사용자 인터페이스에서 빌드할 때 나타나는 모든 빌드 오류가 표시되지 않을 수도 있습니다.

참고

이 문제를 해결하려면 명령줄 빌드를 수행하기 전에 Visual Studio에서 데이터베이스 프로젝트를 닫습니다.

종속성 및 업데이트 스크립트

업데이트 스크립트에서 개체를 올바른 순서대로 생성하기 위해 스키마 비교는 개체 종속성을 검사합니다. 예를 들어 뷰가 테이블에 종속된 경우 뷰보다 먼저 테이블을 만들어야 합니다. 두 번째 개체에 종속된 개체에서 스키마 한정 이름을 사용하지 않는 경우 종속성이 확인되지 않거나 업데이트 또는 생성 스크립트의 문 순서가 잘못될 수도 있습니다. 이러한 차이로 인해 소스와 일치하도록 대상을 업데이트하거나 변경 내용을 데이터베이스로 배포할 때 오류가 발생할 수 있습니다. 이 문제는 데이터베이스 빌드 스크립트에도 적용됩니다.

참고

이 문제를 해결하려면 종속 관계에 있는 개체 이름에서 스키마를 한정해야 합니다. Visual Studio Premium 및 Visual Studio Ultimate에서는 데이터베이스 리팩터링을 사용하여 개체 이름을 정규화할 수 있습니다. 자세한 내용은 데이터베이스 개체 이름 정규화를 참조하십시오. 다음 예제에서 단순히 KeysTable 대신 [dbo].[KeysTable]을 참조하도록 문의 끝 부분을 변경하면 종속성이 제대로 확인됩니다.

CREATE VIEW [NewUser].[ViewReferencingScalarFunction] AS SELECT Column2, dbo.SimpleMultiplyParamByTwo(PK_Column) AS [Function] FROM KeysTable

따옴표 붙은 식별자로 인해 프로젝트 다시 로드 문제가 발생할 수 있음

데이터베이스 속성에서 SET QUOTED_IDENTIFIER 확인란이 선택 취소되어 있는 경우 따옴표 붙은 식별자가 포함된 데이터베이스를 로드하거나 개체를 저장하면 오류가 나타납니다. 따옴표 붙은 식별자를 사용한 데이터베이스에서 데이터베이스 스키마를 가져오는 경우 이러한 상황이 발생할 수 있습니다.

참고

이 문제를 해결하는 두 가지 옵션이 있습니다. 따옴표 대신 대괄호를 사용하도록 개체 정의를 수정할 수 있습니다. 예를 들어 "My Table"을 [My Table]로 변경할 수 있습니다. 또는 프로젝트 메뉴를 열고 DatabaseProject 속성, 데이터베이스 속성 탭을 차례로 클릭한 다음 SET QUOTED_IDENTIFIER 확인란을 선택합니다.

데이터베이스의 내부 상태가 그 내용과 일치하지 않음

Visual Studio Premium에서 작업할 때 "데이터베이스 프로젝트의 내부 상태가 그 내용과 일치하지 않습니다. 문제를 해결하려면 프로젝트를 언로드한 후 다시 로드하십시오."라는 오류가 표시될 수 있습니다. 이 오류는 포함된 파일 목록을 유지 관리하는 프로젝트가 파일 상태와 더 이상 동기화되지 않음을 나타냅니다. 이 오류가 발생하는 가장 일반적인 이유는 데이터베이스 프로젝트가 열려 있지 않을 때 프로젝트 파일 중 하나가 디스크에서 삭제된 경우입니다. 데이터베이스 스키마를 가져올 때 문제가 발생한 경우에도 이 오류가 표시될 수 있습니다.

참고

스키마 뷰에서 동기화를 클릭하여 이 문제를 해결할 수 있습니다. 이 방법으로 문제가 해결되지 않는 경우에는 데이터베이스 프로젝트를 언로드했다가 다시 로드할 수 있습니다. 다시 로드하려면 솔루션 탐색기에서 데이터베이스 프로젝트를 클릭합니다. 프로젝트 메뉴를 열고 프로젝트 언로드를 클릭합니다. 프로젝트가 언로드되면 프로젝트 메뉴를 열고 프로젝트 다시 로드를 클릭합니다.

보류 중인 변경 내용 취소

스키마 뷰는 버전 제어 시스템의 보류 중인 변경 내용 취소 명령을 사용한 후 자동으로 새로 고쳐지지 않습니다. 예를 들어, 테이블 또는 열의 이름을 바꾼 후 해당 변경 내용을 되돌리면 "외부 파일이 변경되어 다시 동기화해야 합니다..."라는 메시지가 스키마 뷰에 나타납니다.

참고

이 문제를 해결하려면 스키마 뷰 도구 모음에서 동기화를 클릭해야 합니다.

Windows NT 사용자 또는 그룹을 찾을 수 없음

데이터베이스 프로젝트에서 사용할 수 없는 로그인을 참조하면 "Windows NT 사용자 또는 그룹인 'DomainName\LoginName'을(를) 찾을 수 없습니다. 이름을 다시 확인하십시오."라는 오류 메시지가 나타납니다. 스키마를 가져온 소스 데이터베이스와는 다른 도메인에 있는 컴퓨터를 사용하는 경우 이 문제가 발생할 수 있습니다. 이 상황은 일반적으로 다른 위치에서 만든 데이터베이스 프로젝트로 집에서 작업할 때 발생합니다. 이러한 경우 데이터베이스 프로젝트를 빌드 또는 배포할 수 없습니다.

참고

FOR LOGIN 절을 생략하고 사용자를 만들 수 있습니다. 예를 들어 CREATE USER [Domain\someLogin]을 사용할 수 있습니다. 데이터베이스 프로젝트를 배포하면 해당 사용자가 만들어져 [Domain\someLogin] 로그인과 연결되지만, 데이터베이스 프로젝트에서는 이 로그인에 대한 참조가 필요하지 않습니다.

중복된 개체 이름 및 제외된 파일

두 테이블의 이름이 모두 Orders인 경우와 같이 데이터베이스 프로젝트에서 개체 이름이 중복된 경우 오류 목록 창에 오류가 표시됩니다. 이러한 개체 중 하나의 정의가 들어 있는 파일을 제외하여 이 문제를 해결해도 오류 메시지가 즉시 사라지지 않습니다.

참고

이 문제를 해결하려면 새로 고침을 클릭하거나, 개체 정의가 들어 있는 파일을 수정하고 개체의 이름을 바꾼 다음 파일을 저장합니다.

데이터베이스 및 서버 정규화 이름

Visual Studio Premium에서 개체를 만들면 개체의 이름이 [스키마].[개체].[자식] 명명 규칙에 따라 지정됩니다. 다른 데이터베이스 또는 서버에 있는 개체를 참조하는 경우 해당 데이터베이스 및 서버의 이름을 [서버].[데이터베이스].[스키마].[개체].[자식]과 같은 방법으로 포함할 수 있습니다. 데이터베이스 또는 서버 정규화 이름을 필요로 하는 개체를 참조하는 저장 프로시저 또는 뷰를 만들면 경고가 표시됩니다.

참고

이 경고를 해결하려면 크로스 데이터베이스 참조를 정의해야 합니다. 크로스 데이터베이스 참조에 대한 자세한 내용은 데이터베이스 프로젝트에서 참조 사용방법: 데이터베이스 프로젝트에 참조 추가를 참조하십시오.

중요

프로젝트에 데이터베이스 또는 서버 정규화 이름에 대한 해결되지 않은 경고가 들어 있는 경우 데이터베이스 프로젝트 속성의 빌드 탭에서 경고를 오류로 처리 확인란이 선택되어 있으면 배포에 실패하게 됩니다. 이는 데이터베이스 또는 서버 정규화 이름으로 인해 경고가 발생하기 때문입니다. 데이터베이스 또는 서버 정규화 이름을 사용하는 경우 경고를 오류로 처리 확인란의 선택을 취소해야 합니다.

데이터베이스 스키마 가져오기 성능

테스트 목록 편집기 창이나 테스트 뷰 창이 열려 있는 상태에서 데이터베이스 스키마를 가져오면 가져오기 작업을 완료하는 데 시간이 훨씬 더 오래 걸립니다. 이러한 속도 저하는 새 데이터베이스 프로젝트 마법사(데이터베이스 스키마 가져오기를 선택한 경우)와 데이터베이스 스키마 가져오기 작업에서 모두 발생합니다. 이 문제는 데이터베이스 스키마를 가져오기 전에 테스트 목록 편집기테스트 뷰 창을 닫아도 발생합니다.

참고

이 문제를 해결하려면 테스트 목록 편집기테스트 뷰 창을 닫고 Visual Studio를 종료한 후 다시 시작한 다음 데이터베이스 스키마를 가져와야 합니다. 스키마 크기가 작은 경우에는 이러한 단계를 수행할 필요가 없습니다. AdventureWorks 샘플 데이터베이스의 경우 테스트 목록 편집기 창이 열려 있지 않으면 스키마 가져오기 작업에 27초가 걸리고, 테스트 목록 편집기 창이 열려 있으면 48초가 걸립니다.

빌드 오류 탐색

배포에 실패하면 생성된 빌드 스크립트를 업데이트하여 오류를 수정할 수 없습니다. 이 경우 해당 빌드 스크립트를 생성하는 데 사용된 소스 파일을 수정해야 합니다. 오류 목록 창에서 배포 오류를 두 번 클릭하면 오류를 발생시킨 줄이 표시된 상태로 편집기에 빌드 스크립트가 나타납니다.

참고

이 문제를 해결하려면 빌드 스크립트를 보고 오류의 원인을 확인한 다음 데이터베이스 프로젝트에서 오류가 포함된 소스 파일을 수정해야 합니다. 예를 들어 배포 후 스크립트인 Script.PostDeployment.sql에 오류가 있을 경우 빌드 스크립트 대신 Script.PostDeployment.sql을 수정해야 합니다.

크로스 데이터베이스 참조 사용 시 구문 오류

다른 데이터베이스에 있는 개체에 대한 참조가 포함된 개체 정의를 저장할 때 하나 이상의 구문 오류가 나타날 수 있습니다. 예를 들어 데이터베이스 프로젝트에 대해 참조를 추가하고 RefServer 및 RefDatabase라는 이름의 변수를 정의하고 해당 값을 할당하려는 경우 다음과 같이 뷰를 정의할 수 있습니다.

CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM $(RefServer).$(RefDatabase).dbo.TableName

이 정의를 저장하려 할 때 구문이 잘못되었음을 나타내는 오류 메시지가 하나 이상 나타날 수 있습니다. 오류 메시지에 디자인 타임 유효성 검사 데이터베이스의 이름이 표시될 수 있는데, 이 이름이 혼동을 일으키는 것일 수 있습니다.

참고

이 문제를 해결하려면 변수 이름을 괄호로 묶어야 합니다. 이 예제에서 문제를 해결하려면 다음과 같이 변경합니다.

CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM [$(RefServer)].[$(RefDatabase)].dbo.TableName

SQLCLR 프로젝트 및 어셈블리 이름 바꾸기

SQLCLR 프로젝트 및 어셈블리의 이름만 바꾸고 참조를 업데이트하지 않으면 해당 참조가 들어 있는 데이터베이스 프로젝트를 배포할 수 없게 됩니다.

참고

이 문제를 해결하려면 이전 참조를 제거하고 업데이트된 이름으로 SQLCLR 프로젝트 또는 어셈블리에 대한 참조를 추가합니다.

지원되지 않는 FULLTEXT STOPLIST 구문

Visual Studio Premium에서는 CREATE FULLTEXT STOPLIST 문에 대한 선택적 FROM { [DatabaseName.] SourceStoplistName } | SYSTEM STOPLIST ] 구문을 모델링하지 않습니다. 이 구문을 사용하는 개체를 가져올 경우 구문이 무시됩니다.

참고

이 문제를 해결하려면 배포 후 스크립트에 제외 단어를 수동으로 추가해야 합니다. 자세한 내용은 방법: 배포 전 또는 배포 후 스크립트 지정을 참조하십시오.

SORT_IN_TEMPDB 절을 가져올 수 없음

Visual Studio Premium에서는 인덱스에 대한 SORT_IN_TEMPDB 절을 가져올 수 없습니다. 예를 들어 다음과 같은 코드가 있을 수 있습니다.

CREATE TABLE [dbo].[IndexTable]
{
[Column1] [INT] NOT NULL
}
GO
CREATE NONCLUSTERED INDEX [SortInTempDbOn] ON [dbo].[IndexTable]
{
[Column1] ASC
} 
WITH (SORT_IN_TEMPDB = ON)
GO

이때 인덱스는 SORT_IN_TEMPDB 절을 사용하지 않고 가져오게 됩니다.

참고

이 문제를 해결하려면 데이터베이스의 변경 내용을 프로젝트로 가져올 때마다 인덱스 정의를 수동으로 수정해야 합니다.

여러 문이 포함된 테이블 반환 함수를 가져올 경우 따옴표 붙은 식별자 상태가 손실됨

여러 문이 포함된 테이블 반환 함수를 가져올 수 있지만 따옴표 붙은 식별자 문자열의 상태는 SQL Server에 저장되지 않습니다. 이러한 함수를 가져올 경우 따옴표 붙은 식별자의 기본 설정이 설정되어 있으므로 오류가 나타날 수 있습니다.

참고

이 문제를 해결하려면 개체 및 설정을 가져오거나 데이터베이스의 업데이트를 프로젝트에 쓴 후 여러 문이 포함된 테이블 반환 함수의 따옴표 붙은 식별자 설정을 변경해야 합니다.

프로젝트를 다시 빌드한 후에도 일부 프로젝트 오류가 제거되지 않음

데이터베이스 프로젝트에서 발생할 수 있는 일부 오류는 오류 원인을 해결한 후 프로젝트를 다시 빌드하더라도 사라지지 않습니다. 예를 들어 Windows 탐색기를 사용하여 프로젝트에서 참조하는 .sqlpermissions 파일을 삭제하면 예상대로 오류가 발생합니다. 솔루션 탐색기를 사용하여 프로젝트에서 이 파일을 제거한 다음 다시 빌드할 경우 오류를 수정했는데도 오류가 계속 남아 있습니다.

참고

이 문제를 해결하려면 솔루션 탐색기의 도구 모음에서 "프로젝트 다시 분석"을 클릭해야 합니다.

배포 후 스크립트의 잘못된 구문

기본적으로 SQLCMD 모드는 Visual Studio 2010의 Transact-SQL 편집기에서 해제되어 있습니다. SQLCMD가 해제된 이유는 해당 모드가 사용하도록 설정되어 있는 경우 Intellisense가 활성화되지 않기 때문입니다. 배포 후 스크립트에 문을 포함한 경우 배포할 때 다음 오류가 발생할 수 있습니다.

Incorrect syntax near ':'. C:\MySandbox\MySolution\MyProject\Scripts\Post-Deployment\Script.PostDeployment.sql

참고

이 문제를 해결하려면 SQLCMD 모드를 사용하도록 설정해야 합니다. SQLCMD 모드를 사용하도록 설정하려면 Transact-SQL 편집기 도구 모음에서 SQLCMD 모드를 클릭합니다.

참고 항목

작업

방법: 데이터베이스 개체 수정

방법: 두 데이터베이스의 데이터 비교 및 동기화

개념

데이터베이스 개체에 대한 모든 참조 이름 바꾸기

데이터베이스 개체에 대한 모든 참조 이름 바꾸기

변경 기록

날짜

변경 내용

이유

2010년 7월

사용자가 Visual Studio 2010의 기본 동작을 변경할 경우 배포 후 스크립트에 대한 문제의 원인이 될 수 있다는 항목을 추가했습니다.

고객 의견