<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Frank Seitz' Developer Logbuch - PostgreSQL</title>
    <link>http://fseitz.de/blog/</link>
    <description>Notizen aus der Welt der Web-, Datenbank- und Unix-Programmierung</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 1.5.1 - http://www.s9y.org/</generator>
    <pubDate>Wed, 27 Jan 2010 09:20:15 GMT</pubDate>

    <image>
        <url>http://fseitz.de/blog/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Frank Seitz' Developer Logbuch - PostgreSQL - Notizen aus der Welt der Web-, Datenbank- und Unix-Programmierung</title>
        <link>http://fseitz.de/blog/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>PostgreSQL: TIMESTAMP nach EPOCH wandeln und zurück</title>
    <link>http://fseitz.de/blog/index.php?/archives/19-PostgreSQL-TIMESTAMP-nach-EPOCH-wandeln-und-zurueck.html</link>
            <category>PostgreSQL</category>
    
    <comments>http://fseitz.de/blog/index.php?/archives/19-PostgreSQL-TIMESTAMP-nach-EPOCH-wandeln-und-zurueck.html#comments</comments>
    <wfw:comment>http://fseitz.de/blog/wfwcomment.php?cid=19</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://fseitz.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=19</wfw:commentRss>
    

    <author>nospam@example.com (Frank Seitz)</author>
    <content:encoded>
    &lt;h4 class=&quot;s-h4&quot;&gt;TIMESTAMP WITHOUT TIME ZONE nach EPOCH&lt;/h4&gt;

&lt;p&gt;
Umwandlung eines &lt;code&gt;TIMESTAMP WITHOUT TIME ZONE&lt;/code&gt;
in Unix-Epoch (Sekunden seit 1.1.1970 0 Uhr) in einer Anwendung, die mit
UTC-Zeiten arbeitet:
&lt;/p&gt;

