PgBash (de)

Z PostgreSQL
Skočit na navigaci Skočit na vyhledávání
Verze k tisku již není podporovaná a může obsahovat chyby s vykreslováním. Aktualizujte si prosím záložky ve svém prohlížeči a použijte prosím zabudovanou funkci prohlížeče pro tisknutí.

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.