2013-02-04 42 views
5

मेरे पास उपयोगकर्ता नाम 'sa' के साथ वेबलॉगिक में बनाए गए SQLServer के लिए डेटा स्रोत है।java.sql.Connection से UserName कैसे प्राप्त करें?

कोड में मैं उपयोगकर्ता नाम प्राप्त करने के लिए निम्नलिखित का उपयोग कर रहा हूँ।

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' होना चाहिए। यदि डीबी ओरेकल है तो यह ठीक काम करता है। क्या मेरे पास सभी प्रकार के डेटाबेस के लिए उपयोगकर्ता नाम प्राप्त करने का एक सामान्य तरीका है।

उत्तर

4

सही विधि DatabaseMetaData.getUserName() होना चाहिए, लेकिन जैसा कि आप नहीं प्रदर्शित सभी डेटाबेस है कि सही ढंग से लागू करते हैं। एक और तरीका है JDBC समारोह बचने USER() जैसे (जैसे SELECT {fn USER()} FROM DUAL), लेकिन सभी ड्राइवरों सभी JDBC निकल जाता है को लागू उपयोग करने के लिए हो सकता है, और यह सिर्फ हो सकता है कि इस DatabaseMetaData के रूप में ही देता है। तुम भी SQL मानक एक प्रश्न में CURRENT_USER (या USER) परिभाषित की कोशिश कर सकते हैं, लेकिन आप दो समस्याएं हैं: 1) कुछ डेटाबेसों एक मेज से चयन करने के लिए आप की आवश्यकता होती है (उदाहरण के लिए Oracle में DUAL, कुछ नहीं) और 2) नहीं सभी डेटाबेस SQL ​​मानकों के सभी भागों को लागू है, तो CURRENT_USER या USER संदर्भ चर अनुपस्थित हो सकता है।

लेकिन जैसा कि आप डेटा स्रोत वस्तु है, तो आप डेटा स्रोत से user संपत्ति प्राप्त करने के लिए (यह तालिका JDBC 4.1 विनिर्देश के 9.1 में परिभाषित किया गया है, हालांकि संपत्ति के नाम वर्णित वहाँ सभी आवश्यक नहीं हैं) की कोशिश कर सकते।

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

यह मान लेते हैं कि 1) DataSource ds एक getUser() है और 2) है कि यह वास्तव सेट किया गया है (SQL सर्वर एकीकृत सुरक्षा के साथ उदाहरण के लिए डेटा स्रोत के बारे में पता करने की जरूरत नहीं है:

उदाहरण के लिए

तो एक उपयोगकर्ता)।

0

Fwiw, जावा 1.7 Connection.getSchema() तरीका प्रदान करता है। मुझे नहीं पता कि इस बिंदु पर 1.7 कितनी व्यापक रूप से अपनाया गया है, इसलिए भविष्य में संदर्भ के लिए यह ध्यान में रखना कुछ हो सकता है।