두 데이터베이스의 스키마를 어떻게 비교할 수 있습니까?


19

두 SQL Server 데이터베이스에서 차이점을 찾을 수있는 방법이 있습니까 (스키마 만). 하나는 로컬이고 다른 하나는 고객 사이트에 있습니다. 일부 보고서를 실행하는 Crystal 보고서 및 일부 코드가 실행되지 않는 데 문제가 있으며 스키마가 일치하지 않는 것 같습니다.

두 데이터베이스에서 동일한 명령을 실행하고 결과를 비교하여 차이점이있는 위치를 알 수 있습니까?


SO에 대한이 질문 에는 좋은 제안이 있습니다.
LowlyDBA

답변:


13

연결 문제로 인해 많은 도구 중 하나를 사용할 수없고 "오프라인"비교를 원하는 경우 SSMS를 사용하여 데이터베이스를 마우스 오른쪽 단추로 클릭하고 "작업 ... / 생성"을 사용하여 모든 데이터베이스 개체에 대한 스크립트를 생성 할 수 있습니다. 스크립트 "기능을 사용하고 개체 당 하나의 파일을 작성하도록 선택하십시오.

두 데이터베이스에 대해이 작업을 완료하면 두 개의 스크립트 세트를 두 개의 별도 폴더에있는 로컬 시스템으로 가져오고 WinMerge (또는 유사한)를 사용하여 두 스크립트를 비교하십시오.


6

또 다른 옵션은 Visual Studio의 확장 인 SSDT (SQL Server Data Tools)를 사용하는 것입니다. 데이터베이스 스키마를 .dacpac 파일로 추출하여 다른 .dacpac 파일 또는 기존 데이터베이스와 비교할 수 있습니다. SSDT는 SQL Server 2012 클라이언트 도구에 포함되어있어 액세스가 매우 쉽습니다. MSDN 사이트 에서 비교를 실행하는 방법에 대한 전체 지침을 찾을 수 있습니다 .


6

이 동일한 작업을 수행하는 쉬운 방법으로 고심한 후-두 모델 사이에서 변경된 사항을 확인한 후 두 개의 스키마를 비교하여 새 열과 삭제 된 열을 결정하는 다음 SQL 스크립트를 작성했습니다.

set nocount on;
-- Set the two variables newmodel and oldmodel to the appropriate database names and execute the script

declare @newmodel varchar(50), @oldmodel varchar(50);

Set @newmodel = '[NewModel to Compare]';
set @oldmodel = '[OldModel to Compare]';


Declare @Temp table (TABLE_SCHEMA varchar(40), TABLE_NAME varchar(40), COLUMN_NAME varchar(50), ORDINAL_POSITION int, IS_NULLABLE varchar(5), NullChange varchar(5), Comment varchar(50));

Declare @script varchar(5000);


set @script = '
Select nc.TABLE_SCHEMA, nc.TABLE_NAME, nc.COLUMN_NAME, nc.ORDINAL_POSITION, nc.IS_NULLABLE, IIF(nc.IS_NULLABLE <> oc.IS_NULLABLE, ''Yes'', ''No''), 
        IIF(oc.COLUMN_NAME IS NULL, convert(varchar(20), ''ADDED COLUMN''), convert(varchar(20), ''--'')) as Comment
    from {NEW}.INFORMATION_SCHEMA.COLUMNS nc
        LEFT join {OLD}.INFORMATION_SCHEMA.COLUMNS oc 
            on nc.TABLE_NAME = oc.TABLE_NAME and nc.COLUMN_NAME = oc.COLUMN_NAME
UNION ALL
    Select oc.TABLE_SCHEMA, oc.TABLE_NAME, oc.COLUMN_NAME, oc.ORDINAL_POSITION, oc.IS_NULLABLE, ''No'', ''DELETED COLUMN'' as Comment
    from {OLD}.INFORMATION_SCHEMA.COLUMNS oc
    where CONCAT(oc.TABLE_NAME, ''.'', oc.COLUMN_NAME) 
        not in (Select CONCAT(TABLE_NAME, ''.'', COLUMN_NAME) from {NEW}.INFORMATION_SCHEMA.COLUMNS)
';


Set @script = replace(@script, '{OLD}', @oldmodel);
Set @script = replace(@script, '{NEW}', @newmodel);

--print @script

Insert into @Temp
    exec(@script);

Select * from @Temp where Comment <> '--'
order by TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME;
go

추가 소프트웨어가 필요없는 빠르고 더러운 솔루션의 경우이 기능이 훌륭합니다! 정확히 내가 필요한 것입니다. 감사!
Mir

2

하나 이상의 데이터베이스 파일을 비교해야하는 경우 스크립팅 할 수 있습니다 SQLPackage.exe.

작업 코드가 없지만 영감을 얻기 위해 SQLPackage.exe 설명서 를 볼 수 있습니다.

