使用Oracle.ManagedDataAccess.Client代理用户登录报ORA-01017如何解决
问题原因
Oracle.ManagedDataAccess.Client(托管ODP.NET)的代理用户连接语法与旧版非托管Oracle.DataAccess.Client不兼容,你当前使用的用户名[目标代理用户]方括号语法是非托管驱动的专属规则,托管驱动无法识别该格式,会将整段developer2[reportbot]作为登录用户名提交校验,因此触发ORA-01017错误。
解决方案
使用托管ODP.NET支持的代理用户专用连接参数修改连接字符串即可,无需修改其他业务逻辑:
正确连接字符串格式
// 核心参数说明:User Id填需要模拟的目标账号,Proxy User Id/Proxy Password填你自己的开发账号密码 string constr = "Data Source=ProdJobDb;User Id=reportbot;Proxy User Id=developer2;Proxy Password=Wysiwyg.12345;";
修改后的完整测试代码
static void Main(string[] args) { // 模拟reportbot账号访问对应schema资源 string constr = "Data Source=ProdJobDb;User Id=reportbot;Proxy User Id=developer2;Proxy Password=Wysiwyg.12345;"; string ProviderName = "Oracle.ManagedDataAccess.Client"; DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName); using (DbConnection conn = factory.CreateConnection()) { try { conn.ConnectionString = constr; conn.Open(); // 此处可正常执行reportbot有权限的存储过程、表查询等操作 } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } } }
补充注意事项
- 确保你使用的Oracle.ManagedDataAccess Nuget包版本不低于12.1,早期预览版托管驱动存在代理用户功能缺陷,建议升级到最新稳定版
- 数据库端权限配置无需修改,原非托管模式下已配置的
ALTER USER reportbot GRANT CONNECT THROUGH developer2;权限可直接复用 - 如果你仅需要访问reportbot schema下的对象,且你的开发账号已经有对应对象的访问权限,也可以在连接打开后执行
ALTER SESSION SET CURRENT_SCHEMA = reportbot;语句切换默认schema,无需走代理登录逻辑
内容的提问来源于stack exchange,提问作者tgolisch
相关产品推荐
相关产品推荐

