Reputation: 1
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
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