마스터 데이터베이스를 dacpac 파일로 추출한 후 dacpac 파일을 나머지 데이터베이스와 비교합니다. 비교 결과는 변경 사항에 대한 xml 보고서이거나 데이터베이스를 동기화하기 위해 실행할 수있는 .sql 파일 일 수 있습니다.

이 같은:

sqlpackage.exe /a:Extract /scs:Server=MyLaptopSQL2014;Database=Test; /tf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac  

그리고

sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test1 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest1.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 
 sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test2 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest2.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 

당신은 한 번 봐 가질 수 이 문서 또는 이 하나의 샘플 코드를.


1

"SQL Server Compare"를 검색하면 많은 도구를 찾을 수 있습니다. 우리 직장에서 사용하는 것은 Red Gate SQLCompare 입니다. 14 일의 평가판이 있습니다. 그러나 두 가지 환경에 대해 이야기하고 있기 때문에 클라이언트가 DB 백업을 보내지 않으면 그것이 효과가 있다고 생각하지 않습니다. 다른 옵션은 시스템 테이블 (sys.indexes, sys.tables 등)에 대한 쿼리를 작성하는 것입니다.


두 서버 모두에 로그인 한 경우 SQL Compare가 제대로 작동합니다. 각 DB에 대해 다른 로그인을 사용할 수 있으므로 클라이언트는 액세스 권한이 있는지 확인해야합니다.
Mark Sinkinson

1

가장 쉬운 방법은 이 용도로 구축 된 자동화 된 도구사용하는 것이지만 액세스 할 수없는 경우 INFORMATION_SCHEMA보기 에서 필요한 모든 기본 정보를 얻을 수 있습니다.

메타 데이터를 사용하는 INFORMATION_SCHEMA것은 아마도 DDL 스크립트를 생성하고 소스 비교를 수행하는 것보다 더 쉬운 옵션 일 것입니다. 데이터 표시 방법을 훨씬 더 많이 제어 할 수 있기 때문입니다. 생성 된 스크립트가 객체를 데이터베이스에 표시하는 순서를 실제로 제어 할 수는 없습니다. 또한 스크립트에는 기본적으로 구현에 따라 다를 수있는 텍스트가 포함되어 있으며 실제로 초점을 맞춰야 할 테이블, 뷰 또는 열 또는 열 데이터 형식 일 경우 많은 "일치하지 않는"노이즈가 발생할 수 있습니다. 또는 크기 불일치.

INFORMATION_SCHEMA뷰 에서 코드에 중요한 정보를 가져 와서 SSMS의 각 SQL Server에서 실행 하는 쿼리를 작성하십시오 . 그런 다음 결과를 파일로 덤프하고 텍스트 파일 비교 도구 (MS Word 포함)를 사용하거나 결과를 테이블로 덤프하고 SQL 쿼리를 실행하여 불일치를 찾을 수 있습니다.


1

중복으로 표시된 새로운 질문을 위해이 답변을 포함하고 있습니다.

한 번은 두 개의 프로덕션 데이터베이스를 비교하고 이들 간의 스키마 차이를 찾아야했습니다. 관심있는 유일한 항목은 추가 또는 삭제 된 테이블과 추가, 제거 또는 변경된 열이었습니다. 더 이상 개발 한 SQL 스크립트가 없지만 일반적인 전략은 다음과 같습니다. 그리고 데이터베이스는 SQL Server는 아니지만 동일한 전략이 적용됩니다.

먼저 메타 데이터베이스로 가장 잘 설명 할 수있는 것을 만들었습니다. 이 데이터베이스의 사용자 테이블에는 프로덕션 데이터베이스의 시스템 테이블에서 복사 된 데이터 설명이 포함되어 있습니다. 테이블 이름, 열 이름, 데이터 유형 및 정밀도와 같은 것. 프로덕션 데이터베이스에 존재하지 않는 Database Name이라는 항목이 하나 더 있습니다.

다음으로 메타 데이터베이스의 사용자 테이블에 삽입하여 프로덕션 데이터베이스의 시스템 테이블에서 선택 항목을 결합한 스크립트를 개발했습니다.

마지막으로 한 데이터베이스에는 존재하지만 다른 데이터베이스에는 존재하지 않는 테이블과 한 데이터베이스에만있는 두 데이터베이스에있는 테이블의 열 및 두 데이터베이스간에 정의가 일치하지 않는 열을 찾기위한 쿼리를 개발했습니다.

약 100 개의 테이블과 600 개의 열 중 소수의 불일치와 하나의 데이터베이스에서 부동 소수점으로 정의되고 다른 하나에서 정수로 정의 된 하나의 열을 발견했습니다. 그 마지막 것은 수년간 데이터베이스 중 하나를 괴롭힌 문제를 발굴했기 때문에 신의 선물로 밝혀졌습니다.

