[DBFLUTENET-15] df-load-dataタスク実行時にSQL ServerのWindows認証用DLL(ntlmauth.dll)が読み込まれない Created: 2009-10-04  Updated: 2009-10-05

Status: Open
Project: DBFlute.NET
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Minor
Reporter: aoki Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Environment:

dbflute.net-0.8.9.4
SQL Server 2008 Developer Edition


Attachments: Text File dbflute.log     Text File dbflute.log    

 Description   

SQL ServerにWindows認証でJDBC接続する時は、ntlmauth.dll(jTDSの場合)にパスが通った場所においておく必要があります。
そのため、DBFluteクライアント直下(replace-schema.batと同じ場所)にntlmauth.dllを配置しています。jdbc.batは問題なくログインできます。しかし、replace-schema.batを動かすと、前半のdf-create-schemaはログインできますが、後半のdf-load-dataはログインできずエラーとなってしまいます。

↓スタックトレース:
Caused by: java.sql.SQLException: I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.
at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:615)

何かライブラリパスが違うのかなと思って調べたのですが、Java&Antなので途中で挫折しました。

JDBC.batは問題なく動いています。SQL Server認証に変えてUSER IDとパスワードを指定しても問題なく動いています。ちなみにMicrosoft純正のJDBC DLL(sqljdbc_auth.dll)を使っていた時も同じ問題が起きていました。

.NETでは、SQL ServerにアクセスするときにWindows認証を使うことが多いです(特に開発の時)。原因がわかるようでしたら対応して頂けると嬉しいです。

(参考)設定内容
http://d.hatena.ne.jp/aoki1210/20090929



 Comments   
Comment by jflute [ 2009-10-05 ]

おっと、すれ違いしました。
ANTの実行を3回に分ければなんとか回避ってところですね。
とりあえずはバッドノウハウとして、ドキュメントにまとめたいと思います。
ありがとうございます。
(根本の解決にはちょっと時間が掛かりそうですね)

Comment by jflute [ 2009-10-05 ]

ありがとうございます。
一回目の実行で取得した接続を何かしら掴んだ状態のままで(VMが同じなので)、
二回目の実行でそれが取得できないのかもしれませんね。
ANTのClassLoaderの仕組みとWindows認証の仕組みを同時に学ばないと
なんとも理解出来なさそうですが。

Comment by aoki [ 2009-10-05 ]

とりあえず、以下のような感じなら動きます。
一回ごとにコネクションを分断すれば、うまく接続を再作成できるようです。
当分はSQL Server接続でやる感じにします。

▼_df-replace-schema.cmd

call %DBFLUTE_HOME%\ant\bin\ant -Ddfenv=%DBFLUTE_ENVIRONMENT_TYPE% -f %DBFLUTE_HOME%\build-torque.xml replace-schema
call %DBFLUTE_HOME%\ant\bin\ant -Ddfenv=%DBFLUTE_ENVIRONMENT_TYPE% -f %DBFLUTE_HOME%\build-torque.xml replace-schema2
call %DBFLUTE_HOME%\ant\bin\ant -Ddfenv=%DBFLUTE_ENVIRONMENT_TYPE% -f %DBFLUTE_HOME%\build-torque.xml replace-schema3

▼build-torque.xml

<target name="replace-schema" >

<df-create-schema
contextProperties="${torque.contextProperties}"
validTaskEndInformation="false"
environmentType="${dfenv}">
</df-create-schema>
</target>

<target name="replace-schema2" >
<df-load-data
contextProperties="${torque.contextProperties}"
validTaskEndInformation="false"
environmentType="${dfenv}">
</df-load-data>
</target>

<target name="replace-schema3">
<df-take-finally
contextProperties="${torque.contextProperties}"
beforeTimestamp="${now.date}"
environmentType="${dfenv}">
</df-take-finally>
</target>

Comment by aoki [ 2009-10-05 ]

一応MS純正のJDBCドライバ(sqljdbc4.jar+sqljdbc_auth.dll)でも試してみました。

▼ReplaceSchemaの場合

— Nested Exception —
com.microsoft.sqlserver.jdbc.SQLServerException: このドライバは、統合認証を行えるようには構成されていません。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)

▼JDBC2回の場合

[df-jdbc] java.lang.RuntimeException: com.microsoft.sqlserver.jdbc.SQLServerException: 接続は閉じられています。
[df-jdbc] at org.apache.torque.task.TorqueJDBCTransformTask.doExecute(TorqueJDBCTransformTask.java:211)

という感じ駄目でした。
Windows認証は他とは少し違うのかも知れないですね。

Comment by jflute [ 2009-10-04 ]

ありがとうございます。なるほど、うーむーですねぇ。。。
「一つのANT実行で二回のWindows認証の接続」

Comment by aoki [ 2009-10-04 ]

JDBCタスクを2回にした時の失敗ログです。

Comment by aoki [ 2009-10-04 ]

>なので気になるところですが、Sql2EntityやOutsideSqlTestは正常に
>動作しますでしょうか?(SQLファイル一個でもいいので)

正常に動作しました。

>mydbflute/dbflute-0.8.9.x/build-torque.xmlの137行目「df-jdbc」タグを
>もう一つまるまるコピーして増やして実行して頂けます?
>要は、JDBCタスクが一回の実行で二回実行されるようになります。

変えて実行したところ失敗しちゃいました。(LOGもあげます)

「丁度その二個目の実行となります。」という2回目の仮説がマッチしそうです。Antの仕様なんでしょうかねぇ。

Comment by jflute [ 2009-10-04 ]

もう一つお願いです。

mydbflute/dbflute-0.8.9.x/build-torque.xmlの137行目「df-jdbc」タグを
もう一つまるまるコピーして増やして実行して頂けます?
要は、JDBCタスクが一回の実行で二回実行されるようになります。

    <df-jdbc
      contextProperties="${torque.contextProperties}"
      outputFile="${torque.schema.dir}/project-schema-${torque.project}.xml"
      environmentType="${dfenv}"
    >
    </df-jdbc>

 ↓↓↓

    <df-jdbc
      contextProperties="${torque.contextProperties}"
      outputFile="${torque.schema.dir}/project-schema-${torque.project}.xml"
      environmentType="${dfenv}"
    >
    </df-jdbc>
    <df-jdbc
      contextProperties="${torque.contextProperties}"
      outputFile="${torque.schema.dir}/project-schema-${torque.project}.xml"
      environmentType="${dfenv}"
    >
    </df-jdbc>
Comment by jflute [ 2009-10-04 ]

おおお、素敵なフィードバックありがとうございます。
まず初見ですが、正直原因は全く想像も付きません。

現象をおさらいすると:

SQLServerでWindows認証でJDBC接続において

 o JDBCタスクはOK
 o ReplaceSchemaのdf-create-schemaはOK
 o ReplaceSchemaのdf-load-dataはNG

という感じですね。
全部NGならまだしも一個だけNGってのはへんてこりんですね。
DB接続周りで、df-create-schemaとdf-load-dataとの違いを探ってみます。
(違うところはほとんど無いようにも思えるのですが...)

一つだけ明確に言える違いは、一つのAntタスク呼び出しで
複数のタスクを実行している点です。NGになったdf-load-dataは
丁度その二個目の実行となります。

なので気になるところですが、Sql2EntityやOutsideSqlTestは正常に
動作しますでしょうか?(SQLファイル一個でもいいので)

Generated at Wed Apr 09 17:51:44 JST 2025 using Jira 10.5.0#10050000-sha1:9d9d098bb7b67e8dba8da380ba9c3900d82ac3cf.