Managed Instance (マネージドインスタンス) では、SQL Server に対してリンクサーバーを設定することができるようになっています。
これについては、Lesson Learned #63: It is possible to create Linked Server in Azure SQL Managed Instance? で解説がされていますが、どうやって設定するのかすっかり忘れていたのでメモとして残しておこうと思います。
Contents
NSG の設定
冒頭で紹介した「Lesson Learned #63」に記載されている内容となりますが、最初に、Managed Instance を配置している NSG (Network Security Group : ネットワークセキュリティグループ) の送信 / 受信の規則に次のような設定の追加を検討する必要があります。
送信セキュリティとしては、
- ソース : SQL Database (今回は Japan East の SQL のサービスタグを使用)
- ターゲット : Managed Instance を配置している VNET の IP アドレス範囲
受信セキュリティとしては、
- ソース : Managed Instance を配置している VNET の IP アドレス範囲
(画像は VNET にしてしまっていますが、Managed Instance のネットワークに閉じて問題ありません) - ターゲット : SQL Database (今回は Japan East の SQL のサービスタグを使用)
- ポートに関しては、DAC を使用しないのであれば、1433 (プロキシ接続) / 11000 ? 11999 (リダイレクト接続) を指定します
の設定を行います。
これで、Managed Instance から SQL Database への通信が許可されました。
リンクサーバーの作成
それでは実際にリンクサーバーを作成してみます。
リンクサーバーを作成する際には、次のような設定画面で操作することができます。
Managed Instance から、SQL Database にリンクサーバーを設定する際に、サーバーの種類として「SQL Server」を選択した場合、設定を行うことはできるのですが、データベースにアクセスをしようとすると次のようなエラーが発生する可能性があります。
(SQL Database ではなく、他の Managed Instance や、SQL Server に接続した場合は発生しないかと)
Reference to database and/or server name in ‘DB1.sys.sp_tables_rowset2’ is not supported in this version of SQL Server. (Microsoft SQL Server、エラー: 40515)
SQL Database に接続をする場合、プロバイダーとしては SQLOLEDB 等を使用して、DB 指定で接続するとよいかと思います。
「MI-LINKED-SERVER.DATABASE.WINDOWS.NET」という SQL Database の「DB1」に接続したいのであれば次のようなクエリで作成したリンクサーバーであればリモートにクエリを実行する環境を整えることができるかと。
USE [master] GO EXEC master.dbo.sp_addlinkedserver @server = N'MI-LINKED-SERVER.DATABASE.WINDOWS.NET', @srvproduct=N'', @provider=N'SQLOLEDB', @provstr=N'SERVER=MI-LINKED-SERVER.DATABASE.WINDOWS.NET', @catalog=N'DB1' GO EXEC master.dbo.sp_serveroption @server=N'MI-LINKED-SERVER.DATABASE.WINDOWS.NET', @optname=N'connect timeout', @optvalue=N'15' GO EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'MI-LINKED-SERVER.DATABASE.WINDOWS.NET', @locallogin = NULL , @useself = N'False', @rmtuser = N'ログイン', @rmtpassword = N'パスワード' GO