SQLServer2005:なんちゃってレプリケーション

2つのDB間の特定のテーブルの内容を同期させるためのストアドプロシジャ。
ID列を使い、ID列の数値が元よりも大きい行を取得してコピー先にInsertする。
コピー元はUpdateやDeleteが行われることは想定していない。
(insertのみ)


コピー先にストアドプロシジャを作成し、バッチを使って定期的にタスクを
走らせて利用することを想定している。

insertするレコードの行数が大きい場合、コピー先のIDの値も比較し、
where句で制限することで一度にinsertする行数を減らせると思われる。

コピー元はSQLサーバ認証により認証。

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


-- =============================================
-- Description:	なんちゃってレプリケーション。
-- IDはID列としてを予め設定.コピー元はinsertのみ。
-- =============================================
ALTER PROCEDURE [dbo].[BogusReplication]
AS
BEGIN
	declare @count bigint
	select @count=max(ID) From コピー先テーブル
	set @count = IsNull(@count,0)     -- 何も入っていないなら0を指定

	SET IDENTITY_INSERT コピー先テーブル ON -- ID列挿入可能に

	-- IDで取得していないものを自サーバのDBにコピー
    -- その際にOpenDataSourceを使い他サーバDBとの接続を行う。
    -- これを行うためには下記を予め実行する必要があるかも知れない。OPENROWSETの場合だけ?
    -- sp_configure 'show advanced options', 1;
    -- RECONFIGURE;
    -- GO
    -- sp_configure 'Ad Hoc Distributed Queries', 1;
    -- RECONFIGURE;
    -- GO
	INSERT INTO コピー先テーブル (ID列を含む列の列挙。ex:ID,a,b,c,d)
	SELECT ID列を含む列の列挙。ex:ID,a,b,c,d
	FROM OPENDATASOURCE('SQLNCLI','Data Source=コピー元サーバ;User ID=ログイン名;Password=パスワード').コピー元テーブル名
	where ID > @count
    -- 他サーバのIDが@count(自サーバの最終ID)以上のもののみが対象

	-- ID列の挿入不可にする
	SET IDENTITY_INSERT コピー先テーブル名 OFF
END