QGISからSQL Serverに接続する

 QGISのブラウザパネルにはMS SQL Serverがある.ODBC接続が可能と公式には記述があるが,実際にやってみると手こずることが多かった.今回はQGISからSQL Serverに接続した際の経緯を記述する.

何故か発生するODBC3エラー

 筆者の環境では再現できなくなってしまったが,QGISからSQL Serverに接続する際,ODBC3エラーに悩まされた.調べていくとQGIS側の原因ではなく,SQL Server側の原因だと見当がついた.接続用のログインユーザーを作成する必要があるようだ.

サーバーのSQL Server認証を有効にする

 SQL Serverの認証モードは「Windows認証モード」がデフォルトであるが,これを「SQL Server 認証モードと Windows 認証モード」に変更する.以前は「混合モード」と呼ばれていたものである.

サーバーのプロパティ

 オブジェクトエクスプローラーのサーバーを右クリックして「プロパティ」を選ぶ.

オブジェクトエクスプローラーでサーバーを右クリックして「プロパティ」を選ぶ
オブジェクトエクスプローラーでサーバーを右クリックして「プロパティ」を選ぶ

セキュリティ

 「ページの選択」で「セキュリティ」をクリックすると,「サーバー認証」はデフォルトで「Windows 認証モード」となっている.ここを「SQL Server 認証モードと Windows 認証モード」にチェックし直す.

「ページの選択」「セキュリティ」で「サーバー認証」を「SQL Server認証モードとWindows認証モード」に変更
「ページの選択」「セキュリティ」で「サーバー認証」を「SQL Server認証モードとWindows認証モード」に変更

 「構成の変更の一部は,SQL Server を再起動するまで有効になりません.」とのメッセージが出る.ここでOKをクリックして端末を再起動する.

「構成の変更の一部は,SQL Server を再起動するまで有効になりません.」
「構成の変更の一部は,SQL Server を再起動するまで有効になりません.」

新しいログインユーザーを作成する

 ここで作成するユーザーはQGISがSQL Serverに接続するためのログイン専用ユーザーとして扱うこととする.

全般

 サーバー直下の「セキュリティ」を開き,「ログイン」を右クリックして「新しいログイン(N)…」を選ぶ.

サーバー直下の「セキュリティ」を開き,「ログイン」を右クリックして「新しいログイン(N)...」を選ぶ.
サーバー直下の「セキュリティ」を開き,「ログイン」を右クリックして「新しいログイン(N)…」を選ぶ.

 「ページの選択」は「全般」が最初に表示される.

  • 「ログイン名」にユーザー名を入力する.
  • WIndows認証(W) にチェックが入っているが,SQL Server認証(S)にチェックし直す.
  • 「パスワード(P)」「パスワードの確認入力(C)」にパスワードを入力する.
「ページの選択」「全般」
「ページの選択」「全般」

サーバーロール

 「ページの選択」で「サーバーロール」をクリックする.

  • 「サーバーロール(S)」にはpublicにチェックが入っているが,さらにsysadminにもチェックを入れる.
「サーバーロール(S)」にはpublicにチェックが入っているが,さらにsysadminにもチェックを入れる.
「サーバーロール(S)」にはpublicにチェックが入っているが,さらにsysadminにもチェックを入れる.

ユーザーマッピング

 「ページの選択」で「ユーザーマッピング」をクリックする.

  • 任意のデータベースにチェックを入れる.
任意のデータベースにチェックを入れる.
任意のデータベースにチェックを入れる.

既定のスキーマの設定

 デフォルトでは既定のスキーマが空欄になっている.ここでは作成中のログインユーザーと紐づけるデータベースを指定する.

 右端の「…」ボタンをクリックすると「スキーマの選択」ダイアログに遷移する.「参照(B)…」ボタンをクリックする.

「スキーマの選択」ダイアログ
「スキーマの選択」ダイアログ

 「オブジェクトの参照」ダイアログに遷移する.ここでは「dbo」にチェックを入れてOKをクリックする.

「オブジェクトの参照」ダイアログ
「オブジェクトの参照」ダイアログ

 「スキーマの選択」ダイアログに戻るのでOKをクリックする.

「スキーマの選択」ダイアログ
「スキーマの選択」ダイアログ

 必要なデータベースに同じ作業を繰り返す.

必要なデータベースに同じ作業を繰り返す.
必要なデータベースに同じ作業を繰り返す.

 「ログイン-新規作成」でOKをクリックしてダイアログを抜ける.

確認

 オブジェクトエクスプローラーで「セキュリティ」「ログイン」をたどると,今作成したQGISUSERというログインユーザーが作成されているのが確認できる.

