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


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.