我有一个(sql server)列,它有一个系统类型但没有数据类型(实际上不止一个)。使用 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
}
如果您使用 odbc 驱动程序,例如 C#,它会显示(缺少数据类型的列)。如果此列是一个约束,它将在使用 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 驱动程序吗?