PgBash (de)
Die Übersetzung: Jan Novák
Sie können PgBash wie binäre Datei download, oder können Sie aus den Ursprungskoden übersetzen. Sie sind in der Patch für Bash Applikationsform, darum müssen Sie die Ursprungskoden für entsprechende Version des Bash haben.
#!/usr/local/bin/pgbash connect to testdb011; SELECT Name FROM Namen; | less disconnect all;
Sowohl benutzen wir die Veränderliche in der Order von Shell, als auch können wir die Veränderliche in SQL benutzen. Pgbash gibt zur SQL-Order SELECT die Möglichkeit der Wert der Zahlenspalte von Shell zuordnen.
#!/usr/local/bin/pgbash connect to testdb011; SELECT COUNT(Name) INTO :pName FROM Namen WHERE Name LIKE '$1%'; > /dev/null echo "mit Vorzeichenoperator $1 beginnt $pName der Namen" disconnect all;
Nach der Ausführung der Frage können wir "eingebaute" Veränderliche $SQLCODE, $SQLERRD2 und andere prüfen. Wenn SQL-Order mit dem Fehler beendet hat, dann $SQLCODE wird die Fehlernummer enthalten. Anders sie enthält 0 (wir können $SQL_OK benutzen). $SQLERRD2 enthält die Zahl der zurückgesetzten Zeile.
#!/usr/local/bin/pgbash connect to testdb011; SELECT c.relname FROM pg_catalog.pg_class c WHERE c.relkind = 'r' AND pg_catalog.pg_table_is_visible(c.oid) AND c.relname = 'meineTabelle'; > /dev/null # Tabelle wird nur in der Fall herausbildet, wenn sie noch nicht existiert if [ $SQLERRD2 = 0 ]; then CREATE TABLE meineTabelle ( a integer, b integer ); fi disconnect all;
Iteration über zurückgesetzten Tabellenzeile ist möglich durch die Cursoren. Skript, das ersten $2 Zeilen aus der Tabelle Namen ausgeschrieben wird, sieht folgt aus (erste Parametr des Skript ist Vorzeichenoperator den Namen):
#!/usr/local/bin/pgbash connect to testdb011; BEGIN; DECLARE c CURSOR FOR SELECT Name FROM Namen WHERE Name LIKE '$1%'; lines=1 FETCH IN c INTO :Name; while [ $SQLCODE -eq $SQL_OK ]; do if [ $lines -gt $2 ] ; then break fi echo $Name let "lines+=1" FETCH IN c INTO :Name; done END; disconnect all;
Wir können Pgbash für Bildung des automatisierten Installationskript benutzen, einschließlich Daten füllen - (pgbash unterstützt dynamischen Anschlussumschaltung). Im erten Anschluss kann man die Tabelle lesen, im zweiten die verlesen Zeile in die Tabelle schreiben.
#!/usr/local/bin/pgbash connect to testdb1@kix as db1; connect to testfce as db2; set connection db2; BEGIN; DECLARE c CURSOR FOR SELECT * FROM t1; FETCH IN c INTO :c1, :c2; while [ $SQLCODE -eq $SQL_OK ]; do set connection db1; INSERT INTO t1 VALUES($c1,\'$c2\'); set connection db2; FETCH IN c INTO :c1, :c2; done END; disconnect all;
Durch PgBash kann man Dateibaseverwaltung oder Systemverwaltung automatisieren. Bei der Automation der Dateibaseverwaltung können wir periodischen Applikationanlauf (cron), Dateisystemzugriff (export und import), Zugriff zu systemen Veränderlichen benutzen.Wir wahrscheinlich benutzen PgBash für die Systemverwaltung in diese Fälle, wenn Anfangsdaten werden in einige Dateibase abgelegt (die Benutzerliste, die Computerliste und so weiter).
Folgende Beispiel hebt diese Dateibasen auf, derer Name vom Eigner ist in der Klausel LIKE. Ich zeige zwei Varianten von der Order an. Die erste benutzt den Fakt, dass man SQL-Order mit `` machen kann. Das Ergebnis ist dann die Folge, die mehrzeiligen Text enthaltet.Die zweite Variante benutzt den Cursor. Weil wir der Cursor nur in der Transaktion benutzen können und bei der geöffneten Transaktion kann man nicht der Order DROP DATABASE benutzen, muss das Skript zwei Zyklen enthalten.
Variante Nummer 1
#!/usr/local/bin/pgbash connect to template1; set option_header=off; set option_bottom=off; set option_alignment=off; set option_separator=; dblist=`SELECT d.datname FROM pg_catalog.pg_database d LEFT JOIN pg_catalog.pg_user u ON d.datdba = u.usesysid WHERE u.usename LIKE '$1';` if [ "$dblist" != "" ]; then echo "$dblist" | while read db; do echo "Ich mache Dateibase $db weg" DROP DATABASE \"$db\"; done fi disconnect all;
Variante Nummer 2
#!/usr/local/bin/pgbash connect to template1; BEGIN; DECLARE c CURSOR FOR SELECT d.datname FROM pg_catalog.pg_database d LEFT JOIN pg_catalog.pg_user u ON d.datdba = u.usesysid WHERE u.usename LIKE '$1'; FETCH IN c INTO :dbname; while [ $SQLCODE -eq $SQL_OK ]; do dblist="$dblist \"$dbname\"" FETCH IN c INTO :dbname; done END; eval 'for i in '"$dblist"'; do eval "DROP DATABASE \"$i\";"; done' disconnect all;
Wenn wir am 1. März alle Dateibasen von den Benutzer von GROUPXX aufheben möchten, dann geben wir CRON der Zeilen in die Tabelle (der Order cron -e) (ich setze voraus, dass ein Skript in der Datei 'dropdbs.psh' abgelegt ist.):
0 0 1 3 * dropdbs.psh group%
Man kann Pgbash als wrapper (der Packer) den plpgsql Prozeduren benutzen - Skript des PgBash kann man als einfaches Interface benutzen, das die Parametern zur gelagerten Prozedur gibt.
#!/usr/local/bin/pgbash connect to template1 SELECT drop_students_databases($1) INTO :zd; if [ $SQLCODE = $SQL_OK ]; then echo "Es wurde $zd Dateibasen gelöscht" fi disconnect all
In PgBash kann man auch einfache CGI-Skript machen - in PgBash ist die Mode für CGI, wann der Output in der HTML Tabelle formatiert ist.
#!/usr/local/bin/pgbash connect to testdb011; echo "Content-type: text/html" echo "" set EXEC_SQL_OPTION CGI; echo "<HTML>" echo "<BODY>" SELECT * FROM Namen WHERE Name LIKE 'S%'; echo "</BODY>" echo "</HTML>" disconnect all;
Man kann Pgbash als wrapper (der Packer) den SQL-Order benutzen - man kann die Programmschnittstelle für beliebige SQL-Order schreiben (sieh Beispiel am Anfang des Text). PgBash leider kann nicht die Einstellung der Formatierung von Spalten und Tabellen (so, wie es zb. in SQL*Plus in RDBMS Oracle ist), und so kann man PgBash inzwischen für die Listenerstellung (parametrieren die Order SELECT) nicht benutzen.
PgBash bietet nicht so viel editierungs Komfort (hat nicht so viel Bedienungsfreundlichkeit) wie psql an. Aber man kann es dort benutzen, wo die Fähigkeiten von PSQL inzwischen ungenügend sind. PgBash bietet parametrisation der SQL-Ordern und primäre Programmkonstruktion (if, while, for) an. Bevor PSQL diese Möglichkeiten können wird, hat PgBash seinen Platz an der Sonne und für alle, die täglich PostgreSQL benutzen, ist es unersetzlicher Helfer.