2013-10-17 6 views
0

아래 쿼리는 두 데이터베이스 간의 기본 키를 비교합니다. 하나의 데이터베이스에서 모든 기본 키 제약 조건을 식별하지만 다른 하나는 식별하지 않습니다. 쿼리를 실행하면 제약 조건 이름 중 일부가 시스템 생성 (즉, PK__afm_scmpref__2D27B809 또는 PK__projfund__E34271EE251CF998)으로 표시됩니다. 이러한 시스템 생성 때문에 데이터베이스간에 비교할 수 없습니다. 이 문제를 해결할 방법이 있습니까?데이터베이스 간의 기본 키 제약 비교

많은 덕분에, 여기

내 코드입니다 :

SELECT src.table_name AS src_table, 
    src.constraint_name AS scr_constraint_name, 
    src.column_name AS src_column_name, 
    src.ordinal_position AS src_ordinal_position, 
    tgt.table_name AS tgt_table_name , 
    tgt.constraint_name AS tgt_constraint_name, 
    tgt.column_name AS tgt_column_name, 
    tgt.ordinal_position AS tgt_ordinal_position 
from db_comp_src_primary_keys src 
    FULL OUTER JOIN 
db_comp_tgt_primary_keys tgt ON 
    src.table_name = tgt.table_name 
    AND src.constraint_name = tgt.constraint_name 

WHERE ( (src.constraint_name IS NULL AND tgt.constraint_name IS NOT NULL) 
    OR (src.constraint_name IS NOT NULL AND tgt.constraint_name IS NULL)) 
AND ( (   tgt.table_name IS NULL 
      AND src.table_name IS NOT NULL 
      AND src.constraint_name IS NOT NULL 
      AND src.table_name IN 
        (SELECT table_name 
         FROM [HQ-193-STOCK-DBO].INFORMATION_SCHEMA.tables)) 
     OR ( src.table_name IS NULL 
      AND tgt.table_name IS NOT NULL 
      AND tgt.constraint_name IS NOT NULL 
      AND tgt.table_name IN 
        (SELECT table_name 
         FROM [HQ-211-STOCK-DBO].INFORMATION_SCHEMA.tables))) 
+2

PK 이름 자체가 아닌 PK의 열 이름 집합을 비교해야합니다. – RBarryYoung

+1

'db_comp_src_primary_keys' 및'db_comp_tgt_primary_keys' 테이블/뷰는 무엇입니까? 정의를 제공 할 수 있습니까? – RBarryYoung

+0

두 데이터베이스가 기본 키가 아닌 다른 스키마를 가지고 있습니까? 테이블의 이름이 같은가요? 그렇지 않으면 무엇을 성취하기를 희망합니까? – Jodrell

답변

0

어떻게 기본 키의 모든 열이 다른 기본 키

과 동일 여부에 체크 비싸지 이런 일에 대한
SELECT DISTINCT 
    QUOTENAME(t1.CONSTRAINT_CATALOG) + '.' + QUOTENAME(t1.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(t1.CONSTRAINT_NAME) [Source], 
    QUOTENAME(t2.CONSTRAINT_CATALOG) + '.' + QUOTENAME(t2.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(t2.CONSTRAINT_NAME) [Target], 
    CASE WHEN t1.CONSTRAINT_NAME IS NULL OR t2.CONSTRAINT_NAME IS NULL THEN 'DISCREPANCY' 
     WHEN t1.CONSTRAINT_NAME <> t2.CONSTRAINT_NAME THEN 'NAME MISMATCH' 
     ELSE 'COMPLETE MATCH' END [Status] 
FROM (
    SELECT c.* 
    FROM msdb.INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
    JOIN msdb.INFORMATION_SCHEMA.KEY_COLUMN_USAGE C 
     ON C.TABLE_NAME = PK.TABLE_NAME 
    AND C.CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
    WHERE PK.CONSTRAINT_TYPE = 'PRIMARY KEY' 
) t1 
FULL JOIN (
    SELECT c.* 
    FROM msdb.INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
    JOIN msdb.INFORMATION_SCHEMA.KEY_COLUMN_USAGE C 
     ON C.TABLE_NAME = PK.TABLE_NAME 
    AND C.CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
    WHERE PK.CONSTRAINT_TYPE = 'PRIMARY KEY' 
) t2 ON t2.TABLE_NAME = t1.TABLE_NAME 
    AND t2.COLUMN_NAME = t1.COLUMN_NAME 
관련 문제