Problema ao tentar dropar database com ant + postgres

2 respostas
Paulo_Faulstich

Olá pessoal, estou com um problema.

Tenho uma aplicação java e estou tentando otimizar alguns processos na atualização do servidor.

Com isso criei um build.xml para rodar com o ant.

Estou tentando dropar o meu banco de datos e não ta rolando.

Segue processo que estou fazendo e meu build.xml

build.xml

<project name="Drop Database" basedir=".">
   <property name="sql.driver" value="org.postgresql.Driver"/>
   <property name="sql.url" value="jdbc:postgresql:postgres"/>
   <property name="sql.user" value="postgres"/>
   <property name="sql.pass" value="mypwd"/>

   <target name="dropDB">      
      <sql driver="${sql.driver}" 
              url="${sql.url}" 
           userid="${sql.user}" 
         password="${sql.pass}">
          
          <classpath>
              <pathelement location="postgresql-8.3-603.jdbc3.jar"/>
          </classpath>            
          
          drop database mydatabase;      
      
      </sql>
   </target>

</project>

Rodando ant pela linha

C:\Users\Paulo\Documents\myproject>ant -buildfile build.xml dropDB

Retorno quando executo o comando

Buildfile: build.xml

dropDB:

BUILD FAILED
org.postgresql.util.PSQLException: ERROR: DROP DATABASE cannot run inside a transaction block
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:336)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:328)
        at org.apache.tools.ant.taskdefs.SQLExec.execSQL(SQLExec.java:565)
        at org.apache.tools.ant.taskdefs.SQLExec.runStatements(SQLExec.java:535)
        at org.apache.tools.ant.taskdefs.SQLExec$Transaction.runTransaction(SQLExec.java:764)
        at org.apache.tools.ant.taskdefs.SQLExec$Transaction.access$000(SQLExec.java:706)
        at org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:449)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:357)
        at org.apache.tools.ant.Target.performTasks(Target.java:385)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1189)
        at org.apache.tools.ant.Main.runBuild(Main.java:758)
        at org.apache.tools.ant.Main.startAnt(Main.java:217)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)

Total time: 0 seconds

Pessoal já tei uma lida a respeito eu uso windows vista e li em alguns forums que pode ser permissão, porém dei permissão na pasta que estou trabalhando para o user do postgres mas mesmo assim o erro segue o mesmo.

Alguem pode ajudar?

Abraços

2 Respostas

rogeriuslima

Explicação: Por default o autocommit é setado como false, isso significa que vc deve determinar quando terminar uma transação usando commit ou rolback, ou então setar autocommit como true.
ficaria assim:

<sql driver="${sql.driver}" url="${sql.url}" userid="${sql.user}" password="${sql.pass}" autocommit="true">

Paulo_Faulstich

Boa amigão funcionou.

Só uma coisa que achei estranho foram outros comandos DDL e DML funcionarem mesmo sem esse autocommit setado.

Tipo drop table e delete tava funcionando. Mas blz tudo fico lindo.

Segue dica do código funcionando.

&lt;project name="Drop Database" basedir="."&gt;  
    &lt;property name="sql.driver" value="org.postgresql.Driver"/&gt;  
    &lt;property name="sql.url" value="jdbc:postgresql:postgres"/&gt;  
    &lt;property name="sql.user" value="postgres"/&gt;  
    &lt;property name="sql.pass" value="mypwd"/&gt;  
   
    &lt;target name="dropDB"&gt;        
       &lt;sql driver="${sql.driver}"   
               url="${sql.url}"   
            userid="${sql.user}"   
          password="${sql.pass}"
             print="yes"
        autocommit="true"&gt;  
             
           &lt;classpath&gt;  
               &lt;pathelement location="postgresql-8.3-603.jdbc3.jar"/&gt;  
           &lt;/classpath&gt;              
             
           drop database mydatabase;        
         
       &lt;/sql&gt;  
    &lt;/target&gt;  
   
&lt;/project&gt;

Obrigado.

Abraço.

Criado 14 de maio de 2009
Ultima resposta 14 de mai. de 2009
Respostas 2
Participantes 2