2 Datenbanken vergleichen
Wie im Artikel Prüfen ob Inhalt 2er Tabellen gleich ist beschrieben, kann es nützlich sein, zu überprüfen ob die Inhalte von Tabellen in 2 Datenbanken identisch sind. Folgendes Script erledigt dies auf einem MS SQL Server komplett automatisch:
if exists (select 1 from sysobjects where id = object_id('COMP_RES ') and type = 'U') drop table COMP_RES go CREATE TABLE COMP_RES ( TABLE_NAME varchar(200), DIFFERENCES int, SQL varchar(8000), LC datetime not null default getDate() ) go set nocount on declare @table varchar(200) declare @col varchar(8000) declare @col_tmp varchar(200) declare @db_1 varchar(250) declare @db_2 varchar(250) declare @schema varchar(100) declare @sql varchar(8000) exec ('truncate table COMP_RES') set @schema = '<SCHEMA_TO COMPARE>' set @db_1 = '' set @db_2 = '' declare tables cursor for select TABLE_SCHEMA + '.' + TABLE_NAME from information_schema.tables where table_type='base table' and table_schema=@schema order by table_name open tables fetch next from tables into @table while @@fetch_status = 0 begin if not @table like '%COMP_RES' begin set @col='' declare columns cursor for select column_name from information_schema.columns where table_schema+'.'+table_name=@table open columns fetch next from columns into @col_tmp while @@fetch_status = 0 begin if @col <> '' set @col = @col + ', ' set @col = @col + @col_tmp fetch next from columns into @col_tmp end CLOSE columns DEALLOCATE columns set @sql = 'SELECT COUNT(*) AS DIFFERENCES FROM ( (SELECT ' + @col + ', count(*) AS COUNT FROM ' + @db_1+'.'+@table + ' GROUP BY ' + @col + ' EXCEPT ' + 'SELECT ' + @col + ', count(*) AS COUNT FROM ' + @db_2+'.'+@table + ' GROUP BY ' + @col + ' )' + 'UNION ALL' + '(SELECT ' + @col + ', count(*) AS COUNT FROM ' + @db_2+'.'+@table + ' GROUP BY ' + @col + ' EXCEPT ' + 'SELECT ' + @col + ', count(*) AS COUNT FROM ' + @db_1+'.'+@table + ' GROUP BY ' + @col + ' ) )T' --print @sql exec ('INSERT INTO COMP_RES (TABLE_NAME, DIFFERENCES, SQL) VALUES ('''+@table+''', null, '''+@sql+''')') exec ('UPDATE COMP_RES SET DIFFERENCES = ('+@sql+'), LC=getDate() WHERE TABLE_NAME='''+@table+'''') end fetch next from tables into @table end CLOSE tables DEALLOCATE tables
Zunächst wird im Standardschema des verwendeten Benutzers eine Tabelle "COMP_RES" angelegt, in der die Ergebnisse des Vergleichs abgelegt werden. Anschließend werden alle Tabellen in @db_1 gesucht und die aus dem oben erwähnten Artikel bekannten Vergleich SQL's gebaut. Diese werden anschließend ausgeführt und die Ergebnisse in der Tabelle COMP_RES abgelegt. So lässt sich die Aufgabe die Datenbanken zu vergleichen wunderbar auf verschiedene Datenbanken anwenden und/oder automatisieren.