与这里完全一样,我想在修改数据库时禁用外键检查。
但是,我无法正常工作。如果我尝试一下:
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,但这并没有任何帮助。
有人知道解决方案吗?
MSSQL似乎不可能。URL的规格是
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);
}
}