1

システムタイプはあるがデータタイプがない(実際には1つ以上ある)(SQLサーバー)列があります。Microsoft jdbc4 ドライバーを使用し、このテーブルのメタデータを使用してすべての列を一覧表示しようとすると、データ型が欠落しているこの列は表示されません。

ResultSet rs = connection.getMetaData().getColumns(null,"schema","tableName", null);
while (rs.next()) {
    String column = rs.getString("COLUMN_NAME");
    System.out.println("column:" + column); // This will not print the column
}

C# などで odbc ドライバーを使用すると、表示されます (データ型が欠落している列)。この列が制約である場合は、jdbc API を使用してすべての制約を一覧表示すると表示されます。

ResultSet rs = connection.getMetaData().getIndexInfo(null, 
                                                     "schema", 
                                                     "tableName", 
                                                      true/*list unique*/, 
                                                      true);
while(rs.next()){
    String column = rs.getString("COLUMN_NAME");
    System.out.println("column:" + column); // This will print the column, if it is a unique constraint.
}

この動作は、jdbc4 ドライバーまたは jtds ドライバーのどちらを使用しても同じです。

だから私の質問は、これがバグなのか、それとも私が見逃しているものなのかということです. テーブルのすべての列を取得するために、別の方法でメタデータをリストすることは可能ですか?

データ型を表示しないテーブルを作成するには。これは、ユーザー定義のデータ型への読み取りアクセス権を持っていないユーザーを作成することを要求します。これはそれを再現する方法です:

ここでこのコードを見つけました

CREATE TYPE TEST_TYPE2 FROM [int] NOT NULL
GO
CREATE TABLE Customer
(
    CustomerID INT IDENTITY(1,1) NOT NULL,
    LastName    VARCHAR(100) NOT NULL,
    FirstName   VARCHAR(100) NOT NULL,
    ZIP         TEST_TYPE2 NOT NULL
)
GO
-- Create Table without UDDT
CREATE TABLE Customer_Orig
(
    CustomerID INT IDENTITY(1,1) NOT NULL,
    LastName    VARCHAR(100) NOT NULL,
    FirstName   VARCHAR(100) NOT NULL,
    ZIP         INT NOT NULL
)
GO

-- Create User with db_datareader to database
USE [master]
GO
CREATE LOGIN testUser WITH PASSWORD=N'THE_PASSWORD', 
 DEFAULT_DATABASE=[master], 
 CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE TEST_DATABASE
GO
CREATE USER testUser FOR LOGIN testUser 
GO
USE TEST_DATABASE
GO
EXEC sp_addrolemember N'db_datareader', N'THE_PASSWORD'
GO

表示されない理由は理解できますが、odbc ドライバーでは機能しますか?

4

0 に答える 0