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.
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!
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
Ist Dir das Konzept interaktiver Kommandozeilen klar? Hint: da gibt es einen Prompt vom System, und etwas, was ich eingetippt habe. Nicht alles guttenbergen …
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
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.