【问题标题】:Can't disable Oracle foreign key over JDBC无法通过 JDBC 禁用 Oracle 外键
【发布时间】:2020-03-09 16:13:58
【问题描述】:

以下 SQL 脚本在我的 SQL 开发人员中完美运行:

begin
  for c in (select * from user_constraints where constraint_type = 'R' and status = 'ENABLED')
  loop
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
  end loop;
end;

当使用 Spring JdbcTemplate 执行相同的脚本时,什么也没有发生:

String sql = null;
try {
sql = FileUtils.readFileToString(resourceLoader.getResource("classpath:sql/DisableContraints.sql").getFile(), Charset.defaultCharset());
} catch (IOException e) {
   exceptionHandler.handleException("DisableContraints.sql not loaded.", e);
}
jdbcTemplate.execute(sql);

当我尝试选择外键时出现同样的奇怪行为:select * from user_constraints where constraint_type = 'R' and status = 'ENABLED'。 SQL-Developer 返回 32 个键,JDBC 返回 0。但是当我选择所有键时 (select * from user_constraints where status = 'ENABLED'),SQL-Developer 和 JDBC 返回 68 个键。

我不知道错在哪里。

【问题讨论】:

  • 您确定 getResources() 和 readFileToString() 调用正在执行您期望的操作吗?考虑在 execute() 调用之前记录sql 的值。是否有可能在 execute() 内部发生异常但被捕获?
  • 是的,我检查了 sql 变量。它包含文件的内容。

标签: java spring oracle jdbctemplate oracle18c


【解决方案1】:

也许您有不同的用户/模式?

试试吧:

select * from dba_constraints where constraint_type = 'R' and status = 'ENABLED' and owner = 'MYSCHEMA';

不要忘记所有者检查,您不想禁用SYSTEM- 检查。

【讨论】:

  • 如果代码没有按照预期执行,那么在 DBA 模式中运行它似乎不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 2015-03-12
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
相关资源
最近更新 更多