두 SQL Server 데이터베이스에서 차이점을 찾을 수있는 방법이 있습니까 (스키마 만). 하나는 로컬이고 다른 하나는 고객 사이트에 있습니다. 일부 보고서를 실행하는 Crystal 보고서 및 일부 코드가 실행되지 않는 데 문제가 있으며 스키마가 일치하지 않는 것 같습니다.
두 데이터베이스에서 동일한 명령을 실행하고 결과를 비교하여 차이점이있는 위치를 알 수 있습니까?
두 SQL Server 데이터베이스에서 차이점을 찾을 수있는 방법이 있습니까 (스키마 만). 하나는 로컬이고 다른 하나는 고객 사이트에 있습니다. 일부 보고서를 실행하는 Crystal 보고서 및 일부 코드가 실행되지 않는 데 문제가 있으며 스키마가 일치하지 않는 것 같습니다.
두 데이터베이스에서 동일한 명령을 실행하고 결과를 비교하여 차이점이있는 위치를 알 수 있습니까?
답변:
이 동일한 작업을 수행하는 쉬운 방법으로 고심한 후-두 모델 사이에서 변경된 사항을 확인한 후 두 개의 스키마를 비교하여 새 열과 삭제 된 열을 결정하는 다음 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
하나 이상의 데이터베이스 파일을 비교해야하는 경우 스크립팅 할 수 있습니다 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
"SQL Server Compare"를 검색하면 많은 도구를 찾을 수 있습니다. 우리 직장에서 사용하는 것은 Red Gate SQLCompare 입니다. 14 일의 평가판이 있습니다. 그러나 두 가지 환경에 대해 이야기하고 있기 때문에 클라이언트가 DB 백업을 보내지 않으면 그것이 효과가 있다고 생각하지 않습니다. 다른 옵션은 시스템 테이블 (sys.indexes, sys.tables 등)에 대한 쿼리를 작성하는 것입니다.
가장 쉬운 방법은 이 용도로 구축 된 자동화 된 도구 를 사용하는 것이지만 액세스 할 수없는 경우 INFORMATION_SCHEMA
보기 에서 필요한 모든 기본 정보를 얻을 수 있습니다.
메타 데이터를 사용하는 INFORMATION_SCHEMA
것은 아마도 DDL 스크립트를 생성하고 소스 비교를 수행하는 것보다 더 쉬운 옵션 일 것입니다. 데이터 표시 방법을 훨씬 더 많이 제어 할 수 있기 때문입니다. 생성 된 스크립트가 객체를 데이터베이스에 표시하는 순서를 실제로 제어 할 수는 없습니다. 또한 스크립트에는 기본적으로 구현에 따라 다를 수있는 텍스트가 포함되어 있으며 실제로 초점을 맞춰야 할 테이블, 뷰 또는 열 또는 열 데이터 형식 일 경우 많은 "일치하지 않는"노이즈가 발생할 수 있습니다. 또는 크기 불일치.
INFORMATION_SCHEMA
뷰 에서 코드에 중요한 정보를 가져 와서 SSMS의 각 SQL Server에서 실행 하는 쿼리를 작성하십시오 . 그런 다음 결과를 파일로 덤프하고 텍스트 파일 비교 도구 (MS Word 포함)를 사용하거나 결과를 테이블로 덤프하고 SQL 쿼리를 실행하여 불일치를 찾을 수 있습니다.
중복으로 표시된 새로운 질문을 위해이 답변을 포함하고 있습니다.
한 번은 두 개의 프로덕션 데이터베이스를 비교하고 이들 간의 스키마 차이를 찾아야했습니다. 관심있는 유일한 항목은 추가 또는 삭제 된 테이블과 추가, 제거 또는 변경된 열이었습니다. 더 이상 개발 한 SQL 스크립트가 없지만 일반적인 전략은 다음과 같습니다. 그리고 데이터베이스는 SQL Server는 아니지만 동일한 전략이 적용됩니다.
먼저 메타 데이터베이스로 가장 잘 설명 할 수있는 것을 만들었습니다. 이 데이터베이스의 사용자 테이블에는 프로덕션 데이터베이스의 시스템 테이블에서 복사 된 데이터 설명이 포함되어 있습니다. 테이블 이름, 열 이름, 데이터 유형 및 정밀도와 같은 것. 프로덕션 데이터베이스에 존재하지 않는 Database Name이라는 항목이 하나 더 있습니다.
다음으로 메타 데이터베이스의 사용자 테이블에 삽입하여 프로덕션 데이터베이스의 시스템 테이블에서 선택 항목을 결합한 스크립트를 개발했습니다.
마지막으로 한 데이터베이스에는 존재하지만 다른 데이터베이스에는 존재하지 않는 테이블과 한 데이터베이스에만있는 두 데이터베이스에있는 테이블의 열 및 두 데이터베이스간에 정의가 일치하지 않는 열을 찾기위한 쿼리를 개발했습니다.
약 100 개의 테이블과 600 개의 열 중 소수의 불일치와 하나의 데이터베이스에서 부동 소수점으로 정의되고 다른 하나에서 정수로 정의 된 하나의 열을 발견했습니다. 그 마지막 것은 수년간 데이터베이스 중 하나를 괴롭힌 문제를 발굴했기 때문에 신의 선물로 밝혀졌습니다.
메타 데이터베이스 모델은 해당 시스템 테이블에서 제안했습니다. 쿼리는 구성하기가 어렵지 않았으며 주로 그룹을 중심으로 회전하며 count (database name) = 1입니다.
700 개의 프로덕션 데이터베이스를 사용하는 경우 두 데이터베이스 만 사용하여 수행 한 것보다 처음 두 단계를 자동화하는 것이 좋습니다. 그러나 아이디어는 비슷합니다.
나는 똑같은 질문을했고 Microsoft SQL Server Management Studio (SSMS)는 내가 본 것보다 훨씬 쉽고 간단한 해결책을 가지고 있다고 생각합니다. MS SQL Server Express를 사용하는 프로덕션 사이트가 있으며 곧 VisualStudio 나 SSMS 이외의 다른 응용 프로그램을 설치하고 싶지 않은 곳이 더 많아 질 것입니다.
따라서 SSMS 내에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭하여 스키마를 가져옵니다. 작업> 스크립트 생성 ... 을 선택 하여 마법사를 열어 전체 데이터베이스 (또는 원하는 경우 선택한 개체)의 스키마 및 구성을 스크립팅하십시오. 경로 / 파일 이름을 제외한 모든 기본 옵션을 유지했지만 도구에는 많은 옵션이 있습니다. 마법사는 OneDrive를 통해 PC로 다시 복사 한 하나의 SQL을 작성했습니다. 그런 다음 Notepad ++을 사용하여 SQL을 SIT 데이터베이스와 동일한 방식으로 생성 된 파일과 비교했습니다. 주석에서 날짜 / 시간의 적중을 필터링해야하지만 그렇지 않은 경우 두 데이터베이스를 크게 비교합니다.
프레스토 악장! 이것을 작성하는 것은 실제 비교를 수행하는 것보다 훨씬 어렵습니다.
내가 사용하는 훌륭한 도구는 (아직 작동하지는 않지만) AdeptSqlDiff입니다.
스키마 비교와 데이터 비교를 모두 수행합니다. RedGate와 마찬가지로 비용도 있지만 30 일의 평가판이 있습니다. 그리고 가격은 꽤 합리적입니다.
아마이 무료 스크립트 https://github.com/dlevsha/compalex 가 당신을 도울 수 있습니다. Microsoft SQL Server를 지원합니다.
Compalex는 두 개의 데이터베이스 스키마를 비교하는 무료 경량 스크립트입니다. MySQL, MS SQL Server 및 PostgreSQL을 지원합니다.
여기서 데모를 시도 할 수 있습니다
스키마 및 데이터 비교 및 동기화를 수행하는 많은 타사 도구가 있습니다. 사용할 수있는 두 가지 도구는 팀과 제가 개발 한 도구로, 스키마 비교를 위한 xSQL 스키마 비교 와 동일한 스키마를 가진 개체 간의 데이터 비교를 위한 xSQL 데이터 비교 입니다. 도움이 되었기를 바랍니다!
면책 조항 : 저는 xSQL에 소속되어 있습니다.
시장에는 작업을 수행하는 데 사용할 수있는 많은 도구가 있습니다. 우리 회사는 Azure에 무료이기 때문에 비교 및 동기화에 ApexSQL Diff 를 사용 하고 있지만 Devart 또는 Redgate 도구로는 문제가 없습니다.
저는 SQL DBDiff 의 팬입니다 .이 SQL Server 데이터베이스 인스턴스의 테이블, 뷰, 함수, 사용자 등을 비교하고 소스 데이터베이스와 대상 데이터베이스간에 변경 스크립트를 생성하는 데 사용할 수있는 오픈 소스 도구 인 SQL DBDiff 의 팬입니다 .
MSSQL 데이터베이스, 구조 및 데이터를 비교할 수 있는 MssqlMerge 유틸리티를 만들었습니다 . 테이블 정의, 뷰, 저장 프로 시저 및 함수를 비교할 수있는 무료 버전이 있습니다. 또한 더 많은 객체 유형을 지원하고 '조회 결과 차이'기능을 갖춘 Pro 버전이있어 시스템 조회에 대한 조회를 포함하여 조회 결과를 실행하고 비교하여 즉시 사용할 수없는 다른 세부 사항을 비교할 수 있습니다.
이것 좀 봐:
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
나는이 무료 및 오픈 소스 도구를 사용합니다 : OpenDBDiff