Drehen IDENTITY_INSERT ON auf einer Tabelle mit DB-Einheit zu laden
-
25-09-2019 - |
Frage
ich versuche, eine Tabelle zu laden, die eine Identitätsspalte hat, mit DB-Einheit. Ich möchte die ID-Wert in der Lage sein, mich zu setzen (ich will nicht die Datenbank es für mich generieren).
Hier ist eine Minimaldefinition meiner Tabelle
create table X (
id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL
)
eine Zeile in X einzufügen, ich die folgende SQL
set INDENTITY_INSERT X ON
insert into X(id) VALUES(666)
Kein Problem. Aber wenn ich versuche, diese Tabelle zu laden, mit dem folgenden db Einheit XML-Datensatz (RS_7_10_minimal_ini.xml)
<dataset>
<X id="666"/>
</dataset>
mit dem folgenden minimalen JUnit (DBTestCase) Testfall:
package lms.lp.functionnal_config;
import java.io.FileInputStream;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import lms.DBUnitConfig;
import org.junit.Test;
public class SampleTest extends DBTestCase
{
public SampleTest(String name)
{
super( name );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, DBUnitConfig.DBUNIT_DRIVER_CLASS );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, DBUnitConfig.DBUNIT_CONNECTION_URL );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, DBUnitConfig.DBUNIT_USERNAME );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, DBUnitConfig.DBUNIT_PASSWORD );
}
protected IDataSet getDataSet() throws Exception
{
return new FlatXmlDataSetBuilder().build(new FileInputStream("src/test/resources/RS_7_10_minimal_ini.xml"));
}
@Test
public void testXXX() {
// ...
}
}
Es schlägt fehl, mit folgenden Ausnahme
com.sybase.jdbc3.jdbc.SybSQLException: Explicit value specified for identity field in table 'X' when 'SET IDENTITY_INSERT' is OFF.
Es scheint DB Einheit nicht Identität nicht einschalten, bevor eine Zeile einzufügen, für den der Wert der Identitätsspalte angegeben ist.
Ich habe bereits versucht, mich auf der Verbindung von den JdbcDataBaseTester abgerufen auszuführen, aber kein Glück. Wahrscheinlich eine neue Verbindung oder nicht die gleiche Verbindung verwendet, um die Daten in de DB zu drücken.
Jede Idee?
Vielen Dank für Ihre Hilfe alle!
Octave
Lösung
Ja, fand die Lösung in der DBUnit FAQ eigentlich
Kann ich DbUnit mit IDENTITY oder Autoinkrement-Spalten?
Viele RDBMSes erlauben IDENTITY und Autoinkrement-Spalten implizit mit Client-Werten überschrieben werden. DbUnit kann nativ mit diesem RDBMS verwendet werden. Einige Datenbanken, wie MS SQL Server und Sybase, müssen explizit activate Client Werte Schreiben. Die Art und Weise diese Funktion zu aktivieren ist herstellerspezifisch. DbUnit bietet diese Funktionalität für MS SQL Server mit der InsertIdentityOperation Klasse.
Auch wenn es für den MS SQL Server geschrieben wird, wird funktioniert auch für Sybase. Also ich meine Datensatz Push-to-db mit
new InsertIndentityOperation(DatabaseOperation.CLEAN_INSERT).execute(connection,initialDataSet);
Et voilà.
Danke für deine Antwort rawheiser.
Andere Tipps
Nicht familar genug mit DBUnit Sie mit den Besonderheiten zu helfen; aber ich habe eine Tabelle truncate und Nachsaat den Identitätswert in ähnlichen Situationen angewandt.
dbcc checkident