--------------------
tablediff 实用工具
tablediff 实用工具用于比较两个非收敛的表中的数据,它对于排除复制拓扑中的非收敛故障非常有用。可以从命令提示符或在批处理文件中使用该实用工具执行以下任务:
在充当复制发布服务器的 Microsoft SQL Server 实例中的源表与充当复制订阅服务器的一个或多个 SQL Server 实例上的目标表之间进行逐行比较。
通过只比较行数和架构可以执行快速比较。
同时比较多个目标服务器上的目标表。
执行列级比较。
生成 Transact-SQL 脚本,用以修复目标服务器上的差异,以使源表和目标表实现收敛。
将结果记录到输出文件或目标数据库的表中。
语法
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 ]
[ , ... n ]
}
[ -b large_object_bytes ]
[ -c ]
[ -dt ]
[ -et table_name ]
[ -f ]
[ -o output_file_name ]
[ -q ]
[ -t connection_timeouts ]
}
参数
[ -? ]
返回受支持参数的列表。
-sourceserver source_server_name[\instance_name]
源服务器的名称。指定 SQL Server 默认实例的 source_server_name。指定 SQL Server 命名实例的 source_server_name\instance_name。
-sourcedatabase source_database
源数据库的名称。
-sourcetable source_table_name
正在检查的源表的名称。
-sourceschema source_schema_name
源表的架构所有者。默认情况下,表所有者假定为 dbo。
-sourcepassword source_password
使用 SQL Server 身份验证连接到源服务器时所使用的登录帐户的密码。
安全性 注意:
可能的话,请在运行时提供安全凭据。如果必须在脚本文件中存储凭据,则应保护文件以防止未经授权的访问。
-sourceuser source_login
使用 SQL Server 身份验证连接到源服务器时所使用的登录帐户。如果未提供 source_login,则连接到源服务器时使用 Windows 身份验证。
-sourcelocked
在使用 TABLOCK 和 HOLDLOCK 表提示的比较过程中锁定源表。
-destinationserver destination_server_name[\instance_name]
目标服务器的名称。指定 SQL Server 默认实例的 destination_server_name。指定 SQL Server 命名实例的 destination_server_name\instance_name。
-destinationdatabase subscription_database
目标数据库的名称。
-destinationtable destination_table
目标表的名称。
-destinationschema destination_schema_name
目标表的架构所有者。默认情况下,表所有者假定为 dbo。
-destinationpassword destination_password
使用 SQL Server 身份验证连接到目标服务器时所使用的登录帐户的密码。
安全性 注意:
可能的话,请在运行时提供安全凭据。如果必须在脚本文件中存储凭据,则应保护文件以防止未经授权的访问。
-destinationuser destination_login
使用 SQL Server 身份验证连接到目标服务器时所使用的登录帐户。如果未提供 destination_login,则连接到该服务器时使用 Windows 身份验证。
-destinationlocked
在使用 TABLOCK 和 HOLDLOCK 表提示的比较过程中锁定目标表。
-b large_object_bytes
要比较的大型对象数据类型列的字节数,包括:text、ntext、varchar(max)、nvarchar(max) 和 varbinary(max)。默认值是 1000 字节,最大值是 8000 字节。任何大于 large_object_bytes 的数据将不进行比较。
-c
比较列级差异。
-dt
删除 table_name 指定的结果表(如果该表已经存在)。
-et table_name
指定要创建的结果表的名称。如果该表已经存在,则必须使用 -DT,否则操作将失败。
-f
生成 Transact-SQL 脚本,以使目标服务器上的表与源服务器上的表实现收敛。
-o output_file_name
输出文件的完整名称和路径。
-q
通过只比较行数和架构可以执行快速比较。
-t connection_timeouts
设置与源服务器和每个目标服务器连接时的连接超时时间(秒)。
备注
tablediff 实用工具不能用于非 SQL Server 服务器。
通过将每组订阅参数用逗号 (,) 或为 custom_destination_delimiter 指定的字符分隔开来,即可同时比较多个订阅中的表。必须为每个订阅指定同一组订阅参数。有关详细信息,请参阅How to: Compare Replicated Tables for Differences (Replication Programming)。
权限
若要比较表,您必须有要比较的表对象的 SELECT ALL 权限。
若要使用 -et 选项,您必须是 db_owner 固定数据库角色的成员,或者在订阅数据库中至少有 CREATE TABLE 权限,并且对目标服务器上的目标所有者架构拥有 ALTER 权限。
若要使用 -dt 选项,您必须是 db_owner 固定数据库角色的成员,或者至少对目标服务器上的目标所有者架构拥有 ALTER 权限。
若要使用 -o 选项,您必须对指定的文件目录位置拥有写入权限。
-------------------------------------------------------------------------------------------------
use master
Go
IF DB_ID('DatabaseA') IS NOT NULL DROP DATABASE DatabaseA
GO
IF DB_ID('DatabaseB') IS NOT NULL DROP DATABASE DatabaseB
GO
CREATE DATABASE DatabaseA
GO
CREATE DATABASE DatabaseB
GO
USE DatabaseA
GO
CREATE TABLE SourceTable
( IDCol INT IDENTITY(1,1), Field1 SMALLINT, Field2 SMALLINT, Field3 SMALLINT, Field4 SMALLINT
)
GO
USE DatabaseB
GO
CREATE TABLE SourceTable
( IDCol INT IDENTITY(1,1), Field1 SMALLINT, Field2 SMALLINT, Field3 SMALLINT, Field4 SMALLINT
)
GO
USE DatabaseA
GO
INSERT INTO SourceTable
(Field1, Field2, Field3, Field4)
SELECT 1, 1, 1, 2
UNION
SELECT 1, 1, 2, 2
UNION
SELECT 1, 3, 2, 2
UNION
SELECT 1, 3, 2, 2
UNION
SELECT 4, 3, 2, 2
GO
USE DatabaseB
GO
INSERT INTO SourceTable
(Field1, Field2, Field3, Field4)
SELECT 1, 1, 1, 2
UNION
SELECT 1, 3, 2, 1
UNION
SELECT 1, 3, 2, 2
UNION
SELECT 1, 3, 2, 2
UNION
SELECT 5, 3, 2, 2
UNION
SELECT 5, 4, 3, 2
GO
"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe " -sourceserver ".\sql2005" -sourcedatabase "DatabaseA" -sourcetable "SourceTable" -destinationserver ".\sql2005" -destinationdatabase "DatabaseB" -destinationtable "SourceTable" -f "C:\diffs.txt" -destinationlocked
pause