&lt;pre class=&quot;s-pre-box&quot;&gt;
sql&gt; SELECT EXTRACT(EPOCH FROM TIMESTAMP &#039;1970-01-01 00:00:00&#039; AT TIME ZONE &#039;UTC&#039;) AS t;
 t 
---
 0
&lt;/pre&gt;

&lt;p&gt;
Entscheidend ist hier der Zusatz &quot;&lt;code&gt;AT TIME ZONE &#039;UTC&#039;&lt;/code&gt;&quot;, denn ein
&lt;code&gt;TIMESTAMP WITHOUT TIME ZONE&lt;/code&gt; wird als Zeit der &lt;i&gt;lokalen&lt;/i&gt; Zeitzone
interpretiert - nicht etwa UTC! Ohne den Zusatz ist das Resultat um dem Offset der
lokalen Zeitzone verschoben - böse Falle. Hier das Ergebnis im Falle von MEZ (+0100):
&lt;/p&gt;

&lt;pre class=&quot;s-pre-box&quot;&gt;
sql&gt; SELECT EXTRACT(EPOCH FROM TIMESTAMP &#039;1970-01-01 00:00:00&#039;) AS t;
   t   
-------
 -3600
&lt;/pre&gt;

&lt;h4 class=&quot;s-h4&quot;&gt;Erläuterungen&lt;/h4&gt;

&lt;ul class=&quot;s-ul&quot;&gt;
  &lt;li&gt;&lt;code&gt;EXTRACT(EPOCH FROM &lt;i&gt;t&lt;/i&gt;)&lt;/code&gt; extrahiert die Epoch-Sekunden
    vom Zeit-Wert &lt;code&gt;&lt;i&gt;t&lt;/i&gt;&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;TIMESTAMP &#039;1970-01-01 00:00:00&#039;&lt;/code&gt; ist die Zeitangabe
    &lt;code&gt;&lt;i&gt;t&lt;/i&gt;&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;AT TIME ZONE &#039;UTC&#039;&lt;/code&gt; interpretiert die Zeitangabe
    &lt;code&gt;&lt;i&gt;t&lt;/i&gt;&lt;/code&gt; hinsichtlich Zeitzone UTC.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 class=&quot;s-h4&quot;&gt;EPOCH nach TIMESTAMP WITHOUT TIMEZONE&lt;/h4&gt;

&lt;p&gt;
Umwandlung von Epoch-Sekunden in einen &lt;code&gt;TIMESTAMP WITHOUT TIMEZONE&lt;/code&gt;
(die&lt;code&gt;0&lt;/code&gt; steht für den Epoch-Wert):
&lt;/p&gt;

&lt;pre class=&quot;s-pre-box&quot;&gt;
sql&gt; gkss=# SELECT TIMESTAMP &#039;epoch&#039; + 0 * INTERVAL &#039;1 second&#039; AS t;
         t    
---------------------
 1970-01-01 00:00:00
&lt;/pre&gt;

&lt;h4 class=&quot;s-h4&quot;&gt;Erläuterungen&lt;/h4&gt;

&lt;ul class=&quot;s-ul&quot;&gt;
  &lt;li&gt;&lt;code&gt;TIMESTAMP &#039;epoch&#039;&lt;/code&gt; bzeichnet den Anfang der Zeitrechnung (1.1.1970 0 Uhr).&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;0 * INTERVAL &#039;1 second&#039;&lt;/code&gt; ist der Zeitoffset in Sekunden, der hinzuaddiert wird.
    Er kann auch negativ sein.&lt;/li&gt;
  &lt;li&gt;Das Resultat ist ein Timestamp.&lt;/li&gt;
&lt;/ul&gt;
 
    </content:encoded>

    <pubDate>Fri, 22 Jan 2010 16:49:32 +0100</pubDate>
    <guid isPermaLink="false">http://fseitz.de/blog/index.php?/archives/19-guid.html</guid>
    
</item>
<item>
    <title>Grundlegende PostgreSQL-Administration</title>
    <link>http://fseitz.de/blog/index.php?/archives/6-Grundlegende-PostgreSQL-Administration.html</link>
            <category>PostgreSQL</category>
    
    <comments>http://fseitz.de/blog/index.php?/archives/6-Grundlegende-PostgreSQL-Administration.html#comments</comments>
    <wfw:comment>http://fseitz.de/blog/wfwcomment.php?cid=6</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://fseitz.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=6</wfw:commentRss>
    

    <author>nospam@example.com (Frank Seitz)</author>
    <content:encoded>
    &lt;p class=&quot;sdoc-para-p&quot;&gt;
  PostgreSQL ist meiner Meinung nach das beste frei erhältliche
  Relationale Datenbanksystem.  Hier die wichtigsten Kommandos, um damit
  an den Start gehen zu können.
&lt;/p&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;PostgreSQL RDBMS installieren (Debian)&lt;/h1&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;# apt-get install postgresql&lt;/pre&gt;
&lt;/div&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Zum DB-Admin machen&lt;/h1&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;# su - postgres&lt;/pre&gt;
&lt;/div&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Nur von diesem Unix-Account aus kann nach der Installation eine
  Connection zum DBMS aufgebaut werden.
&lt;/p&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Liste der existierenden Datenbanken&lt;/h1&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;$ psql -l&amp;#10;[Liste]&lt;/pre&gt;
&lt;/div&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Nach der Installation existiert zunächst nur die Datenbank
  &lt;tt class=&quot;sdoc-seg-c&quot;&gt;postgres&lt;/tt&gt;.
&lt;/p&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Datenbank erzeugen/zerstören&lt;/h1&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;$ createdb DB&amp;#10;...&amp;#10;$ dropdb DB&amp;lt;/pre&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Liste der existierenden Benutzer&lt;/h1&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;$ psql&amp;#10;postgres=# \du&lt;/pre&gt;
&lt;/div&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  oder
&lt;/p&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;postgres=# SELECT rolname FROM pg_roles;&lt;/pre&gt;
&lt;/div&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Benutzer anlegen/entfernen&lt;/h1&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;$ createuser USER&amp;#10;Shall the new role be a superuser? (y/n) y&amp;#10;...&amp;#10;$ dropuser USER&lt;/pre&gt;
&lt;/div&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Benutzer sind global für alle Datenbanken einer Installation.
  Zunächst existiert nur der Benutzer &lt;tt class=&quot;sdoc-seg-c&quot;&gt;postgres&lt;/tt&gt;. Soll der User
  &lt;tt class=&quot;sdoc-seg-c&quot;&gt;USER&lt;/tt&gt; von einem anderen Account als dem entsprechenden
  Unix-Account connecten können, muss ein Passwort vergeben
  werden. Option &lt;tt class=&quot;sdoc-seg-c&quot;&gt;-P&lt;/tt&gt;.
&lt;/p&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Datenbankzugriff&lt;/h1&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Ist ein DB-User erzeugt, kann dieser vom gleichnamigen Unix-Account
  oder per Passwort, falls eins vergeben wurde, von einem anderen
  Account per &lt;tt class=&quot;sdoc-seg-c&quot;&gt;psql&lt;/tt&gt; auf die Datenbank zugreifen.
&lt;/p&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;USER$ psql DB&amp;#10;Welcome to psql 8.3.6, the PostgreSQL interactive terminal.&amp;#10;...&amp;#10;DB=#&lt;/pre&gt;
&lt;/div&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Liste der existierenden Objekte&lt;/h1&gt;
&lt;table class=&quot;sdoc-keyval-table&quot;&gt;
&lt;tr class=&quot;sdoc-keyval-tr&quot;&gt;
  &lt;td class=&quot;sdoc-keyval-td-key&quot;&gt;Tabellen:&lt;/td&gt;
  &lt;td class=&quot;sdoc-keyval-td-value&quot;&gt;&lt;tt class=&quot;sdoc-seg-c&quot;&gt;\dt&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;sdoc-keyval-tr&quot;&gt;
  &lt;td class=&quot;sdoc-keyval-td-key&quot;&gt;Sequenzen:&lt;/td&gt;
  &lt;td class=&quot;sdoc-keyval-td-value&quot;&gt;&lt;tt class=&quot;sdoc-seg-c&quot;&gt;\ds&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;sdoc-keyval-tr&quot;&gt;
  &lt;td class=&quot;sdoc-keyval-td-key&quot;&gt;Views:&lt;/td&gt;
  &lt;td class=&quot;sdoc-keyval-td-value&quot;&gt;&lt;tt class=&quot;sdoc-seg-c&quot;&gt;\dv&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Exportieren/Importieren&lt;/h1&gt;
&lt;table class=&quot;sdoc-keyval-table&quot;&gt;
&lt;tr class=&quot;sdoc-keyval-tr&quot;&gt;
  &lt;td class=&quot;sdoc-keyval-td-key&quot;&gt;Alle Datenbanken:&lt;/td&gt;
  &lt;td class=&quot;sdoc-keyval-td-value&quot;&gt;&lt;tt class=&quot;sdoc-seg-c&quot;&gt;pg_dumpall &amp;gt;FILE&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;sdoc-keyval-tr&quot;&gt;
  &lt;td class=&quot;sdoc-keyval-td-key&quot;&gt;Eine Datenbank:&lt;/td&gt;
  &lt;td class=&quot;sdoc-keyval-td-value&quot;&gt;&lt;tt class=&quot;sdoc-seg-c&quot;&gt;pg_dump DB &amp;gt;FILE&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;sdoc-keyval-tr&quot;&gt;
  &lt;td class=&quot;sdoc-keyval-td-key&quot;&gt;Importieren:&lt;/td&gt;
  &lt;td class=&quot;sdoc-keyval-td-value&quot;&gt;&lt;tt class=&quot;sdoc-seg-c&quot;&gt;psql -f FILE DB&lt;/tt&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Session-Einstellungen&lt;/h1&gt;
&lt;h2 class=&quot;sdoc-sec-h2&quot;&gt;Datumsformat&lt;/h2&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Datumsangaben im Format YYYY-MM-DD
&lt;/p&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;SET datestyle TO iso, ymd&amp;#10;select localtimestamp(0);&lt;/pre&gt;
&lt;/div&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  liefert die Zeit im Format:
&lt;/p&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;2009-03-12 17:38:20&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 class=&quot;sdoc-sec-h2&quot;&gt;Zeichensatz&lt;/h2&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Client arbeitet mit ISO-8859-1:
&lt;/p&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;SET client_encoding TO iso88591&lt;/pre&gt;
&lt;/div&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Client arbeitet mit UTF-8:
&lt;/p&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;SET client_encoding TO utf8&lt;/pre&gt;
&lt;/div&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Siehe: &lt;a class=&quot;sdoc-seg-u&quot; href=&quot;http://www.postgresql.org/docs/8.3/static/multibyte.html#AEN27449&quot;&gt;http://www.postgresql.org/docs/8.3/static/multibyte.html#AEN27449&lt;/a&gt;
&lt;/p&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Der clientseitige Zeichensatz kann jederzeit umgeschaltet werden.
  Wenn Daten mit unterschiedlichem Encoding verarbeitet werden,
  besteht die Möglichkeit, vor dem Schreiben auf die Datenbank das
  clientseitige Encoding umzuschalten. Die Konvertierung wird dann
  vom Server übernommen.
&lt;/p&gt;
&lt;h2 class=&quot;sdoc-sec-h2&quot;&gt;\-Escapes in Stringliteralen verbieten&lt;/h2&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;SET standard_conforming_strings TO on&lt;/pre&gt;
&lt;/div&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Server-Zugriff von externen Hosts&lt;/h1&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Die folgenden Einträge ermöglichen den Zugriff von allen
  Hosts für alle User und alle Datenbanken.
&lt;/p&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  In &lt;tt class=&quot;sdoc-seg-c&quot;&gt;pg_hba.conf&lt;/tt&gt; oberhalb der anderen Einträge hinzufügen:
&lt;/p&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;# TYPE  DATABASE  USER  CIDR-ADDRESS  METHOD&amp;#10;host    all       all   0.0.0.0/0     md5&lt;/pre&gt;
&lt;/div&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  In &lt;tt class=&quot;sdoc-seg-c&quot;&gt;postgresql.conf&lt;/tt&gt; eintragen:
&lt;/p&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;listen_addresses = &#039;*&#039;&lt;/pre&gt;
&lt;/div&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Server neu starten&lt;/h1&gt;
&lt;div class=&quot;sdoc-code-div&quot;&gt;
  &lt;pre class=&quot;sdoc-code-pre&quot;&gt;# /etc/init.d/postgresql-X.Y restart&lt;/pre&gt;
&lt;/div&gt;
&lt;h1 class=&quot;sdoc-sec-h1&quot;&gt;Upgrade auf eine neue Version&lt;/h1&gt;
&lt;p class=&quot;sdoc-para-p&quot;&gt;
  Siehe Kapitel &quot;Upgrading&quot; in der Doku.
&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 08 Jan 2010 14:55:00 +0100</pubDate>
    <guid isPermaLink="false">http://fseitz.de/blog/index.php?/archives/6-guid.html</guid>
    
</item>

</channel>
</rss>