【问题标题】:Oracle - SET ROLE StatementOracle - SET ROLE 语句
【发布时间】:2023-04-03 06:30:02
【问题描述】:

下面的代码在java中不起作用。

Class.forName('oracle.jdbc.driver.OracleDriver');
            Connection connection = DriverManager.getConnection('jdbc:oracle:thin:@localhost:1521:test', 'xyz', 'pass');
            PreparedStatement stmt = connection.prepareStatement("set role ? identified by ?");
            String role = "TEST_ROLE";
            String pswd = "TEST_PASS";
            stmt.setString(1, role);
            stmt.setString(2, pswd);
            stmt.execute();

而上面的代码抛出异常:

java.sql.SQLSyntaxErrorException: ORA-01937: missing or invalid role name

我在成功执行的命令模式下尝试了相同的角色和密码。

【问题讨论】:

  • 角色名称是一个标识符。您不能在准备好的语句中将标识符作为参数传递。
  • 尝试将参数连接到 SQL 并执行?
  • @GurV,我现在有连接参数的代码。但在记录器中它会打印密码。我需要避免在记录器中显示密码。
  • @user3515080:在这种情况下,您必须修改记录器。

标签: java oracle jdbc user-roles role


【解决方案1】:

您只能使用 PreparedStatement 的绑定变量来绑定,而不是角色名称或密码等标识符。您必须借助字符串操作来获得这种效果(假设这些值不是硬编码的,如上所示,在这种情况下,您只需将它们放入字符串中即可完成)。例如:

String role = "TEST_ROLE";
String pswd = "TEST_PASS";
String sql = String.format("set role %s identified by %s", role, pswd);

【讨论】:

  • 我现在有连接参数的代码。但在记录器中它会打印密码。我需要避免在记录器中显示密码。
猜你喜欢
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多