Disaster durumlarından geri dönüşlerde yada herhangi bir ihtiyaç duyulduğunda 2 table ı row bazında karşılaştırma ihtiyacı doğabilir. Böyle bir durum SQL Server DBA için oldukça sıkıcı bir durumdur.
SQL Server 2005 ile beraber gelen TableDiff.exe bu ihtiyaca oldukça yeterli çözüm sağlamaktadır.
Temel syntax ı şu şekildedir;
tablediff
[ -? ] |
{
-sourceserver source_server_name[\instance_name]
-sourcedatabase source_database
-sourcetable source_table_name
[ -sourceschema source_schema_name ]
[ -sourcepassword source_password ]
[ -sourceuser source_login ]
[ -sourcelocked ]
-destinationserver destination_server_name[\instance_name]
-destinationdatabase subscription_database
-destinationtable destination_table
[ -destinationschema destination_schema_name ]
[ -destinationpassword destination_password ]
[ -destinationuser destination_login ]
[ -destinationlocked ]
[ -b large_object_bytes ]
[ -bf number_of_statements ]
[ -c ]
[ -dt ]
[ -et table_name ]
[ -f [ file_name ] ]
[ -o output_file_name ]
[ -q ]
[ -rc number_of_retries ]
[ -ri retry_interval ]
[ -strict ]
[ -t connection_timeouts ]
}
Şimdi denemeler yapmak için bazı table lar create edip içlerini dolduralım.
--database create et
CREATE DATABASE DBDiff
--1.table
CREATE TABLE [dbo].[TableDiff1](
[id] [int] NOT NULL,
[Ad] [varchar](50) NULL,
[SoyAd] [varchar](50) NULL,
CONSTRAINT [PK_TableDiff1] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
--2.table
CREATE TABLE [dbo].[TableDiff2](
[id] [int] NOT NULL,
[Ad] [varchar](50) NULL,
[SoyAd] [varchar](50) NULL,
CONSTRAINT [PK_TableDiff2] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
--1.table ı doldur
INSERT INTO TableDiff1(id,Ad,Soyad) VALUES (1,'Turgay','Sahtiyan');
INSERT INTO TableDiff1(id,Ad,Soyad) VALUES (3,'Ahmet','Mehmet');
INSERT INTO TableDiff1(id,Ad,Soyad) VALUES (5,'Veli','Deli');
--2.table ı doldur
INSERT INTO TableDiff2(id,Ad,Soyad) VALUES (1,'Turgay','Sahtiyan');
INSERT INTO TableDiff2(id,Ad,Soyad) VALUES (3,'Ahmet','Ahmet');
INSERT INTO TableDiff2(id,Ad,Soyad) VALUES (4,'Murtaza','Kirmizi');
Table ların şu anki durumlarına bakacak olursak;
SELECT * from TableDiff1
SELECT * from TableDiff2
Şimdi aşağıdaki verileri doldurarak ilk karşılaştırmamızı yapalım;
- sourceserver : Kaynak server ın adı. Instance varsa \ şeklinde instance da eklenmelidir
- sourcedatabase : Kaynak Veritabanı Adı
- sourcetable : Kaynak Table
- destinationserver : Hedef server ın adı.
- Instance varsa kullanılmalı.
- destinationdatabase : Hedef Veritabanı Adı
- destinationtable : Hedef Table ın adı.
Karşılaştırmalar her zaman kaynak bilgiler baz alınarak yapılır. Hedef table kaynak table a benzetilmeye çalışılır.
İlk karşılaştırmamız için aşağıdaki kod bloğunu command prompt ta çalıştıralım.
"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe" –sourceserver SAHTIYAN_T\SQL10ENT -sourcedatabase DBDiff -sourcetable tablediff1 –destinationserver SAHTIYAN_T\SQL10ENT -destinationdatabase DBDiff -destinationtable TableDiff2
Sonuç:
Microsoft (R) SQL Server Replication Diff Tool
Copyright (c) 2008 Microsoft Corporation
User-specified agent parameter values:
-sourceserver SAHTIYAN_T\SQL10ENT
-sourcedatabase DBDiff
-sourcetable tablediff1
-destinationserver SAHTIYAN_T\SQL10ENT
-destinationdatabase DBDiff
-destinationtable TableDiff2
Table [DBDiff].[dbo].[tablediff1] on SAHTIYAN_T\SQL10ENT and Table [DBDiff].[dbo].[TableDiff2] on SAHTIYAN_T\SQL10ENT have 3 differences.
Err id
Mismatch 3
Dest. Only 4
Src. Only 5
The requested operation took 0,109375 seconds.
3 kayıdın tutmadığı bilgisini aldık ama bunların hangi kayıtlar olduğu hakkında bir fikrimiz yok.
Bu bilgiyide almak için –et parametresini kullanıyoruz. –et parametresi ile ismini verdiğimiz table ı create edip farklı olan kayıtları bu table ın içine atıyoruz. Eğer olan bir table ı kullanıyorsak –et yerine –dt kullanmamız gerekmekte yoksa table olduğu için ve tekrar create etmeye çalışacağı için hata verecektir.
Z:\>"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe" –sourceserver SAHTIYAN_T\SQL10ENT -sourcedatabase DBDiff -sourcetable tablediff1 -destinationserver SAHTIYAN_T\SQL10ENT -destinationdatabase DBDiff -destinationtable TableDif f2 -et DifferenceTbl
Bu işlem sonucunda DifferenceTbl dolmuş olacaktır.
select * from DifferenceTbl
Gelen bu sonuca baktığımızda gene pek anlaşılır bir sonuç olmadığını görüyoruz.Hangi kayıtların tutmadığını bilgisi var ama tutmayan bilgiler nedir bunu göremiyoruz.
Şimdi kullanacağımız bir diğer parametre olan –f parametresi ise bize oldukça detay bilgi verecektir. Bu parametre vasıtasıyla hedef table ı kaynak table a benzetmek için uygulanması gereken sql komutlarını bir dosyanın içinde toplayabiliyoruz.
Z:\>"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe" –sourceserver
SAHTIYAN_T\SQL10ENT -sourcedatabase DBDiff -sourcetable tablediff1 -destinationserver SAHTIYAN_T\SQL10ENT -destinationdatabase DBDiff -destinationtable TableDiff2 -et DifferenceTbl -f c:\TableDiff.sql
c:\TableDiff.sql dosyasına bakacak olursak;
-- Host: SAHTIYAN_T\SQL10ENT
-- Database: [DBDiff]
-- Table: [dbo].[TableDiff2]
UPDATE [dbo].[TableDiff2] SET [SoyAd]=N'Mehmet' WHERE [id] = 3
DELETE FROM [dbo].[TableDiff2] WHERE [id] = 4
INSERT INTO [dbo].[TableDiff2] ([Ad],[id],[SoyAd]) VALUES (N'Veli',5,N'Deli')
Son olarak –bf parametresine bakalım. Bu parametre ile de sql komutlarına yerleştirdiğimiz dosyanın alabileceği maksimum satır sayısını belirleyebiliyoruz. Mesela bu örnek için bu parametreyi 1 olarak kullanırsak;
Z:\>"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe" –sourceserver
SAHTIYAN_T\SQL10ENT -sourcedatabase DBDiff -sourcetable tablediff1 -destinationserver SAHTIYAN_T\SQL10ENT -destinationdatabase DBDiff -destinationtable TableDiff2 -et DifferenceTbl -f c:\TableDiff.sql -bf 1
3 tane dosya oluşacak ve her dosyanın içinde 1 satır sql komutu bulunacaktır.
TableDiff.0.sql
-- Host: SAHTIYAN_T\SQL10ENT
-- Database: [DBDiff]
-- Table: [dbo].[TableDiff2]
UPDATE [dbo].[TableDiff2] SET [SoyAd]=N'Mehmet' WHERE [id] = 3
TableDiff.1.sql
-- Host: SAHTIYAN_T\SQL10ENT
-- Database: [DBDiff]
-- Table: [dbo].[TableDiff2]
DELETE FROM [dbo].[TableDiff2] WHERE [id] = 4
TableDiff.2.sql
-- Host: SAHTIYAN_T\SQL10ENT
-- Database: [DBDiff]
-- Table: [dbo].[TableDiff2]
INSERT INTO [dbo].[TableDiff2] ([Ad],[id],[SoyAd]) VALUES (N'Veli',5,N'Deli')
TableDiff.exe nin kullanımı bu şekilde. Umarım açıklayıcı bir yazı olmuştur.
Kolay gelsin
Turgay Sahtiyan
f31d8dfd-2240-416f-a913-b3fe077c1c7b|0|.0