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