6

ユーザー名「sa」を使用して Weblogic で作成された SQLServer のデータ ソースがあります。

コードでは、次を使用してユーザー名を取得しています。

Context ctx = new InitialContext(prop);
Object obj = ctx.lookup("sqlserver1");
System.out.println("Data Source Found….");
DataSource ds = (DataSource) obj;
Connection conn = ds.getConnection();
DatabaseMetaData mtdt = conn.getMetaData();
// Get UserName
System.out.println("User name: " + mtdt.getUserName());

ただし、上記のコードは常にユーザー名として「dbo」を返します。ユーザー名は「sa」だと思っていました。DB が Oracle の場合、正常に動作します。すべての異なる種類のデータベースのユーザー名を取得する一般的な方法はありますか?

4

2 に答える 2

4

正しい方法は である必要がありますがDatabaseMetaData.getUserName()、すべてのデータベースがそれを正しく実装しているわけではないことを示しています。もう 1 つの方法は、JDBC 関数エスケープUSER()eg (eg SELECT {fn USER()} FROM DUAL) を使用することですが、すべてのドライバーがすべての JDBC エスケープを実装しているわけではありませんDatabaseMetaData。クエリで定義された SQL 標準CURRENT_USER(またはUSER) を試すこともできますが、2 つの問題がありますDUAL。 SQL 標準のすべての部分であるため、CURRENT_USERorUSERコンテキスト変数が存在しない可能性があります。

ただし、DataSource オブジェクトがあるのでuser、データソースからプロパティを取得することを試みることができます (JDBC 4.1 仕様の表 9.1 で定義されていますが、そこに記載されているプロパティ名はすべて必須というわけではありません)。

たとえば、次のようになります。

Method getter = new PropertyDescriptor("user", ds.getClass()).getReadMethod();
String value = (String) getter.invoke(ds);

DataSource dsこれは、1) にがあり、2) 実際に設定されていることを前提としてgetUser()います (たとえば、SQL Server 統合セキュリティでは、データソースはユーザーについて知る必要はありません)。

于 2013-02-04T19:25:19.163 に答える
1

FWIW、Java 1.7 はConnection.getSchema()メソッドを提供します。ただし、現時点で 1.7 がどの程度広く採用されているかはわかりません。今後の参考のために覚えておくとよいかもしれません。

于 2014-03-27T13:31:41.400 に答える