MS SQL JDBC:设置连接URL参数以禁用外键检查

时间:2014-01-21 16:16:59

标签: java sql java-ee mssql-jdbc

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搜索,但它没有任何帮助。

有人知道解决方案吗?

1 个答案:

答案 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);
    }
}