Skip site navigation (1) Skip section navigation (2)

Re: Trigger für DDL Änderungen

From: Tim Landscheidt <tim(at)tim-landscheidt(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Trigger für DDL Änderungen
Date: 2008-04-02 20:11:04
Message-ID: m3d4p8m2zr.fsf@lockfix.tim-landscheidt.de (view raw or flat)
Thread:
Lists: pgsql-de-allgemein
"Robert Müller" <muellerrobert(at)gmail(dot)com> wrote:

(Ich gehe einmal davon aus, dass Deine Mail an die Liste ge-
hen sollte.)

>>  > Nachdem ich Siebkopf zum wiederholten Mal vergessen habe,
>>  > DDL-Änderungen, die ich direkt in der Datenbank per psql vorgenommen
>>  > habe, in mein Versionskontrollsystem einzuchecken, kam mir folgende
>>  > Idee: Es müsste doch mögliche sein, mit derartige Änderungen in der
>>  > Datenbank irgendwie per Trigger abzufangen und im Trigger ein z.B.
>>  > plsh Script abzuschiessen, was mir dann per Mail oder ähnlichem einen
>>  > Erinnerungsnackenschlag gibt.

>>  > Gibt es derartige Mechanismen schon und wenn nicht, wo sollte ich da
>>  > ansetzen. Oder ist das eh eine blöde Idee von mir und es gibt andere,
>>  > bessere "best practices" um mein Siebkopf zu entlasten?

>> Cronjob aufsetzen, der regelmäßig mit pg_dump oder ähnlichem
>>  das Schema/die Daten in eine neue Datei gießt und diese
>>  dann:

>>  a) in Deinem Versionskontrollsystem kommittiert oder
>>  b) Dir das diff gegenüber dem aktuellen Stand in Deinem Ver-
>>    sionskontrollsystem mailt.

> Ja, daran habe ich auch schon gedacht und auch damit rumgespielt, ich
> habe allerdings zum Bleistift meine einzelnen SPs in jeweils eigenen
> Files und ich habe noch keinen /einfachen/ Weg gefunden, diese auch
> einzeln als Files aus der DB zu extrahieren ... Naja auf jeden Fall
> werde ich auch in dieser Richtung mal ein wenig weiterbasteln. psql
> mit \df+ und Konsorten sollten mir da weiterhelfen.

Ich empfehle in solchen Fällen Perl :-). Man nehme den kom-
pletten Dump, und solange "CREATE FUNCTION" vorhanden ist,
verschiebe man die Definition in eine eigene Datei und er-
setze sie wahlweise durch nichts oder "\i funktion.sql".
Fertig.

  Schwierig finde ich eigentlich nur, dass PostgreSQL bei
Views sehr verschwenderisch mit expliziten Casts umgeht.
Selbst NULLs bekommen den Datentyp der Zielspalte verpasst.
Eine View, die aus meiner Adressdatenbank die Straßenangaben
in Straße und Hausnummer trennt, wird dadurch zu:

|        Sicht »public.splittedaddresses«
|   Spalte  |          Typ          | Attribute
| ----------+-----------------------+-----------
|  street   | text                  |
|  number   | integer               |
|  postcode | character varying(10) |
|  city     | character varying(50) |
| Sichtdefinition:
|  SELECT
|         CASE
|             WHEN addresses.street::text ~ ' [0-9]+ - [0-9]+$'::text THEN "substring"(addresses.street::text, 1, rindex("substring"(addresses.street::text, 1, "position"(addresses.street::text, ' - '::text) - 1)::character varying, ' '::character varying) - 1)
|             WHEN addresses.street::text ~ ' [0-9]+[a-z]?$'::text THEN "substring"(addresses.street::text, 1, rindex(addresses.street, ' '::character varying) - 1)
|             ELSE NULL::text
|         END AS street,
|         CASE
|             WHEN addresses.street::text ~ ' [0-9]+ - [0-9]+$'::text THEN int4("substring"(addresses.street::text, rindex("substring"(addresses.street::text, 1, "position"(addresses.street::text, ' - '::text) - 1)::character varying, ' '::character varying) + 1, "position"(addresses.street::text, ' - '::text) - rindex("substring"(addresses.street::text, 1, "position"(addresses.street::text, ' - '::text) - 1)::character varying, ' '::character varying) - 1))
|             WHEN addresses.street::text ~ ' [0-9]+$'::text THEN int4("substring"(addresses.street::text, rindex(addresses.street, ' '::character varying) + 1))
|             WHEN addresses.street::text ~ ' [0-9]+[a-z]$'::text THEN int4("substring"(addresses.street::text, rindex(addresses.street, ' '::character varying) + 1, length(addresses.street::text) - rindex(addresses.street, ' '::character varying) - 1))
|             ELSE NULL::integer
|         END AS number, addresses.postcode, addresses.city
|    FROM addresses
|   WHERE addresses.country = 'DE'::bpchar AND addresses.street::text !~ '^Postfach [0-9]+$'::text AND text(date('now'::text)) ~ addresses."valid"::text;

Kennt jemand Methoden, solche Ungeheuer automatisch zu ent-
wirren?

Tim

In response to

Responses

pgsql-de-allgemein by date

Next:From: Robert MüllerDate: 2008-04-02 20:26:38
Subject: Re: Trigger für DDL Änderungen
Previous:From: Robert MüllerDate: 2008-04-02 20:10:01
Subject: Re: Trigger für DDL Änderungen

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group