메타 데이터베이스 모델은 해당 시스템 테이블에서 제안했습니다. 쿼리는 구성하기가 어렵지 않았으며 주로 그룹을 중심으로 회전하며 count (database name) = 1입니다.

700 개의 프로덕션 데이터베이스를 사용하는 경우 두 데이터베이스 만 사용하여 수행 한 것보다 처음 두 단계를 자동화하는 것이 좋습니다. 그러나 아이디어는 비슷합니다.


1

나는 똑같은 질문을했고 Microsoft SQL Server Management Studio (SSMS)는 내가 본 것보다 훨씬 쉽고 간단한 해결책을 가지고 있다고 생각합니다. MS SQL Server Express를 사용하는 프로덕션 사이트가 있으며 곧 VisualStudio 나 SSMS 이외의 다른 응용 프로그램을 설치하고 싶지 않은 곳이 더 많아 질 것입니다.

따라서 SSMS 내에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭하여 스키마를 가져옵니다. 작업> 스크립트 생성 ... 을 선택 하여 마법사를 열어 전체 데이터베이스 (또는 원하는 경우 선택한 개체)의 스키마 및 구성을 스크립팅하십시오. 경로 / 파일 이름을 제외한 모든 기본 옵션을 유지했지만 도구에는 많은 옵션이 있습니다. 마법사는 OneDrive를 통해 PC로 다시 복사 한 하나의 SQL을 작성했습니다. 그런 다음 Notepad ++을 사용하여 SQL을 SIT 데이터베이스와 동일한 방식으로 생성 된 파일과 비교했습니다. 주석에서 날짜 / 시간의 적중을 필터링해야하지만 그렇지 않은 경우 두 데이터베이스를 크게 비교합니다.

프레스토 악장! 이것을 작성하는 것은 실제 비교를 수행하는 것보다 훨씬 어렵습니다.


0

내가 사용하는 훌륭한 도구는 (아직 작동하지는 않지만) AdeptSqlDiff입니다.

스키마 비교와 데이터 비교를 모두 수행합니다. RedGate와 마찬가지로 비용도 있지만 30 일의 평가판이 있습니다. 그리고 가격은 꽤 합리적입니다.


0

아마이 무료 스크립트 https://github.com/dlevsha/compalex 가 당신을 도울 수 있습니다. Microsoft SQL Server를 지원합니다.

Compalex는 두 개의 데이터베이스 스키마를 비교하는 무료 경량 스크립트입니다. MySQL, MS SQL Server 및 PostgreSQL을 지원합니다.

여기서 데모를 시도 할 수 있습니다

http://demo.compalex.net/



0

시장에는 작업을 수행하는 데 사용할 수있는 많은 도구가 있습니다. 우리 회사는 Azure에 무료이기 때문에 비교 및 ​​동기화에 ApexSQL Diff 를 사용 하고 있지만 Devart 또는 Redgate 도구로는 문제가 없습니다.


0

저는 SQL DBDiff 의 팬입니다 .이 SQL Server 데이터베이스 인스턴스의 테이블, 뷰, 함수, 사용자 등을 비교하고 소스 데이터베이스와 대상 데이터베이스간에 변경 스크립트를 생성하는 데 사용할 수있는 오픈 소스 도구 인 SQL DBDiff 의 팬입니다 .


0

MSSQL 데이터베이스, 구조 및 데이터를 비교할 수 있는 MssqlMerge 유틸리티를 만들었습니다 . 테이블 정의, 뷰, 저장 프로 시저 및 함수를 비교할 수있는 무료 버전이 있습니다. 또한 더 많은 객체 유형을 지원하고 '조회 결과 차이'기능을 갖춘 Pro 버전이있어 시스템 조회에 대한 조회를 포함하여 조회 결과를 실행하고 비교하여 즉시 사용할 수없는 다른 세부 사항을 비교할 수 있습니다.


-1

이것 좀 봐:

SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA in ('dbo','meta')
and table_name in (select name from sys.tables)
order by TABLE_SCHEMA ,       TABLE_NAME ,ORDINAL_POSITION

여기에 이미지 설명을 입력하십시오


3
이것은 단지 스키마를 얻는 것뿐만 아니라 비교에 관한 것이
어야합니다

다른 사람들을 돕기 위해 여기에 남겨 두겠습니다. 그것은 나를 도왔다
Jeremy Thompson


-1

DBDiff가 가장 적합한 도구입니다 . 여기에서 찾을 수 있습니다 .


데이터베이스 관리자에 오신 것을 환영합니다! 보시다시피, 여기에 잘 수신 된 모든 답변은 단순한 링크 이상 입니다. 고려하시기 바랍니다 편집 답을 보내고을하고는 문제의 요구 사항을 충족 특히 방법, 소프트웨어에 대한 자세한 정보를 추가합니다.
Glorfindel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.