2016-11-28 60 views
0

人們似乎沒有答案在線連接,以你如何使用.NET Oracle數據提供商(ODP.NET)連接到Oracle在一個非常特殊的情況下(12G及更高版本):如何從ODP.NET到Oracle(12G +)由代理用戶沒有密碼

  • 用戶在外部標識的數據庫
  • 授權用戶訪問到另一個模式(應用程序用戶)通過代理上連接

用戶已被設立這樣的:

CREATE USER user_in_question 
IDENTIFIED EXTERNALLY 
-- etc. 

而且通過代理服務器連接已經建立這樣的:

ALTER USER specified_app_user GRANT CONNECT THROUGH user_in_question 

創建ODP.NET的OracleConnection字符串時,會是這樣的(使用用戶友好OracleConnectionStringBuilder)合理的方法:

var connBuilder = new OracleConnectionStringBuilder 
{ 
    UserID = "/", // External login using the user running the program 
    ProxyUserId = "specified_app_user", 
    DataSource = "database", 
}; 

這是行不通的。也不提供空白的「密碼」或空白的「代理密碼」。也不會刪除UserId。

那麼,你如何連接在這種情況下使用ODP.NET?

回答

1

答案(這是我花一小時搜尋,沒有任何運氣)實際上是非常簡單的,但不是很方便:

var connBuilder = new OracleConnectionStringBuilder 
{ 
    UserID = "[specified_app_user]", 
    DataSource = "database", 
}; 
//connBuilder.ToString() output: 
//"USER ID=[specified_app_user];DATA SOURCE=database" 

這個工作在.NET 4.5+上的Oracle 12G +,但可能還在早期的.NET/Oracle/ODP.NET平臺上。我沒有在ASP.NET中測試它,但它也應該在那裏工作。

通過這種方式,用戶ID實際功能就像ProxyUserId,只是封閉的括號內,就像你使用,比方說,蟾蜍或SQLPLUS正常登錄上的Oracle數據庫。

這或許還可以使用此格式(但在我的情況下,連接字符串必須是與OraOLEDB格式,這樣沒有工作兼容):

//Without the use of the conn string builder class, just for the fun of it... 
var connString = "User Id=specified_app_user;Data Source=database;Proxy User Id=/"; 

EDITED 2017年3月2日:上線在某些情況下似乎不起作用。添加了關於它的評論,在這裏是工作的代碼:

USER ID=[specified_app_user];DATA SOURCE=database 

此信息似乎並不存在任何地方 - 否則我忽略了它,在這種情況下請不要指正。

+0

請注意,當使用代理指定連接字符串時,指定的應用程序用戶沒有方括號用戶ID =/ – StefanDK

+0

這也是一個有效格式:var connBuilder = new OracleConnectionStringBuilder {UserID =「specified_app_user」,DataSource =「database」,ProxyUserId =「/」}然後不需要括號中,因爲代理用戶ID指定爲/(當前用戶) – StefanDK

+0

看來,儘管「用戶ID = specified_app_user;數據源=數據庫;代理用戶ID = /」應該工作,它不總是。正確的工作方式是在目標模式中包含[]: USER ID = [specified_app_user]; DATA SOURCE = database – StefanDK

相關問題