Problem mit mehrbefehligen Zeichenkette

Hallo,

Ich versuche ein Skript zu erstellen und bin da auf ein Problem gestoßen wo ich irgendwie nicht weiter komme.
In diesen Skript sollen die datenbanken und rollen gelöscht werden und danach wieder neu erzeugt werden.

DROP DATABASE IF EXISTS "TestDB";
DROP ROLE IF EXISTS "TestUser";

beim ausführen bekomme ich folgenden Fehler:

FEHLER:  DROP DATABASE kann nicht aus einer Funktion oder einer mehrbefehligen Zeichenkette heraus ausgeführt werden

********** Fehler **********

FEHLER: DROP DATABASE kann nicht aus einer Funktion oder einer mehrbefehligen Zeichenkette heraus ausgeführt werden
SQL Status:25001

Ja. weil DROP DATABASE kann nicht zurückgerollt werden. Daher geht das nicht in einer Transaktion. Eine Funktion oder mehrbefehlige Zeichenkette wird aber als eine TX angesehen.


Andreas

Danke für die superschnelle antwort. Kann man das irgendwie übergehen. Im Microsoft SQL ging so was über Variablen und über Exec. Hab dies bei Postgesql noch nicht hinbekommen!

Halt nicht in einer Funktion bzw. mehrbefehlig ausführen.

Andreas

Das ist ja genau meine frage wie man das in postresql machen kann?

Wie rufst Du das denn alles auf? Du siehst im Beispiel den Unterschied?

test=# begin; create table test(i int); create database test2; drop database test2; commit;
BEGIN
Time: 0.110 ms
CREATE TABLE
Time: 1.077 ms
ERROR:  CREATE DATABASE cannot run inside a transaction block
ERROR:  current transaction is aborted, commands ignored until end of transaction block
ROLLBACK
Time: 0.120 ms
test=# create table test(i int); create database test2; drop database test2;
CREATE TABLE
Time: 46.094 ms
CREATE DATABASE
Time: 446.522 ms
DROP DATABASE
Time: 107.585 ms

Andreas

Ich rufe die abfrage über pgadminIII auf --> SQL Editor

muss ich bei der abfrage etwas beachten denn

test=# begin; create table test(i int); create database test2; drop database test2; commit;

bekomme ich ein fehler:

FEHLER:  Syntaxfehler bei »test«
LINE 1: test=# begin; create table test(i int); create database test...

Ist Dir das Konzept interaktiver Kommandozeilen klar? Hint: da gibt es einen Prompt vom System, und etwas, was ich eingetippt habe. Nicht alles guttenbergen …


Andreas

Beschäftige mich seit einer woche mit PostgreSQL und muss mich erst mal einarbeiten habe vorher mit Microsoft SQL gearbeitet und mir hat mal empfohlen PostgreSQL zu verwenden. Bei Microsoft SQL funktioniert dies einwandfrei. Versuche dies durch test zu begreifen und naklar versuche ich da einfach mal das zu kopieren und zu testen

Also, in der Zeile:

test=# begin; create table test(i int); create database test2; drop database test2; commit;

ist alles bis einschl. dem # der Prompt vom System, erst mit dem ‘begin…’ kommt meine Eingabe. Ich nutze dazu auch nicht PGAdmin, sondern psql.

Wenn Du Dinge via Script machen willst, ist PGAdmin als Klickie-Oberfläche meiner Meinung nach eher nicht das optimale Werkzeug, ich nahm daher an, auch Du verwendest psql.

Ich bin mir jetzt nicht sicher, ob PGAdmin mehrere Befehle automatisch in eine TX kapselt. Vermutlich macht es dies aber.


Andreas

Okay wer mich mal mit psql auseinandersetzten :wink: Brauch die Scripte für Prozesse.

Habe die Abfrage nun ohne PROMT gemacht aber anscheint geht create und drop nicht in einem Transaktionsblock.

Aber denke mal das bekomme ich noch hin. Danke erst mal