Tango-Dust
Tango-Dust

Reputation: 1

Java Not Deleting the DB Data Properly

I am running the following java code.The purpose of the code is to wipe a database of all data. When I take and run the SQL portion by itself on the db it successfully wipes it. However when I try to run it through this, the build succeeds but the data remains. Any help would be appreciated.

package ignorethis;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class CleanDatabaseCCQA3 {

    // Connect to your database.
    // Replace server name, username, and password with your credentials
    public static void main(String[] args) {
        String connectionUrl =
                "jdbc:sqlserver://ignoreme;"
                        + "database=mydb;"
                        + "user=myuser;"
                        + "password=mypass;"
                        + "encrypt=true;"
                        + "trustServerCertificate=true;"
                        + "loginTimeout=30;";

        ResultSet resultSet = null;

        try (Connection connection = DriverManager.getConnection(connectionUrl);
             Statement statement = connection.createStatement();) {

            // Create and execute an SQL statement.
            String cleanSql = " DECLARE @tableName VARCHAR(200) SET @tableName='' WHILE EXISTS(SELECT T.table_name FROM INFORMATION_SCHEMA.TABLES T LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON T.table_name=TC.table_name WHERE (TC.constraint_Type ='Foreign Key'or TC.constraint_Type IS NULL) AND T.table_name NOT IN ('dtproperties','sysconstraints','syssegments')AND Table_type='BASE TABLE' AND T.table_name > @TableName) BEGIN SELECT @tableName=min(T.table_name) FROM INFORMATION_SCHEMA.TABLES T LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON T.table_name=TC.table_name WHERE (TC.constraint_Type ='Foreign Key'or TC.constraint_Type IS NULL) AND T.table_name NOT IN ('dtproperties','sysconstraints','syssegments') AND Table_type='BASE TABLE' AND T.table_name > @TableName EXEC('DELETE FROM '+@tablename) PRINT 'DELETE FROM '+@tablename END SET @TableName='' WHILE EXISTS(SELECT T.table_name FROM INFORMATION_SCHEMA.TABLES T LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON T.table_name=TC.table_name WHERE TC.constraint_Type ='Primary Key'AND T.table_name <>'dtproperties' AND Table_type='BASE TABLE' AND T.table_name > @TableName) BEGIN SELECT @tableName=min(T.table_name) FROM INFORMATION_SCHEMA.TABLES T LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON T.table_name=TC.table_name WHERE TC.constraint_Type ='Primary Key' AND T.table_name <>'dtproperties' AND Table_type='BASE TABLE' AND T.table_name > @TableName EXEC('DELETE FROM '+ @tableName) PRINT 'DELETE FROM '+ @tableName If EXISTS(SELECT * FROM information_schema.columns WHERE COLUMNPROPERTY(OBJECT_ID(QUOTENAME(table_schema)+'.'+ QUOTENAME(@tableName)), column_name,'IsIdentity')=1) BEGIN DBCC CHECKIDENT (@tableName, RESEED, 1) PRINT @tableName END END ";
            resultSet = statement.executeQuery(cleanSql);

            // Print results from select statement
            while (resultSet.next()) {
                System.out.println(resultSet.getString(2) + " " + resultSet.getString(3));
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Here is a more readable version of the sql ran above. This should help give some further context.

DECLARE @tableName VARCHAR(200)  
SET @tableName=''  
WHILE EXISTS  
 (  
 --Find all child tables AND those which have no relations  
             SELECT T.table_name FROM INFORMATION_SCHEMA.TABLES T  
             LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC  
             ON T.table_name=TC.table_name  
             WHERE (TC.constraint_Type ='Foreign Key'or TC.constraint_Type IS NULL) AND  
             T.table_name NOT IN ('dtproperties','sysconstraints','syssegments')AND  
             Table_type='BASE TABLE' AND T.table_name > @TableName  
 )  
 BEGIN  
             SELECT @tableName=min(T.table_name) FROM INFORMATION_SCHEMA.TABLES T  
             LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC  
             ON T.table_name=TC.table_name  
             WHERE (TC.constraint_Type ='Foreign Key'or TC.constraint_Type IS NULL) AND  
             T.table_name NOT IN ('dtproperties','sysconstraints','syssegments') AND  
             Table_type='BASE TABLE' AND T.table_name > @TableName  
             --Truncate the table  
             EXEC('DELETE FROM '+@tablename)  
     PRINT 'DELETE FROM '+@tablename  
 END 

SET @TableName=''  
WHILE EXISTS  
(  
            --Find all Parent tables  
            SELECT T.table_name FROM INFORMATION_SCHEMA.TABLES T  
            LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC  
            ON T.table_name=TC.table_name  
            WHERE TC.constraint_Type ='Primary Key'AND T.table_name <>'dtproperties' AND  
            Table_type='BASE TABLE' AND T.table_name > @TableName  
)  
BEGIN  
            SELECT @tableName=min(T.table_name) FROM INFORMATION_SCHEMA.TABLES T  
            LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON T.table_name=TC.table_name  
            WHERE TC.constraint_Type ='Primary Key' AND T.table_name <>'dtproperties' AND  
            Table_type='BASE TABLE' AND T.table_name > @TableName  
  
            --DELETE the table  
            EXEC('DELETE FROM '+ @tableName)  
            PRINT 'DELETE FROM '+ @tableName  
            --Reset identity column  
            If EXISTS  
            (  
                        SELECT * FROM information_schema.columns  
                        WHERE COLUMNPROPERTY(OBJECT_ID(QUOTENAME(table_schema)+'.'+  
                        QUOTENAME(@tableName)), column_name,'IsIdentity')=1  
            )  
            BEGIN  
                        DBCC CHECKIDENT (@tableName, RESEED, 1)  
                        PRINT @tableName  
            END  
END 

After making the changes suggested below I get the following stack trace

[[1;34mINFO[m] [1m--- [0;32mexec-maven-plugin:3.0.0:java[m [1m(default-cli)[m @ [36mmcautomation[0;1m ---[m
com.microsoft.sqlserver.jdbc.SQLServerException: Cannot invoke a rollback operation when the AutoCommit mode is set to "true".
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:226)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.rollback(SQLServerConnection.java:3086)
    at com.matrixcare.automation.utils.CleanDatabaseCCQA3.main(CleanDatabaseCCQA3.java:39)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:254)
    at java.lang.Thread.run(Thread.java:748)
[[1;33mWARNING[m] thread Thread[Abandoned connection cleanup thread,5,com.matrixcare.automation.utils.CleanDatabaseCCQA3] was interrupted but is still alive after waiting at least 15000msecs
[[1;33mWARNING[m] thread Thread[Abandoned connection cleanup thread,5,com.matrixcare.automation.utils.CleanDatabaseCCQA3] will linger despite being asked to die via interruption
[[1;33mWARNING[m] NOTE: 1 thread(s) did not finish despite being asked to  via interruption. This is not a problem with exec:java, it is a problem with the running code. Although not serious, it should be remedied.
[[1;33mWARNING[m] Couldn't destroy threadgroup org.codehaus.mojo.exec.ExecJavaMojo$IsolatedThreadGroup[name=com.matrixcare.automation.utils.CleanDatabaseCCQA3,maxpri=10]
[1;31mjava.lang.IllegalThreadStateException[m
    [1mat[m java.lang.ThreadGroup.destroy ([1mThreadGroup.java:778[m)
    [1mat[m org.codehaus.mojo.exec.ExecJavaMojo.execute ([1mExecJavaMojo.java:293[m)
    [1mat[m org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo ([1mDefaultBuildPluginManager.java:137[m)
    [1mat[m org.apache.maven.lifecycle.internal.MojoExecutor.execute ([1mMojoExecutor.java:210[m)
    [1mat[m org.apache.maven.lifecycle.internal.MojoExecutor.execute ([1mMojoExecutor.java:156[m)
    [1mat[m org.apache.maven.lifecycle.internal.MojoExecutor.execute ([1mMojoExecutor.java:148[m)
    [1mat[m org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject ([1mLifecycleModuleBuilder.java:117[m)
    [1mat[m org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject ([1mLifecycleModuleBuilder.java:81[m)
    [1mat[m org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build ([1mSingleThreadedBuilder.java:56[m)
    [1mat[m org.apache.maven.lifecycle.internal.LifecycleStarter.execute ([1mLifecycleStarter.java:128[m)
    [1mat[m org.apache.maven.DefaultMaven.doExecute ([1mDefaultMaven.java:305[m)
    [1mat[m org.apache.maven.DefaultMaven.doExecute ([1mDefaultMaven.java:192[m)
    [1mat[m org.apache.maven.DefaultMaven.execute ([1mDefaultMaven.java:105[m)
    [1mat[m org.apache.maven.cli.MavenCli.execute ([1mMavenCli.java:956[m)
    [1mat[m org.apache.maven.cli.MavenCli.doMain ([1mMavenCli.java:288[m)
    [1mat[m org.apache.maven.cli.MavenCli.main ([1mMavenCli.java:192[m)
    [1mat[m sun.reflect.NativeMethodAccessorImpl.invoke0 ([1mNative Method[m)
    [1mat[m sun.reflect.NativeMethodAccessorImpl.invoke ([1mNativeMethodAccessorImpl.java:62[m)
    [1mat[m sun.reflect.DelegatingMethodAccessorImpl.invoke ([1mDelegatingMethodAccessorImpl.java:43[m)
    [1mat[m java.lang.reflect.Method.invoke ([1mMethod.java:498[m)
    [1mat[m org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced ([1mLauncher.java:289[m)
    [1mat[m org.codehaus.plexus.classworlds.launcher.Launcher.launch ([1mLauncher.java:229[m)
    [1mat[m org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode ([1mLauncher.java:415[m)
    [1mat[m org.codehaus.plexus.classworlds.launcher.Launcher.main ([1mLauncher.java:356[m)

Upvotes: 0

Views: 139

Answers (1)

St&#233;phane Millien
St&#233;phane Millien

Reputation: 3448

Add the commit to commit the changes (delete)

...
    while (resultSet.next()) {
        System.out.println(resultSet.getString(2) + " " + resultSet.getString(3));
    }
    connection.commit();
}
catch (SQLException e) {
    e.printStackTrace();
    connection.rollback();
}
...

You should use try-with-resource for the ResultSet too:

// ResultSet resultSet = null;

try (Connection connection = DriverManager.getConnection(connectionUrl);
     Statement statement = connection.createStatement();) {

    // Create and execute an SQL statement.
    String cleanSql = " DECLARE @tableName VARCHAR(200) SET @tableName='' WHILE EXISTS(SELECT T.table_name FROM INFORMATION_SCHEMA.TABLES T LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON T.table_name=TC.table_name WHERE (TC.constraint_Type ='Foreign Key'or TC.constraint_Type IS NULL) AND T.table_name NOT IN ('dtproperties','sysconstraints','syssegments')AND Table_type='BASE TABLE' AND T.table_name > @TableName) BEGIN SELECT @tableName=min(T.table_name) FROM INFORMATION_SCHEMA.TABLES T LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON T.table_name=TC.table_name WHERE (TC.constraint_Type ='Foreign Key'or TC.constraint_Type IS NULL) AND T.table_name NOT IN ('dtproperties','sysconstraints','syssegments') AND Table_type='BASE TABLE' AND T.table_name > @TableName EXEC('DELETE FROM '+@tablename) PRINT 'DELETE FROM '+@tablename END SET @TableName='' WHILE EXISTS(SELECT T.table_name FROM INFORMATION_SCHEMA.TABLES T LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON T.table_name=TC.table_name WHERE TC.constraint_Type ='Primary Key'AND T.table_name <>'dtproperties' AND Table_type='BASE TABLE' AND T.table_name > @TableName) BEGIN SELECT @tableName=min(T.table_name) FROM INFORMATION_SCHEMA.TABLES T LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON T.table_name=TC.table_name WHERE TC.constraint_Type ='Primary Key' AND T.table_name <>'dtproperties' AND Table_type='BASE TABLE' AND T.table_name > @TableName EXEC('DELETE FROM '+ @tableName) PRINT 'DELETE FROM '+ @tableName If EXISTS(SELECT * FROM information_schema.columns WHERE COLUMNPROPERTY(OBJECT_ID(QUOTENAME(table_schema)+'.'+ QUOTENAME(@tableName)), column_name,'IsIdentity')=1) BEGIN DBCC CHECKIDENT (@tableName, RESEED, 1) PRINT @tableName END END ";
    // resultSet = statement.executeQuery(cleanSql);

    // Print results from select statement
    try (ResultSet resultSet = statement.executeQuery(cleanSql)) {
        while (resultSet.next()) {
            System.out.println(resultSet.getString(2) + " " + resultSet.getString(3));
        }
        connection.commit();
    }
    catch (SQLException e) {
        connection.rollback();
        throw e;
    }
}
catch (SQLException e) {
    e.printStackTrace();
}

Upvotes: 3

Related Questions