2013-03-02 20 views
0

因此,我真的是PostgreSQL的新手,在過去的3天裏,我一直堅持使用它。我需要導入一個PostgreSQL數據庫。數據庫位於一個文件夾中,並具有各種.tab文件。 我有PostgreSQL 9.1版本。數據庫由用戶postgres導入,我向其授予所有可能的特權。我也授予語言的所有可能的特權。在Ubuntu服務器上導入PostgreSQL數據庫

由腳本運行的命令是:

CREATE OR REPLACE FUNCTION unique_toplevel_corpus_name() RETURNS TRIGGER AS $$ 
DECLARE 
     count INTEGER := 0; 
BEGIN 
     IF NEW.top_level = 'y' THEN 
       PERFORM * FROM corpus WHERE corpus.name = NEW.name AND corpus.t$ 
       GET DIAGNOSTICS count = ROW_COUNT; 
       IF count != 0 THEN 
         RAISE EXCEPTION 'conflicting top-level corpus found: %'$ 
       END IF; 
     END IF; 
     RETURN NEW; 
END; 
$$ language plpgsql; 

的代碼是不是我的。它在我的本地機器(Ubuntu 12.04)上提供並正常工作,導入數據庫沒有任何問題,但僅在Ubuntu服務器(也是12.04)上出現問題。

這是我不斷收到異常:

@valian:/opt/annis/annis-service-2.2.1/bin$ ./annis-admin.sh import /home/FilesForAnnis/Korpora/relANNIS/relANNIS/ 
19:38:45.755 CorpusAdministration INFO: Importing corpus from: /home/FilesForAnnis/Korpora/relANNIS/relANNIS/ 
19:38:45.758 SpringAnnisAdministrationDao INFO: creating staging area 
19:38:45.788 SpringAnnisAdministrationDao INFO: bulk-loading data 
19:38:46.236 SpringAnnisAdministrationDao INFO: computing top-level corpus 
Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [-- find the top-level corpus 
ALTER TABLE _corpus ADD top_level boolean; 
CREATE TRIGGER unique_toplevel_corpus_name BEFORE UPDATE ON _corpus FOR EACH ROW EXECUTE PROCEDURE unique_toplevel_corpus_name(); 
UPDATE _corpus SET top_level = 'n'; 
UPDATE _corpus SET top_level = 'y' WHERE pre = (SELECT min(pre) FROM _corpus); 

-- add the toplevel corpus to the node table 
CREATE INDEX tmp_corpus_toplevel ON _corpus (id) WHERE top_level = 'y'; 
ALTER TABLE _node ADD toplevel_corpus bigint; 
UPDATE _node SET toplevel_corpus = _corpus.id FROM _corpus WHERE _corpus.top_level = 'y'; 
DROP INDEX tmp_corpus_toplevel; 
]; nested exception is org.postgresql.util.PSQLException: ERROR: function unique_toplevel_corpus_name() does not exist 
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:98) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:406) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:427) 
    at annis.administration.SpringAnnisAdministrationDao.executeSqlFromScript(SpringAnnisAdministrationDao.java:617) 
    at annis.administration.SpringAnnisAdministrationDao.executeSqlFromScript(SpringAnnisAdministrationDao.java:608) 
    at annis.administration.SpringAnnisAdministrationDao.computeTopLevelCorpus(SpringAnnisAdministrationDao.java:226) 
    at annis.administration.CorpusAdministration.importCorpora(CorpusAdministration.java:85) 
    at annis.administration.CorpusAdministration$$FastClassByCGLIB$$ce864c53.invoke(<generated>) 
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) 
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621) 
    at annis.administration.CorpusAdministration$$EnhancerByCGLIB$$b6899e79.importCorpora(<generated>) 
    at annis.administration.AnnisAdminRunner.doImport(AnnisAdminRunner.java:176) 
    at annis.administration.AnnisAdminRunner.run(AnnisAdminRunner.java:74) 
    at annis.administration.AnnisAdminRunner.main(AnnisAdminRunner.java:49) 
Caused by: org.postgresql.util.PSQLException: ERROR: function unique_toplevel_corpus_name() does not exist 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:345) 
    at org.springframework.jdbc.core.JdbcTemplate$1ExecuteStatementCallback.doInStatement(JdbcTemplate.java:420) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:395) 
... 16 more 

我也更新JDBC posgtres連接器。我的本地機器的一切正常工作和服務器之間的唯一區別是,我在本地機器上安裝了java 1.7,而不是1.6,但我不認爲這可能是問題所在。

我不知道還有什麼我可以在那裏試試...

回答

0

這不是Ubuntu的問題。這是數據庫導入的問題。您的數據庫導入錯誤表示您缺少觸發器功能。

此外我知道代碼不是你的。如果您可以用部分唯一索引來替換觸發器,那麼您的性能會更好。

如果代碼不是你的,那麼你需要跟進誰寫這個函數爲什麼函數不在那裏,但是當你這樣做的時候,你可能想跟進他們關於用這:

CREATE UNIQUE INDEX ON corpus(name) WHERE corpus.t; 

這將表現更好,它更容易維護。

相關問題