0

こことまったく同じように、データベースを変更するときに外部キー チェックを無効にしたい。

しかし、私はそれを機能させることができません。私がこれを試してみると:

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 を調べてグーグル検索しましたが、何の助けにもなりませんでした。

誰かが解決策を知っていますか?

4

1 に答える 1

0

これは 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);
    }
}
于 2014-01-27T16:02:48.163 に答える