2013-11-25 11 views
5

Beh, questo è un po 'strano, qualcuno potrebbe aiutarmi a sottolineare dove questa funzione potrebbe essere sbagliata. Ho una funzione simile a quellaerrore di migrazione postgres; stringa non quotata in dollari

CREATE FUNCTION check_password(uname TEXT, pass TEXT) 
RETURNS BOOLEAN AS $$ 
DECLARE passed BOOLEAN; 
BEGIN 
     SELECT (pwd = $2) INTO passed 
     FROM pwds 
     WHERE username = $1; 

     RETURN passed; 
END; 

$$ LANGUAGE plpgsql 

quando l'eseguo direttamente nella console SQL pgAdmin, non ci sono errori, ma in esecuzione in uno script di migrazione utilizzando db-migrazione-maven-plugin ottengo l'errore.

Error executing: CREATE FUNCTION check_password(uname TEXT, pass TEXT) 
       RETURNS BOOLEAN AS $$ DECLARE passed BOOLEAN 
org.postgresql.util.PSQLException: ERROR: unterminated dollar-quoted 
         string at or near "$$ DECLARE passed BOOLEAN" 
Position: 74 
+0

Spiacenti, di fronte lo stesso problema ora. Hai trovato il modo di risolverlo? –

+1

Ho evitato di scrivere funzioni lunghe tutte insieme. È un problema con il software di migrazione (carbonfive). Ho pensato di apportare alcune modifiche ad esso poiché è opensourced ma non ho tempo. – ivanorone

+0

Ho ricevuto un messaggio di errore simile utilizzando Aqua Data Studio, che utilizza il driver JDBC di Redshift. Nel mio caso, la soluzione era andare su "Opzioni" e deselezionare "; Separatore di istruzioni '. Sembra che il parser presupponesse che il primo punto e virgola fosse la fine dell'intera definizione di funzione, e non aveva ancora visto il closing $$. La funzione di esempio è stata creata senza errori sul mio sistema (versione 9.5) quando quella casella era deselezionata. Con il '; Separatore di istruzioni 'spuntato, ho avuto lo stesso errore. Spero che questo aiuti. – Jason

risposta

2

L'SQL generato dai vostri script di migrazione probabilmente avere un qualche tipo di $$ citazioni in loro che viene interpretata come una stringa da qualche parte.

Una soluzione rapida e sporca potrebbe essere quella di cambiare $$ a $func$ o anche $check_password$, anche se potrebbero esserci altre funzioni più in basso che presentano lo stesso problema.

L'approccio migliore a più lungo termine sarà quello di individuare l'offendente $$.

+0

l'ho pensato inizialmente, ho cambiato $ in $ func $ ma non ha mai aiutato – ivanorone

+0

@ivan_d_coder: non è riuscito con lo stesso identico messaggio di errore, o in una posizione diversa? –

+0

la stessa posizione e lo stesso errore :) – ivanorone

2

@ivanorone: C'è un bug archiviato per db-migration-maven-plug-in: https://code.google.com/p/c5-db-migration/issues/detail?id=9 C'è una patch inclusa, ma guardando la sua origine, non risolve il problema in modo corretto. Oltre a ciò, il progetto sembra essere inattivo (ultimo commit 2010).

C'è un altro plug-in, che sto cercando di usare invece, Flyway: http://flywaydb.org/ Passare ad esso è stato piuttosto semplice e funziona fino ad ora.

+1

Sono d'accordo, flywaydb sembra essere più attivo di carbon5 b-migration-maven-plugin. Non l'avevo preso sul serio, ma darei un'occhiata presto – ivanorone

0

Soluzione per Grails Database Migration Plugin

changeSet(author: "...", id: "...") { 
    sql(splitStatements: false, ''' 
     CREATE FUNCTION trigger_func() RETURNS TRIGGER AS $$ 
     DECLARE var text; 
     BEGIN 
     ... 
     END $$ LANGUAGE plpgsql; 
    ''') 
} 
0

Esegue la query come singolo batch (Suggerimento: utilizzare CTRL + F5) .Quando ho eseguito la query in Postgres SQL (Greenplum Interface) ho ottenuto l'errore simile come u detto sopra. Ho scoperto che db sta eseguendo una query dividendola in base alla terminazione nella nostra query (punto e virgola). Come abbiamo terminato tre volte nella tua query, lo esegue una per una dichiarazione. Quindi, per eseguirlo come un intero batch, esegui come eseguirlo come singolo batch nella tua opzione di esecuzione.

Spero che ti aiuta :) :)

Problemi correlati