2015年2月1日日曜日

Windows10 Technical Preview上のSQL-Server2014 Expressで、サーバーまたがりのクエリーとトランザクション処理やってみました

今回の記事では、Windows10 Technical Preview上のSQL-Server2014 Expressでもって、サーバーまたがりのクエリーが動くかどうかやってみました。

サーバーまたがりと言うのは、自分のサーバーから相手のサーバーのデータをネットワーク越しに操作(選択・更新など)することを言っています。

環境は以下の通りです。


◎自分サーバー側(Windows10 T.P)の環境
・仮想OS環境(ゲストOS)
・サーバー名(ASPIRE5750G2\SVR1)
◎相手サーバー側(Windows7)の環境
・実OS環境(ホストOS)
 ・サーバー名(ASPIRE5750G\SVR1)

まずは、自サーバー(Windows10側)から、OPENROWSET関数を使って、相手サーバー(Windows7側)のテーブルが読み取る事が出来るかどうかやってみました。

接続はWindows認証で、あらかじめ信頼関係接続で行けるように設定済みです。

SELECT 'Windows10(自サーバー)' AS [TITLE],T.*
FROM MAINDB.dbo.T001 AS T
ORDER BY ITEM_CD,R_ITEM_CD;

SELECT 'Windows7(相手サーバー)' AS [TITLE],T.*
FROM OPENROWSET('SQLOLEDB','Server=ASPIRE5750G\SVR1;Trusted_Connection=yes;',
'SELECT * FROM MAINDB.dbo.T001') AS T;

SELECT 'Windows10にだけ存在し、Windows7に存在していないデータ' AS [TITLE],T.*
FROM MAINDB.dbo.T001 AS T
LEFT JOIN OPENROWSET('SQLOLEDB','Server=ASPIRE5750G\SVR1;Trusted_Connection=yes;',
'SELECT * FROM MAINDB.dbo.T001') AS W
ON(T.ITEM_CD = W.R_ITEM_CD)
WHERE W.R_ITEM_CD IS NULL;
特に問題なく、ホストOS側(Windows7)に立てた、SQL-Server2014 Expressのテーブルにアクセスし、内容を読み取る事が出来ました。


立場を逆転させて、逆方向が行くかどうかもやってみました。

SELECT 'Windows7(自サーバー)' AS [TITLE],T.*
FROM MAINDB.dbo.T001 AS T
ORDER BY ITEM_CD,R_ITEM_CD;

SELECT 'Windows10(相手サーバー)' AS [TITLE],T.*
FROM OPENROWSET('SQLOLEDB','Server=ASPIRE5750G2\SVR1;Trusted_Connection=yes;',
'SELECT * FROM MAINDB.dbo.T001') AS T;

SELECT 'Windows10にだけ存在し、Windows7に存在していないデータ' AS [TITLE],T.*
FROM OPENROWSET('SQLOLEDB','Server=ASPIRE5750G2\SVR1;Trusted_Connection=yes;',
                'SELECT * FROM MAINDB.dbo.T001') AS T
LEFT JOIN MAINDB.dbo.T001 AS W
ON(T.R_ITEM_CD = W.ITEM_CD)
WHERE W.R_ITEM_CD IS NULL;
逆方向の立場でも特に問題なく読み取る事が出来ました。

サーバーまたがりのクエリーなんか、個人では特に書く機会は無いと思いますが、Windowsが本格的にモバイルに殴り込みをかけたため、これからは、マザーシップPC上のSQL-Serverと、外に持ち出す8インチWindowsタブレットに立てたSQL-Serverとの間で、データベースの連携をとりたい・・・そんなシーンが増えてくるのかなぁと。

手のひらモバイルに、SQL-Serverを搭載して持ち歩くという、画期的な時代がもうとっくにスタートしてしまっているので・・・。


ちなみに、OPENROWSET関数ではなく、リンクサーバーでもやってみました。

SELECT 'Windows10(自サーバー)' AS [TITLE],T.*
FROM MAINDB.dbo.T001 AS T
ORDER BY ITEM_CD,R_ITEM_CD;

SELECT 'Windows7(相手サーバー)' AS [TITLE],T.*
FROM [ASPIRE5750G\SVR1].MAINDB.dbo.T001 AS T;

SELECT 'Windows10にだけ存在し、Windows7に存在していないデータ' AS [TITLE],T.*
FROM MAINDB.dbo.T001 AS T
LEFT JOIN [ASPIRE5750G\SVR1].MAINDB.dbo.T001 AS W
ON(T.ITEM_CD = W.R_ITEM_CD)
WHERE W.R_ITEM_CD IS NULL;
リンクサーバーでも特に問題ない感じですね。



