与here完全一样,我想在修改数据库时禁用外键检查。
但是我无法让它发挥作用。如果我试试这个:
jdbc:sqlserver://myserver:1433?sessionVariables=FOREIGN_KEY_CHECKS=0
它会尝试将整个1433?sessionVariables=FOREIGN_KEY_CHECKS=0
作为端口号。
尝试这样:
jdbc:sqlserver://myserver:1433;FOREIGN_KEY_CHECKS=0
也没有帮助,它会设置连接但抛出外键约束违规。
我已经查看了JDBC驱动程序上的Microsoft API并用Google搜索,但它没有任何帮助。
有人知道解决方案吗?
答案 0 :(得分:0)
似乎这对MSSQL来说是不可能的。网址的spec为
jdbc:sqlserver://[serverName[\instanceName][:portNumber]];property=value[;property=value]]
这里不能添加任何会话变量,至少在我看来。
我的解决方案是使用语句来启用和禁用数据库约束。
public static void resetDatabase(String dataSetFilename) throws DatabaseException {
IDatabaseConnection connection = null;
try {
connection = getDatabaseConnection();
disableDatabaseConstraints(connection);
executeDatabaseReset(connection, dataSetFilename);
} catch (Exception ex) {
throw new DatabaseException(ex);
} finally {
enableDatabaseConstraints(connection);
}
}
private static void disableDatabaseConstraints(IDatabaseConnection connection) throws DatabaseException {
try {
Statement disableConstraintsStatement = connection.getConnection().createStatement();
disableConstraintsStatement.execute("exec sp_MSforeachtable \"ALTER TABLE ? NOCHECK CONSTRAINT ALL\"");
disableConstraintsStatement.execute("exec sp_MSforeachtable \"ALTER TABLE ? DISABLE TRIGGER ALL\"");
} catch (SQLException ex) {
throw new DatabaseException(ex);
}
}
private static void enableDatabaseConstraints(IDatabaseConnection connection) throws DatabaseException {
try {
Statement enableConstraintsStatement = connection.getConnection().createStatement();
enableConstraintsStatement.execute("exec sp_MSforeachtable \"ALTER TABLE ? CHECK CONSTRAINT ALL\"");
enableConstraintsStatement.execute("exec sp_MSforeachtable \"ALTER TABLE ? ENABLE TRIGGER ALL\"");
} catch (SQLException ex) {
throw new DatabaseException(ex);
}
}