オブジェクトエクスプローラーで「セキュリティ」「ログイン」
オブジェクトエクスプローラーで「セキュリティ」「ログイン」

 SQL Server Management Studioを再起動して最初の「サーバーへの接続」ダイアログで「SQL Server認証」を選び,ログイン(L)にQGISUSERとタイプし,パスワードを入力する.

「サーバーへの接続」ダイアログで「SQL Server認証」を選ぶと,ログイン(L)にQGISUSERが現れる.
「サーバーへの接続」ダイアログで「SQL Server認証」を選び,ログイン(L)にQGISUSERとタイプする.

 パスワードを入力してログインできる.

パスワードを入力してログイン
パスワードを入力してログイン

QGIS

ブラウザパネルでMS SQL Server新規接続を作成

 QGISのブラウザパネルで「MS SQL Server」を右クリックして「新規接続…」を選ぶ.

QGISのブラウザパネルで「MS SQL Server」を右クリックして「新規接続...」を選ぶ.
QGISのブラウザパネルで「MS SQL Server」を右クリックして「新規接続…」を選ぶ.

接続の詳細

 「新規MSSQL接続を作成」ダイアログが開く.ここで設定するのは左側のペイン「接続の詳細」である.

  • 「接続の名称」には任意の名称を入力する
  • 「プロバイダー/DNS」は空欄のままで良い
  • 「ホスト」にはSQL Serverにおけるサーバー名を入力する
  • 「信頼された接続」のチェックを外す
  • 「ユーザー名」には先刻SQL Serverで作成したログインユーザー名であるQGISUSERと入力する.「保存」をチェックするとユーザー名をQGIS側で保存する
  • 「パスワード」にはQGISUSERのログインパスワードを入力する.「保存」をチェックするとパスワードが平文で保存される(環境によってはチェックしないほうが良い場合もあるだろう)
「新規MSSQL接続を作成」ダイアログ
「新規MSSQL接続を作成」ダイアログ

 不思議なもので,一旦接続が確立されてしまうと,「信頼された接続」のチェックをいれても接続できてしまう.これはおそらくWindows認証モードのことと考えられる.環境によっては最初から「信頼された接続」でユーザー名やパスワードを入力せずとも接続可能な場合がある.

データベースの一覧表示

 「新規MSSQL接続を作成」ダイアログ右側のペイン「データベースの詳細」のうち,右上のボタン「データベースの一覧表示」をクリックすると,使用できるデータベースの一覧が表示される.ここでは前回の記事で復元したAdventureWorks2019を選択している.

「データベースの一覧表示」
「データベースの一覧表示」

「レイヤ」「レイヤを追加」「MSSQL Spatialレイヤを追加」

 「レイヤ」メニューから「レイヤを追加」「MSSQL Spatialレイヤを追加」とたどる.

「レイヤ」「レイヤを追加」「MSSQL Spatialレイヤを追加」
「レイヤ」「レイヤを追加」「MSSQL Spatialレイヤを追加」

データソースマネージャーMS SQL Server

 データソースマネージャーが開く.「接続」をクリックすると,接続とログインが確立されていれば下図のようにテーブルが見えているはずである.「追加」をクリックしてダイアログを抜ける.

「データソースマネージャーMS SQL Server」
「データソースマネージャーMS SQL Server」

「ブラウザ」「XYZ Tiles」「地理院地図」「レイヤをプロジェクトに追加する」

 そのままでは白い背景しか見えないので下地となる地図を追加する.ここでは地理院地図を追加することにする.ブラウザパネルのXYZ TIlesから地理院地図を右クリックし,「レイヤをプロジェクトに追加する」を選ぶ.

「ブラウザ」「XYZ Tiles」「地理院地図」
「ブラウザ」「XYZ Tiles」「地理院地図」「レイヤをプロジェクトに追加する」

 下図のように表示されれば成功である.

AdventureWorksのPerson.Addressテーブルのジオメトリを地理院地図に重ねている
AdventureWorksのPerson.Addressテーブルのジオメトリを地理院地図に重ねている

接続に失敗する場合

 大抵の場合,下図のようなエラーメッセージが出て接続がうまく行かない.この原因は分かっていない.端末リセット,ODBC接続,SQL Serverの修復セットアップ,データベースの互換性の変更などを試みたがやはり上手くいかず,現状では環境によるとしか言えない.

Scan full database? No geometry_columns table found. Would youlike to search full database?
Scan full database? No geometry_columns table found. Would you like to search full database?
[Microsoft][ODBC SQL Server Driver][SQL Server]オブジェクト名'geometry_columns'が無効です.ODBC3:ステートメントを実行できません.
[Microsoft][ODBC SQL Server Driver][SQL Server]オブジェクト名’geometry_columns’が無効です.ODBC3:ステートメントを実行できません.

