gpt4 book ai didi

java - Derby - 替换其他 View 所依赖的 View

转载 作者:行者123 更新时间:2023-12-01 09:30:28 24 4
gpt4 key购买 nike

Derby 数据库不支持创建或替换 View 构造。如何替换其他 View 所依赖的 View ?当我在创建之前尝试删除 View 时,Derby 抛出异常

Operation 'DROP VIEW' cannot be performed on object 'VIEW_NAME' because VIEW 'OTHER_VIEW_NAME' is dependent on that object.

设置所有延迟的约束不会改变任何内容。

最佳答案

在运行时用依赖项替换 View :

Pattern messagePattern = Pattern.compile(
"Operation 'DROP VIEW' cannot be performed on object '\\w+' because VIEW '(\\w+)' is dependent on that object.");

class ViewDefinition {
String name;
String definition;
}

public void replaceView(ViewDefinition view, Connection conn) throws SQLException {
Deque<ViewDefinition> viewsToDrop = new LinkedList<ViewDefinition>();
Deque<ViewDefinition> viewsToAdd = new LinkedList<ViewDefinition>();
viewsToDrop.push(view);
viewsToAdd.push(view);

Statement st = conn.createStatement();

try {
while (!viewsToDrop.isEmpty()) {
ViewDefinition nextView = viewsToDrop.getFirst();
try {
st.execute("drop view " + nextView.name);
} catch (SQLException e) {
if ("X0Y23".equals(e.getSQLState())) {
// dependency error
String message = e.getMessage();
Matcher matcher = messagePattern.matcher(message);
if (matcher.matches()) {
ViewDefinition dependentView = new ViewDefinition();
dependentView.name = matcher.group(1);
dependentView.definition = getViewDefinition(dependentView.name, conn);
viewsToDrop.addFirst(dependentView);
viewsToAdd.addFirst(dependentView);
continue;
} else {
throw new RuntimeException(
String.format("Can't detect dependent view name for view %s", nextView.name));
}
} else {
throw e;
}
}
// view dropped
viewsToDrop.removeFirst();
}
while (!viewsToAdd.isEmpty()) {
ViewDefinition nextView = viewsToAdd.pollLast();
st.execute(nextView.definition);
}
} finally {
if (!st.isClosed())
st.close();
}
}

private String getViewDefinition(String viewName, Connection conn) throws SQLException {
String definition = null;
PreparedStatement ps = conn.prepareStatement(
"select v.viewdefinition from sys.sysviews v inner join sys.systables t on t.tableid = v.tableid where lower(t.tablename) = lower(?) and t.tabletype = ?");
ps.setString(1, viewName);
ps.setString(2, "V");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
definition = rs.getString("viewdefinition");
}
rs.close();
ps.close();
return definition;
}

关于java - Derby - 替换其他 View 所依赖的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39470536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com