astahでMS SQL Serverからテーブル情報を読み込みER図を作るのにハマった話

開発資料の全くないプロジェクトを引き継いで、ER図すらなかったので作ろうと、久々にastahでSQL Serverに接続してテーブル情報を読み込もうとしたらハマりました。

ちなみに、SQL Server Management Studioでいいじゃんって思うじゃないですか。MySQLでもあるまいに外部キー使ってなくて、なおかつ何の資料もなければカラム名が関連テーブル間で対応してなくカーディナリティどころかカラムの意味すら不明だから、しょうがないから整理用にまずはコードをにらめっこしながらER図を作ろうとした次第です。

いくつかはまるところがあるので、同じ目に合わないように皆さんにハマりポイントをお知らせします。

#まずはインストール
必要なものは、astah用プラグインのDBリバースプラグイン。
https://astah.change-vision.com/ja/feature/db-reverse-plugin.html
これは解凍したら.jarファイルをastahにドラッグ＆ドロップするだけというおおざっぱさ。

そしてSQL Serverに接続するために必要なJDBCドライバー
https://docs.microsoft.com/ja-jp/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15
こちらは解凍しておき、それらしいところに置きます。```C:\program files\```直下ぐらいに置くのがおすすめです。

Java Runtime Environment(JRE)やSDKのインストールが必要と思いましたが、後述のエラーから、どうもいらないかもしれない。

#astahからプラグイン起動
[ツール]配下に追加された[DBリバース]メニューを選択するとダイアログが出ます。

ダイアログに入力するのは次の通り。

|入力項目|値|
|:---|:---|
|URL|jdbc:sqlserver://localhost:1433/データベース名|
|ユーザー名|xxxxxx|
|パスワード|xxxxxx|
|JDBCドライバー(ドライバーのクラス名)|com.microsoft.sqlserver.jdbc.SQLServerDriver|
|ドライバーのパス(ドライバーのjarファイルへのパス)|C:\xxx\sqljdbc_8.4\jpn\mssql-jdbc-8.4.1.jre8.jar|

+ URLはハマりポイントの一つです。ポートが違っていたりすると接続できません。データベース名は分かると思います。
+ ユーザー名とパスワードは分かると思います。が、合っていても接続できないことが！ここハマりポイントです。
+ ドライバークラスはいじる必要ありません。
+ ドライバーへのパスは先のJDBCドライバーを置いたところを指定してください……と言いたいところですが、.jarが3つありますので、どれかを選ぶことになります。ここハマったので後で解説します。

#ハマりポイントの解説
##1．ポート番号
SQL Serverのポート番号が分っていないと接続できません。こんなエラーが出ます。

>
com.microsoft.sqlserver.jdbc.SQLServerException: ホスト localhost、ポート 4917 への TCP/IP 接続が失敗しました。エラー: "接続のタイムアウト: 詳細情報はありません。。接続プロパティを調べて、SQL Server のインスタンスがホスト上で実行されていて、ポートへの TCP/IP 接続が許可されており、そのポートへの TCP 接続がファイアウォールにブロックされていないことを確認してください。

どのポートを開けているかは、こちらを参考に調べてください。
https://sql55.com/column/how-to-find-port-used-by-sql-server.php

##2.ドライバーのパス
JDBCドライバーを解凍すると.jarが3つあると思います。不適切なものを選ぶと次のようなエラーが出ます。

>指定されたドライバーが見つかりませんでした。設定を見なおしてください。com/microsoft/sqlserver/jdbc/SQLServerDriver has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

英語の部分を見ると、JDBCドライバーをコンパイルしたJava Runtimeといま起動させようとしているRuntimeのバージョンがあっていないとのこと。これは3つあるうちのxxxxxxx.jre8.jarを選びましょう。どうもastahは別途自分がインストールしていたものとは違うRuntimeで動いてるみたい。最新のJDKをインストールしても動きませんでした。

##3.ユーザー名とパスワードがあっているのに接続できない。
せっかくDBに接続できても、「パスワードを変更する必要があります」とかでて接続できないことがあります。その時は、SQL Serverのユーザープロパティから「パスワードの期限を適用する」のチェックを外してください。SQL Server Management Studioだと、データーベース＞セキュリティ＞ユーザーで右クリックしたプロパティから設定できます。接続しようとしているデータベース直下のセキュリティ＞ユーザーのプロパティではないので注意。

ところが、次のようなエラーが出ることがあります。
>MUST_CHANGE が ON のときは、CHECK_POLICY オプションと CHECK_EXPIRATION オプションは OFF にできません。

その時はSQL Server Management Studioにて次のSQL文を実行してください（UserNameとpasswordは自分のものに変えてください）。これでチェックが外れます。

```SQL
USE Master
GO
ALTER LOGIN UserName WITH PASSWORD = 'password'
GO
ALTER LOGIN UserName WITH
      CHECK_POLICY = OFF,
      CHECK_EXPIRATION = OFF;
```

これでも接続できない？ユーザーがそのDBへの権限がないことになっているかもしれません。同じくユーザーのプロパティからユーザマッピングを開き、アクセスしたいDB名にチェックを入れます。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224010/3984488c-1a31-d75d-6aee-9c57a07d18cc.png)


これでできるはず！

まぁでもよっぽどでなければ、あまり使わないですよね、この機能。。。破綻しきったDBをAlter必至でプログラムごと改修しなければいけない時点で敗戦処理投手の気分ですよ。いやーWebプログラマーがWin系のWeb屋はやばいのが多いって言ってたのを思い出します。これでもまだスタート地点ですよ。それでは。