ハイブリッドクラウドは、クラウドコンピューティングをエンタープライズ情報システムに導入するためのかなり魅力的なモデルです。このアプローチは、パブリッククラウドとプライベートクラウドの利点を組み合わせているためです。 一方では、必要に応じて外部リソースを柔軟に引き付け、インフラストラクチャコストを削減できます。他方では、企業が提供したくないデータやアプリケーションを完全に制御できます。 ただし、このようなシナリオでは、さまざまなソースからのデータを統合するタスクに必ず直面します。 垂直に2つの部分に分割された顧客テーブルがあるとします。 非パーソナライズされた部分はパブリッククラウドに配置され、顧客を擬人化した情報はローカルデータベースに残りました。 アプリケーション内で全体的な処理を行うには、CustomerIDで両方の部分を再接続する必要があります。 これを行うにはさまざまな方法があります。 従来は、2つの大まかなカテゴリに分けることができます。データベースサーバーのオンプレミスレベルでデータを結合します。この場合、ローカルおよびリモートデータにアクセスするための単一のエントリポイントとして機能します。 この記事では、最初のアプローチについて説明します。
SQL Serverの場合、リンクサーバーのメカニズムは、バージョン7.0以降の異種データソースへのアクセスに従来から使用されています。 このメカニズムを使用して、クラウドベースからデータを取得する必要があります。 ご存じのとおり、Windows Azureクラウドでは、SQL Serverデータベースは2つの方法で表すことができます。WindowsAzure SQLデータベース(SQL Azure)はPaaSソリューションであり、Azureにある仮想マシンにインストールされた通常のSQL Server上の通常のデータベースのように- IaaS。 後者の場合は、イデオロギー的にSQL Serverの別のインスタンスに接続する場合と変わりません。 リンクサーバーを作成することは難しくなく
、ドキュメントで長い間
説明されています 。 SQL Azureでリンクサーバーを作成する場合を考えます。 実際、クラウドベースへの接続は、通常のSQL Serverに参加するよりも複雑ではありません。 SQL Azureの仕様に注意する必要があります。
-厳密にTCP / IPネットワークライブラリが使用されます。ポートは動的に割り当てられず、常に1433です。
-SQL Azureでは、標準認証モデルのみが有効です。
-SQL Azureへのすべての接続は、TLS(SSL)に基づいて暗号化される必要があります。これは、接続文字列へのEncrypt = True; TrustServerCertificate = trueの追加に対応します。 これらは明示的に省略することができ、自動的に追加されます。
-サーバー名= <Azure SQL Server名> .database.windows.net。
-SQL AzureにはUSEコマンドはありません。 厳密に言えば存在しますが、純粋にシャーディングの場合に使用されます。つまり、目的のベースにすぐに接続する必要があります。
-SQL Azureサーバーの構成では、接続を確立できるアドレス範囲のホワイトリストを規定するファイアウォールルールを考慮する必要もあります。
これを考慮すると、SQL Server Native ClientまたはODBCとして使用できるアプリケーションアクセスインターフェイスを選択する必要があります。
デモを実行するには、クラウドバージョンのAdventureWorks2012モデルデータベースを使用し
ます 。
SQL Server Management Studioを開き、ローカルSQL Serverに接続し、ネイティブクライアントを使用してSQL Azure上にリンクサーバーを作成します。
if exists (select 1 from sys.servers where name = 'SQLAzure_NCli') exec sp_dropserver @server = 'SQLAzure_NCli', @droplogins = 'droplogins' go exec sp_addlinkedserver @server='SQLAzure_NCli', @srvproduct='', @provider='sqlncli', @datasrc='u1qgtaf85k.database.windows.net', @location='', @provstr='', @catalog='AdventureWorks2012' go exec sp_addlinkedsrvlogin @rmtsrvname = 'SQLAzure_NCli', @useself = 'false', @rmtuser = 'alexejs', @rmtpassword = 'Password' go
スクリプト1
ここで、u1qgtaf85kは、作成時に自動的に生成されたAzure SQL Serverの名前です。 ローカルサーバーから実際に接続し、そこからデータを取得できることをテストします。
select CustomerID, AccountNumber from SQLAzure_NCli.AdventureWorks2012.Sales.Customer where CustomerID between 1 and 100
スクリプト2
結果を図1に示します

図1
適切な権限を所有している場合、ローカルサーバーからAzure SQLデータの読み取りだけでなく、データ変更のリクエストやDDLクエリも実行できます。 たとえば、SQL Azureデータベースにテーブルを作成し、そこにデータを貼り付けます。
exec sp_serveroption 'SQLAzure_NCli', 'rpc out', true exec ('CREATE TABLE TestTbl(fld1 int not null CONSTRAINT PK_fld1 PRIMARY KEY CLUSTERED (fld1) )') at SQLAzure_Ncli exec ('INSERT INTO TestTbl VALUES (1), (2), (3)') at SQLAzure_NCli
スクリプト3

図2
Azure管理ポータルを使用して、テーブルが実際に作成され、エントリが追加されたことを確認できます。

図3
ODBCを介してリンクサーバーを作成するには、最初にDSNを作成する必要があります。 図4-9に示すように、コントロールパネル\システムとセキュリティ\管理ツール->データソース(ODBC)に移動するか、odbcad32.exeを実行してSQL Azureにデータソースを作成します。

図4

図5

図6

図7

図8

図9
この.REGファイルのようなものをレジストリ(regedit.exe)にインポートすることにより、プロセスを自動化できます。
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI]
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\SQLAzure]
"Driver"="C:\\Windows\\system32\\sqlncli10.dll"
"Server"="u1qgtaf85k.database.windows.net"
"LastUser"=“alexejs"
"Database"=“AdventureWorks2012"
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources]
“SQLAzure"="SQL Server Native Client 10.0“
スクリプト4
この場合、ODBCソースでリンクサーバーを作成すると、次のようになります。
if exists (select 1 from sys.servers where name = 'SQLAzure_ODBC') exec sp_dropserver @server = 'SQLAzure_ODBC', @droplogins = 'droplogins' go exec sp_addlinkedserver @server = 'SQLAzure_ODBC', @srvproduct = 'Any', @provider = 'MSDASQL', @datasrc = 'SQLAzure', @catalog='AdventureWorks2012' go exec sp_addlinkedsrvlogin @rmtsrvname = 'SQLAzure_ODBC', @useself = 'false', @rmtuser = 'alexejs', @rmtpassword = 'Password'
スクリプト5
すべてが機能することを確認します。
select * from openquery(SQLAzure_ODBC, 'select * from sys.tables')
スクリプト6

図10
リンクサーバーの作成方法に関係なく、それ以上は明らかです。 ローカルサーバー上のデータベースのクライアントテーブルを、Azure SQLデータベースのクライアントテーブルに接続します。
select c.CustomerID, c.AccountNumber, p.FirstName, p.LastName from openquery(SQLAzure_NCli, 'select CustomerID, AccountNumber from Sales.Customer where CustomerID between 1 and 100') c join Person.Person p on c.CustomerID = p.BusinessEntityID order by c.CustomerID
スクリプト7

図11
リンクサーバーの場合と同様に、最大レコードをローカルサーバーにドラッグしないように4部表記で名前でアクセスするよりも、可能であればOpenQuery()関数を使用することをお勧めします。 、グループ化など、反対側にある場合)リモートリソースを使用して。