■サーバーまたがりの更新が出来るかどうか?
■トランザクション処理がかかるかどうか?
次は、単なる参照ではなくて、サーバーまたがりの更新が出来るかどうかやってみました。

Windows10側のテーブルにしか無いデータを抽出して、Windows7側に挿入してあげる、という処理です。

更新と言えば、トランザクション処理も試してみました。

トランザクション処理というのは、平たく言うと、更新中に何かが起きて失敗したら、全てをチャラにして、更新前の元の状態に戻す事です。

テーブル一つだけならともかく、10個とかある場合、8個まで更新したところでネットワーク障害が発生しました!!となった時、途中でやめられたら、リカバリーするのにとんでもない手間がかかってしまいます。

元に戻すか、全部やりきるか、これを保障する処理でとても重要です。

個人レベルでは問題にもならないですが、企業では、この処理がとにかく肝となって、パフォーマンス・チューニングとかに大変な労力と才能がつぎ込まれてたりします。


SELECT '更新前' AS [TITLE],T.*
FROM [ASPIRE5750G\SVR1].MAINDB.dbo.T001 AS T;

SELECT 'Windows7側に存在しないデータをWindows10側から補完する' AS [TITLE];

SET XACT_ABORT ON;
BEGIN TRAN;

   INSERT INTO [ASPIRE5750G\SVR1].MAINDB.dbo.T001
   SELECT T.R_ITEM_CD AS ITEM_CD,
          T.ITEM_CD   AS R_ITEM_CD,
          REPLACE(T.CONTENTS,'Windows 10','Windows 7') AS CONTENTS,
          5800        AS PRICE
   FROM MAINDB.dbo.T001 AS T 
   LEFT JOIN [ASPIRE5750G\SVR1].MAINDB.dbo.T001 AS W
   ON(T.ITEM_CD = W.R_ITEM_CD)
   WHERE W.R_ITEM_CD IS NULL;

IF @@ERROR = 0 BEGIN COMMIT TRAN; END ELSE BEGIN ROLLBACK TRAN; END;
SELECT '更新後' AS [TITLE],T.*
FROM [ASPIRE5750G\SVR1].MAINDB.dbo.T001 AS T
ORDER BY T.ITEM_CD,T.R_ITEM_CD;
トランザクション処理も、更新も、特にに問題なく行けました!!

Windows10、このまま製品版として使ってもいけるんじゃないかなぁ・・・という勢い。


■トランザクション処理の設定について

ちなみに、SQL-Server 2014 Expressの設定だけやって、他の設定をやってないPCで単純にトランザクション処理をかけてしまうと、おそらく、「リンク サーバー "ASPIRE5750G\SVR1" の OLE DB プロバイダー "SQLNCLI11" で分散トランザクションを開始できなかったので、この操作を実行できませんでした。」というエラーメッセージが出てトランザクション処理が失敗すると思います(サーバー名の所は私の場合です)。

これは、MSDTCというコンポーネントの設定がうまくないからです。

この場合だと、相手側、Windows7側での設定が必要です。

コントロールパネルから「管理ツール」「コンポーネントサービス」と進んでください。

すると、設定画面が開くので、そこの、ツリーを、「ローカルDTC」にたどり着くまで徹底的に降りて行きます。

ローカルDTCの設定はまぁ色々ありますが、個人レベルだと画像のような設定にしておけば良いかなぁと。

OKにすると、MSDTCが再起動して、コンピュータを再起動しなくともそのまま使用可能になります。

これでもまだエラーが消えない時は、Windowsファイアウォールあたりが、必要なポートをブロックしてたりします。

おすすめは出来ませんが、一度、試験的にですよ?全てのポートを開いてみて、うまく行けばそれが原因という事になります。


同設定画面の、Windows10 Technical Preview版は上記のようになります。

Windows10だからって特に変化はなく、画面デザインがWindows10の流儀になっただけという感じですね。

安心しました。
この手の設定画面が変化すると、趣味でやってる時はともかく、システム担当者さんとかは激しくビビるのではないでしょうか(激しくはないか)。


全体的に、Windows10 T.P.って、このまますぐにでも本格投入したい感じですね。

自作PCのOSをこれにして、使用期限ぎりぎりまで使うというのも、結構ありかも????