リモートクライアントからSQL Serverに接続できない場合

 SQL Serverの稼働しているサーバー内からは問題なく接続できるのに,リモートのクライアントからSQL Serverに接続できない場合がある.

SQL Serverのlistenしているプロトコルの確認

 SQL Serverがlisten(待ち受け)していないプロトコルを利用してクライアントが接続を要求しても両者の接続は成功しない.SQL Serverのエディションによってはセットアップ直後のデフォルト設定では外部からの接続が行えない共有メモリプロトコルのみlistenしている場合がある.

SQL Server構成マネージャ

 SQL Server構成マネージャを起動してSQL Serverがlistenしているプロトコルを確認する.必要なプロトコルが無効化されていたら有効化する.

 SQL Server2019の場合,エクスプローラーで下記のファイルを検索するとSQL Server構成マネージャが起動する.

C:\Windows\SysWOW64\SQLServerManager15.msc

 スタートメニューから SQLServerManager15.msc を検索してもよい.

スタートメニューからSQLServerManager15.mscを検索
スタートメニューからSQLServerManager15.mscを検索

 「SQL Server ネットワークの構成」を展開すると右側のペインにプロトコル名として「共有メモリ」「名前付きパイプ」「TCP/IP」が列記されており,状態がそれぞれ「有効」か「無効」と表示されている.

SQL Server構成マネージャの「SQL Serverネットワークの構成」
SQL Server構成マネージャの「SQL Serverネットワークの構成」

 「無効」と表示されているプロトコル名をダブルクリックすると,「有効」が「いいえ」となっているので「はい」に変更する.

名前付きパイプを有効にする
名前付きパイプを有効にする

 「名前付きプロパティ」も「TCP/IP」も同様に変更する.

TCP/IPを有効にする
TCP/IPを有効にする

SQL Serverの再起動

 オブジェクトエクスプローラーでサーバーを右クリックして「再起動」を選ぶとSQL Serverが再起動し,上記の設定変更が反映される.

サーバーを右クリックして「再起動」
サーバーを右クリックして「再起動」

ファイヤーウォールにSQL Serverのポートを通す

 SQL Server構成マネージャーからTCP/IP接続を有効にしたら,今度はSQL Server本体をWindowsファイヤーウォールの例外に登録する必要がある.SQL Serverを他の端末に公開するにはこの2つを同時に行わないといけない.いずれか一方が欠けていても他の端末からSQL Serverに接続することはできない.

 Windowsファイヤーウォールの例外にSQL Serverを登録するには,Windows11の場合「設定」「ネットワークとインターネット」を開く.続いて「ダイヤルアップ」タブを開き,下部にある「関連設定」のうち「Windowsファイヤーウォール」をクリックする.

「設定」「ネットワークとインターネット」「ダイヤルアップ」「Windowsファイヤーウォール」
「設定」「ネットワークとインターネット」「ダイヤルアップ」「Windowsファイヤーウォール」

 「ファイアウォールとネットワークの保護」の設定画面が開く.「ファイヤーウォールによるアプリケーションの許可」をクリックする.

「ファイアウォールとネットワーク保護」で「ファイアウォールによるアプリケーションの許可」
「ファイアウォールとネットワーク保護」で「ファイアウォールによるアプリケーションの許可」

 「許可されたアプリおよび機能」ウィンドウが開く.右上の「設定の変更」をクリックし,右下の「別のアプリの許可」ボタンをクリックする.

許可されたアプリおよび機能
許可されたアプリおよび機能

 「アプリの追加」ウィンドウが開く.「参照」ボタンをクリックする.

「アプリの追加」ウィンドウで「参照」をクリック
「アプリの追加」ウィンドウで「参照」をクリック

 SQL Serverの実行本体である「sqlservr.exe」をSQL ServerのインストールパスのBinnフォルダから選択する.

sqlservr.exeをインストールパスを通して指定
sqlservr.exeをインストールパスを通して指定

 「アプリの追加」ウィンドウにSQL Servreが追加されたので「追加」ボタンをクリックする.

「アプリの追加」にSQL Serverが追加され「追加」ボタンをクリック
「アプリの追加」にSQL Serverが追加され「追加」ボタンをクリック

 「許可されたアプリおよび機能」にSQL Serverが追加されている.

「許可されたアプリおよび機能」にSQL Serverが追加されている
「許可されたアプリおよび機能」にSQL Serverが追加されている

まとめ

 QGISからSQL Serverに接続する手順を記載した.SQL Server側でQGISがログインするためのユーザーを作成する必要があった.

 QGISの「レイヤを追加」「MSSQL Spatialレイヤを追加」での処理がどの環境でも成功するには至っておらず,今後の課題である.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください