SQL Server レプリケーション (トラブルシューティング)

このトピックには、OLE DB Provider for DB2 and SQL Server (Data Provider) と SQL Server 間の問題のトラブルシューティングに関連する次のセクションが含まれています。

正しくないデータ型マッピング

DATETIME2 列を DB2 TIMESTAMP 列にレプリケートできない

SQL Server レプリケーションの詳細については、SQL Serverオンライン ブックの開発者ガイド (レプリケーション) (https://go.microsoft.com/fwlink/?LinkId=193231) を参照してください。

正しくないデータ型マッピング

SQL Server レプリケーションでは、SQL Server から DB2 データ型への既定のマッピングに基づき、データが不適切に変換される場合があります。 管理者および開発者が、次の SQL Server システム ストアド プロシージャを使用して、レプリケーションのデータ型マッピングを確認し、修正することをお勧めします。

sp_helpdatatypemap

sp_getdefaultdatatypemapping

sp_setdefaultdatatypemapping

詳細については、「システム ストアド プロシージャ (Transact-SQL)」を参照してくださいhttps://go.microsoft.com/fwlink/?LinkID=180765\

DATETIME2 列を DB2 TIMESTAMP 列にレプリケートできない

問題

DB2 for z/OS への SQL Server 2008 のレプリケーションは、SQLCODE -188 (datetime 値の文字列表現が有効な datetime 値ではない) と表示されて失敗することがあります。 このエラーが発生するのは、DATETIME2 を DB2 VARCHAR(27) にマップし、文字列のリテラル データ値と共にサブスクリプション アーティクル コマンドを使用するようにレプリケーションが構成されている場合です。

ソリューション

SQL Server 2008 レプリケーションを DATETIME2 から DB2 TIMESTAMP にマップするように再構成し、サブスクリプション アーティクル コマンドをパラメーターを使用して再構成します。 これにより、データ プロバイダーは、IBM DB2 データベース サーバーでサポートされている DB2 TIMESTAMP 構造体として、DATETIME2 をフォーマットできるようになります。

ステップ バイ ステップの手順

手順 1. 変更するデータ型のマッピングを確認します。 すべての手順について、USE MASTER

select * from sys.fn_helpdatatypemap  
(  
   'MSSQLSERVER',  
    '%',  
    '%',  
    '%',  
    '%',  
    '%',  
    0  
)  
where destination_dbms = 'DB2' and source_type = 'datetime2'  
  

結果には、変更する mapping_id が示されます。 この例の結果ペイン (mapping_id が 189) を次の表に示します。

mapping_id source_dbms source_type destination_dbms destination_type destination_length
189 MSSQLSERVER datetime2 DB2 VARCHAR 27

手順 2. データ型のマッピングを削除します。

exec sp_dropdatatypemapping  189  

手順 3. データ型のマッピングを追加します。

exec  sp_adddatatypemapping   
    @source_dbms                  = 'MSSQLSERVER',    
    @source_type                  = 'datetime2',  
    @destination_dbms             = 'DB2',  
    @destination_type             = 'TIMESTAMP',  
    @destination_nullable         = 1,  
    @destination_createparams     = 0,  
    @dataloss                     = 0,  
    @is_default                   = 1  
  

手順 4. 再度クエリを実行して新しいデータ型のマッピングを確認します。

select * from sys.fn_helpdatatypemap  
(  
   'MSSQLSERVER',  
    '%',  
    '%',  
    '%',  
    '%',  
    '%',  
    0  
)  
where destination_dbms = 'DB2' and source_type = 'datetime2'  
  

結果に新しいデータ型のマッピングが表示されます。 この例では、次の表に示されている mapping_id は 189 です。

mapping_id source_dbms source_type destination_dbms destination_type destination_length
494 MSSQLSERVER datetime2 DB2 timestamp NULL

手順 5. 再構成するレプリケーション サブスクリプション アーティクルを確認します。 Transact-SQL USE ステートメントを使用して、マスター データベースからレプリケート元のデータベースに切り替えます。

USE [Test]  
select name, status from sysarticles  

結果には、変更するアーティクルの名前が表示されます。 この例では、名前が DB2TS01 である結果を次の表に示します。

name status
DB2TS01 25

status の値が 1 または 9 である場合、アーティクルは文字列リテラルのフォーマット用に構成されています。

status の値が 17 または 25 である場合、アーティクルはパラメーター化されたフォーマット用に構成されています。

手順 6. パラメーター化されたコマンド用にレプリケーション サブスクリプション アーティクルを構成します。

USE [Test]  
DECLARE @publication AS sysname;  
DECLARE @article AS sysname;  
SET @publication = N'DB2TS_PUB01';  
SET @article = N'DB2TS01';  
  
EXEC sp_changearticle @publication, @article, 'status' , 'parameters' , 0 , 0;  
  

詳細については、オンライン ブックの「レプリケーション システム ストアド プロシージャの概念 (https://go.microsoft.com/fwlink/?LinkId=193232)」SQL Server参照してください。

レプリケーションの INSERT 操作がエラー 8152 で失敗します: 文字列またはバイナリ データが切り捨てられます

問題

SQL Server レプリケーションの INSERT 操作がエラー 8152 で失敗する可能性があります (文字列またはバイナリ データが切り捨てられます)。 これは、(1) データ プロバイダーが初期メタデータを使用するように構成されておらず、(2) パラメーター化された INSERT ステートメントを使用するようにレプリケーションが構成されていない場合に発生する可能性があります。

ソリューション

手順 1. Data Provider 接続を再構成して、SQL Server レプリケーション サブスクライバーのデータ ソース定義に "初期メタデータを使用する = true" を指定します。

詳細については、OLE DB Provider for DB2 の「Configure Data Providers for DB2 Data Links (DB2) All Properties 」を参照してください。

手順 2 オプション "24" を含むように SQL Server レプリケーション サブスクリプション アーティクルを再構成します ("INSERT ステートメントに列名を含め、パラメーター化されたステートメントを使用します。")。

詳細については、SQL Serverドキュメントの「SQL Server レプリケーション sp_addarticle (Transact-SQL)」を参照してください。