<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="http://wiki.redatek.de/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="http://wiki.redatek.de/feed.php">
        <title>dynaDAT | UNIXoni | REDATEK | ITVeteran </title>
        <description></description>
        <link>http://wiki.redatek.de/</link>
        <image rdf:resource="http://wiki.redatek.de/_media/logo.png" />
       <dc:date>2026-07-29T08:26:40+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="http://wiki.redatek.de/informix:leap_16_informix_konfig?rev=1776538553&amp;do=diff"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/wiki:xfs_error_kernel?rev=1754321018&amp;do=diff"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/postgres:statistik_und_audit?rev=1752845584&amp;do=diff"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/informix:informix_fdw?rev=1750425550&amp;do=diff"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/wiki:informix_rowid?rev=1750163005&amp;do=diff"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/wiki:dokuwiki?rev=1749392224&amp;do=diff"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/mail:ham_spam_sa-learn?rev=1749385737&amp;do=diff"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/wiki:letsencrypt_webpath_docker_renew?rev=1748792843&amp;do=diff"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/mail:neuer_user_domain?rev=1747999412&amp;do=diff"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/?image=wiki%3Aenterpriselogorahmen2.png&amp;ns=wiki&amp;rev=1725089735&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/?image=favicon.ico&amp;ns=0&amp;rev=1725087021&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/?image=logo.png&amp;ns=0&amp;rev=1725087021&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/?image=wiki%3Avt52.jpg&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/?image=wiki%3Agfud.png&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/?image=wiki%3Abanner.png&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/?image=wiki%3Aitveteran.png&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/?image=wiki%3Abdrthomas-336x400-1.jpg&amp;ns=wiki&amp;rev=1724247278&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/?image=ksnip_20240821-144545.png&amp;ns=0&amp;rev=1724245125&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
                <rdf:li rdf:resource="http://wiki.redatek.de/?image=ksnip_20240821-144826.png&amp;ns=0&amp;rev=1724245092&amp;tab_details=history&amp;media_do=diff&amp;do=media"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="http://wiki.redatek.de/_media/logo.png">
        <title>dynaDAT | UNIXoni | REDATEK | ITVeteran </title>
        <link>http://wiki.redatek.de/</link>
        <url>http://wiki.redatek.de/_media/logo.png</url>
    </image>
    <item rdf:about="http://wiki.redatek.de/informix:leap_16_informix_konfig?rev=1776538553&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-04-18T18:55:53+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>leap_16_informix_konfig</title>
        <link>http://wiki.redatek.de/informix:leap_16_informix_konfig?rev=1776538553&amp;do=diff</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;informix_unter_opensuse_leap_160fehlende_etc_services_und_etc_hostsequiv&quot;&gt;Informix unter openSUSE Leap 16.0: fehlende /etc/services und /etc/hosts.equiv&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Nach einem Update auf &lt;strong&gt;openSUSE Leap 16.0&lt;/strong&gt; startet ein Informix-Server,
der in der &lt;code&gt;sqlhosts&lt;/code&gt; mit einem &lt;strong&gt;Servicenamen&lt;/strong&gt; konfiguriert ist,
nicht mehr auf dem erwarteten Port. Zusätzlich werden Client-Verbindungen
mit Fehler &lt;strong&gt;-956 „Client host or user is not trusted by the server“&lt;/strong&gt;
abgewiesen, weil &lt;code&gt;/etc/hosts.equiv&lt;/code&gt; fehlt.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Informix unter openSUSE Leap 16.0: fehlende \/etc\/services und \/etc\/hosts.equiv&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;informix_unter_opensuse_leap_160fehlende_etc_services_und_etc_hostsequiv&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-429&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;ursache&quot;&gt;Ursache&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Mit Leap 16.0 hat openSUSE den Weg der Trennung von
&lt;strong&gt;Distribution-Defaults&lt;/strong&gt; (&lt;code&gt;/usr/etc&lt;/code&gt;) und &lt;strong&gt;lokalen Overrides&lt;/strong&gt; (&lt;code&gt;/etc&lt;/code&gt;)
konsequent umgesetzt:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  /etc/services ist nur noch eine **leere Dummy-Datei** und soll
  künftig ganz entfallen. Der eigentliche Inhalt liegt jetzt unter
  /usr/etc/services. Das Paket netkit-rsh / rsh-server ist abgelöst durch
  **OpenSSH**. Dadurch werden die klassischen Trust-Dateien /etc/hosts.equiv und /etc/hosts.lpd **nicht mehr automatisch angelegt**.&lt;/pre&gt;

&lt;p&gt;
Quellen:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://doc.opensuse.org/release-notes/x86_64/openSUSE/Leap/16.0/html/release-notes-leap-160/&quot; class=&quot;urlextern&quot; title=&quot;https://doc.opensuse.org/release-notes/x86_64/openSUSE/Leap/16.0/html/release-notes-leap-160/&quot; rel=&quot;ugc nofollow&quot;&gt;openSUSE Leap 16.0 Release Notes&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://forums.opensuse.org/t/leap-16-etc-services-has-invalid-content-causing-error-servname-not-supported-for-ai-socktype/193001&quot; class=&quot;urlextern&quot; title=&quot;https://forums.opensuse.org/t/leap-16-etc-services-has-invalid-content-causing-error-servname-not-supported-for-ai-socktype/193001&quot; rel=&quot;ugc nofollow&quot;&gt;openSUSE Forum – /etc/services invalid content&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Ursache&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;ursache&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;430-1286&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;auswirkung_auf_informix&quot;&gt;Auswirkung auf Informix&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Auswirkung auf Informix&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;auswirkung_auf_informix&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1287-1323&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;sqlhosts_mit_servicename&quot;&gt;sqlhosts mit Servicename&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Enthält &lt;code&gt;$INFORMIXDIR/etc/sqlhosts&lt;/code&gt; einen Servicenamen statt einer
Portnummer, z. B.:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;ol_azur   onsoctcp   azur.local   sqlexec&lt;/pre&gt;

&lt;p&gt;
… dann löst Informix über &lt;code&gt;getservbyname()&lt;/code&gt; gegen &lt;code&gt;/etc/services&lt;/code&gt; auf.
Unter Leap 16.0 ist diese Datei leer, der Start schlägt mit Meldungen wie
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;listener-thread: err = -25595: oserr = 0: errstr = ...: Service not found&lt;/pre&gt;

&lt;p&gt;
fehl bzw. der Server bindet nicht auf dem erwarteten Port.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;sqlhosts mit Servicename&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;sqlhosts_mit_servicename&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1324-1812&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit5&quot; id=&quot;trusted-host-authentifizierung&quot;&gt;Trusted-Host-Authentifizierung&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Informix prüft eingehende Verbindungen standardmäßig gegen eine
Trusted-Hosts-Datei:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; entweder &lt;code&gt;/etc/hosts.equiv&lt;/code&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; oder die in &lt;code&gt;onconfig&lt;/code&gt; über &lt;strong&gt;&lt;code&gt;REMOTE_SERVER_CFG&lt;/code&gt;&lt;/strong&gt; konfigurierte Datei&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; sowie &lt;code&gt;~/.rhosts&lt;/code&gt; des Zielusers&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Fehlt &lt;code&gt;/etc/hosts.equiv&lt;/code&gt; komplett, meldet der Client:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;-908  Attempt to connect to database server (...) failed.
-956  Client host or user (...) is not trusted by the server.&lt;/pre&gt;

&lt;p&gt;
Siehe: &lt;a href=&quot;https://www.ibm.com/docs/en/informix-servers/12.10.0?topic=files-trusted-host-information&quot; class=&quot;urlextern&quot; title=&quot;https://www.ibm.com/docs/en/informix-servers/12.10.0?topic=files-trusted-host-information&quot; rel=&quot;ugc nofollow&quot;&gt;IBM Docs – Trusted-host information&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Trusted-Host-Authentifizierung&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;trusted-host-authentifizierung&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;1813-2430&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;loesungen&quot;&gt;Lösungen&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;L\u00f6sungen&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;loesungen&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;2431-2453&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit7&quot; id=&quot;aportnummer_direkt_in_sqlhosts&quot;&gt;A: Portnummer direkt in sqlhosts&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Am robustesten: den Servicenamen durch die numerische Portnummer ersetzen.
Damit entfällt die Abhängigkeit von &lt;code&gt;/etc/services&lt;/code&gt; vollständig.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;ol_azur   onsoctcp   azur.local   9088&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;A: Portnummer direkt in sqlhosts&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aportnummer_direkt_in_sqlhosts&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;2454-2698&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit8&quot; id=&quot;variante_betc_services_wiederherstellen&quot;&gt;Variante B: /etc/services wiederherstellen&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Eintrag für Informix manuell ergänzen (auf &lt;strong&gt;Server&lt;/strong&gt; und &lt;strong&gt;Client&lt;/strong&gt;):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sqlexec       9088/tcp
sqlexec-ssl   9089/tcp&lt;/pre&gt;

&lt;p&gt;
Wahlweise als Override in &lt;code&gt;/etc/services&lt;/code&gt; (wird gegenüber
&lt;code&gt;/usr/etc/services&lt;/code&gt; vorgezogen) oder als Drop-in.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; IANA-konforme Ports: &lt;code&gt;9088/tcp&lt;/code&gt; (&lt;code&gt;sqlexec&lt;/code&gt;), &lt;code&gt;9089/tcp&lt;/code&gt; (&lt;code&gt;sqlexec-ssl&lt;/code&gt;).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Siehe: &lt;a href=&quot;https://www.ibm.com/docs/SSGU8G_14.1.0/com.ibm.admin.doc/ids_admin_0159.htm&quot; class=&quot;urlextern&quot; title=&quot;https://www.ibm.com/docs/SSGU8G_14.1.0/com.ibm.admin.doc/ids_admin_0159.htm&quot; rel=&quot;ugc nofollow&quot;&gt;IANA standard service names in sqlhosts.std&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Variante B: \/etc\/services wiederherstellen&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;variante_betc_services_wiederherstellen&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;2699-3223&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit9&quot; id=&quot;hostsequiv_wiederherstellen&quot;&gt;hosts.equiv wiederherstellen&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Datei &lt;code&gt;/etc/hosts.equiv&lt;/code&gt; mit den vertrauenswürdigen Hosts neu anlegen:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# hostname        user
client1.local     informix
client1           informix
10.0.0.15         informix&lt;/pre&gt;

&lt;p&gt;
Zwingende Voraussetzungen (laut IBM Docs):
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Besitzer: &lt;code&gt;informix:informix&lt;/code&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Rechte: &lt;code&gt;0644&lt;/code&gt;, &lt;code&gt;0640&lt;/code&gt;, &lt;code&gt;0444&lt;/code&gt; oder &lt;code&gt;0440&lt;/code&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Sowohl &lt;strong&gt;Kurzname&lt;/strong&gt; als auch &lt;strong&gt;FQDN&lt;/strong&gt; eintragen, um &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-Probleme zu vermeiden.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;touch&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;hosts.equiv
&lt;span class=&quot;kw2&quot;&gt;chown&lt;/span&gt; informix:informix &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;hosts.equiv
&lt;span class=&quot;kw2&quot;&gt;chmod&lt;/span&gt; 0644 &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;hosts.equiv&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;hosts.equiv wiederherstellen&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;hostsequiv_wiederherstellen&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;3224-3789&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit10&quot; id=&quot;variante_empfohlenremote_server_cfg_nutzen&quot;&gt;Variante empfohlen: REMOTE_SERVER_CFG nutzen&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Seit Informix 11.70 kann die Trusted-Hosts-Datei über die &lt;code&gt;onconfig&lt;/code&gt;
umgelenkt werden – damit ist kein Root-Zugriff auf &lt;code&gt;/etc/hosts.equiv&lt;/code&gt;
nötig und das Problem ist zukunftssicher gelöst:
&lt;/p&gt;

&lt;p&gt;
In &lt;code&gt;$INFORMIXDIR/etc/onconfig&lt;/code&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;REMOTE_SERVER_CFG  trusted_hosts.cfg&lt;/pre&gt;

&lt;p&gt;
Dann Datei &lt;code&gt;$INFORMIXDIR/etc/trusted_hosts.cfg&lt;/code&gt; mit den erlaubten
Hosts füllen. Änderungen lassen sich im laufenden Betrieb übernehmen:
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;onmode &lt;span class=&quot;re5&quot;&gt;-wf&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;REMOTE_SERVER_CFG&lt;/span&gt;=trusted_hosts.cfg&lt;/pre&gt;

&lt;p&gt;
Quelle: &lt;a href=&quot;https://www.xtivia.com/blog/ibm-informix-trusted-client-connections/&quot; class=&quot;urlextern&quot; title=&quot;https://www.xtivia.com/blog/ibm-informix-trusted-client-connections/&quot; rel=&quot;ugc nofollow&quot;&gt;XTIVIA – Informix Trusted Client Connections&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Variante empfohlen: REMOTE_SERVER_CFG nutzen&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;variante_empfohlenremote_server_cfg_nutzen&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;3790-4470&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit11&quot; id=&quot;pruefbefehle&quot;&gt;Prüfbefehle&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;# Existiert /etc/services und hat es Inhalt?&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;services &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;usr&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;services
&lt;span class=&quot;kw2&quot;&gt;getent&lt;/span&gt; services sqlexec
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# Kann Informix den Servicenamen auflösen?&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;su&lt;/span&gt; - informix &lt;span class=&quot;re5&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;getent services sqlexec&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# Trusted-Host-Datei prüfen&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;hosts.equiv &lt;span class=&quot;re1&quot;&gt;$INFORMIXDIR&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;hosts.equiv &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;null
onstat &lt;span class=&quot;re5&quot;&gt;-g&lt;/span&gt; cfg &lt;span class=&quot;sy0&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;grep&lt;/span&gt; REMOTE_SERVER_CFG&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Pr\u00fcfbefehle&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;pruefbefehle&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;4471-4845&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit12&quot; id=&quot;zusammenfassung&quot;&gt;Zusammenfassung&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Leap 16.0 liefert &lt;code&gt;/etc/services&lt;/code&gt; nur noch als Dummy aus – echter&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
    Inhalt liegt in &lt;code&gt;/usr/etc/services&lt;/code&gt;.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;code&gt;/etc/hosts.equiv&lt;/code&gt; fehlt, da &lt;code&gt;rsh&lt;/code&gt; durch OpenSSH ersetzt wurde.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Informix bricht deshalb mit Servicename-basierter &lt;code&gt;sqlhosts&lt;/code&gt; und&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
    bei Trusted-Connections (Fehler -956) nach dem Update.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Schnellste Lösung: &lt;strong&gt;Portnummer direkt&lt;/strong&gt; in &lt;code&gt;sqlhosts&lt;/code&gt; verwenden, &lt;code&gt;/etc/hosts.equiv&lt;/code&gt; wiederherstellen oder auf &lt;code&gt;REMOTE_SERVER_CFG&lt;/code&gt; umstellen.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Zusammenfassung&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;zusammenfassung&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;4846-5347&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit13&quot; id=&quot;weiterfuehrende_quellen&quot;&gt;Weiterführende Quellen&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://doc.opensuse.org/release-notes/x86_64/openSUSE/Leap/16.0/html/release-notes-leap-160/&quot; class=&quot;urlextern&quot; title=&quot;https://doc.opensuse.org/release-notes/x86_64/openSUSE/Leap/16.0/html/release-notes-leap-160/&quot; rel=&quot;ugc nofollow&quot;&gt;openSUSE Leap 16.0 – Release Notes&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.ibm.com/docs/en/informix-servers/12.10.0?topic=communication-sqlhosts-information&quot; class=&quot;urlextern&quot; title=&quot;https://www.ibm.com/docs/en/informix-servers/12.10.0?topic=communication-sqlhosts-information&quot; rel=&quot;ugc nofollow&quot;&gt;IBM Docs – The sqlhosts information&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.ibm.com/docs/en/informix-servers/12.10.0?topic=files-trusted-host-information&quot; class=&quot;urlextern&quot; title=&quot;https://www.ibm.com/docs/en/informix-servers/12.10.0?topic=files-trusted-host-information&quot; rel=&quot;ugc nofollow&quot;&gt;IBM Docs – Trusted-host information&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.ibm.com/docs/SSGU8G_14.1.0/com.ibm.admin.doc/ids_admin_0159.htm&quot; class=&quot;urlextern&quot; title=&quot;https://www.ibm.com/docs/SSGU8G_14.1.0/com.ibm.admin.doc/ids_admin_0159.htm&quot; rel=&quot;ugc nofollow&quot;&gt;IBM Docs – IANA standard service names in sqlhosts.std&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.xtivia.com/blog/ibm-informix-trusted-client-connections/&quot; class=&quot;urlextern&quot; title=&quot;https://www.xtivia.com/blog/ibm-informix-trusted-client-connections/&quot; rel=&quot;ugc nofollow&quot;&gt;XTIVIA – IBM Informix Trusted Client Connections&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://stackoverflow.com/questions/62197785/connect-to-informix-without-an-entry-in-etc-services-matching-sqlhosts&quot; class=&quot;urlextern&quot; title=&quot;https://stackoverflow.com/questions/62197785/connect-to-informix-without-an-entry-in-etc-services-matching-sqlhosts&quot; rel=&quot;ugc nofollow&quot;&gt;Stack Overflow – Connect to Informix without /etc/services&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Weiterf\u00fchrende Quellen&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;weiterfuehrende_quellen&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:13,&amp;quot;range&amp;quot;:&amp;quot;5348-6254&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit14&quot; id=&quot;stichworte&quot;&gt;Stichworte&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;em&gt;Informix, openSUSE Leap 16, sqlhosts, /etc/services, hosts.equiv, REMOTE_SERVER_CFG, Fehler -956, Trusted Host&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Stichworte&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;stichworte&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:14,&amp;quot;range&amp;quot;:&amp;quot;6255-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/wiki:xfs_error_kernel?rev=1754321018&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-08-04T15:23:38+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>xfs_error_kernel</title>
        <link>http://wiki.redatek.de/wiki:xfs_error_kernel?rev=1754321018&amp;do=diff</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;xfs_fehler_nach_kernel-update&quot;&gt;XFS Fehler nach Kernel-Update&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;

&lt;h4 id=&quot;fehlerbeschreibung&quot;&gt;Fehlerbeschreibung&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Nach einem Update auf folgenden Kernel:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Linux 4.18.0-553.58.1.el8_10.x86_64&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
trat beim Booten bzw. Mounten des XFS-Dateisystems folgender Fehler auf:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; `kernel: XFS (dm-0): Corruption detected. Unmount and run xfs_repair`&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; `kernel: XFS (dm-0): Internal error i != 1 at line 481 of file fs/xfs/libxfs/xfs_alloc.c. Caller xfs_alloc_fixup_trees+0x198/0x3b0 [xfs]`&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h4 id=&quot;aenderungen_an_kernel-konfiguration&quot;&gt;Änderungen an Kernel-Konfiguration&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
In der Datei `config-4.18.0-553.58.1.el8_10.x86_64` wurden folgende Optionen aktiviert:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; CONFIG_XFS_FS=y&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; CONFIG_XFS_QUOTA=y&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; CONFIG_XFS_POSIX_&lt;abbr title=&quot;Access Control List&quot;&gt;ACL&lt;/abbr&gt;=y&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; CONFIG_XFS_RT=y&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; CONFIG_XFS_ONLINE_SCRUB=y&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h4 id=&quot;analyse_hintergrundwissen&quot;&gt;Analyse &amp;amp; Hintergrundwissen&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Fehlerursache&lt;/strong&gt;: Der Fehler `i != 1` in `xfs_alloc.c` deutet auf eine Inkonsistenz in den freien Speicherbaumstrukturen des Dateisystems hin. Dies kann durch eine beschädigte Metastruktur oder durch eine fehlerhafte Kernel-Implementierung ausgelöst werden.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;xfs_repair&lt;/strong&gt;: Das Tool `xfs_repair` sollte verwendet werden, um die Dateisystemstruktur zu prüfen und zu reparieren. Wichtig: Das Dateisystem muss vorher &lt;strong&gt;ausgehängt&lt;/strong&gt; werden.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;CONFIG_XFS_RT&lt;/strong&gt;: Aktiviert Unterstützung für „Real-Time Subvolumes“, eine selten genutzte Funktion. Falls nicht benötigt, kann sie deaktiviert werden, um Komplexität zu reduzieren.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;CONFIG_XFS_ONLINE_SCRUB&lt;/strong&gt;: Ermöglicht die Online-Prüfung von Dateisystemstrukturen. Diese Funktion ist experimentell und kann bei bestimmten Kernel-Versionen instabil sein.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Kernel-Kompatibilität&lt;/strong&gt;: Änderungen an XFS-bezogenen Optionen können zu Inkompatibilitäten mit bestehenden Dateisystemen führen, insbesondere wenn das Dateisystem mit einem älteren Kernel erstellt wurde.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h4 id=&quot;empfehlung&quot;&gt;Empfehlung&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; System im &lt;strong&gt;Rescue-Modus&lt;/strong&gt; starten.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; betroffene Partition &lt;strong&gt;aushängen&lt;/strong&gt; (`umount /dev/dm-0`)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; `xfs_repair /dev/dm-0` ausführen.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Bei wiederholtem Auftreten: Kernel-Konfiguration prüfen, insbesondere experimentelle Optionen wie `CONFIG_XFS_RT` und `CONFIG_XFS_ONLINE_SCRUB`.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Backup wichtiger Daten vor weiteren Tests!&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
In meinem konkreten Fall war das root Filesystem betroffen &lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt; und ich bin das Risiko, ohne xfs_repair auf ausgegangenem Device, mit geänderter Konfiguration neu zu starten, eingegangen.  
&lt;/p&gt;

&lt;/div&gt;

&lt;h4 id=&quot;quellen_tools&quot;&gt;Quellen &amp;amp; Tools&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; `man xfs_repair`&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://xfs.org&quot; class=&quot;urlextern&quot; title=&quot;https://xfs.org&quot; rel=&quot;ugc nofollow&quot;&gt;https://xfs.org&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Kernel-Quellcode: `fs/xfs/libxfs/xfs_alloc.c`&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;XFS Fehler nach Kernel-Update&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;xfs_fehler_nach_kernel-update&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-2445&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;stichworte&quot;&gt;Stichworte&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;em&gt;XFS, Kernel, RHEL, EL8, xfs_repair, Filesystem, Korruption, CONFIG_XFS_RT, Rescue&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Stichworte&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;stichworte&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;2446-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/postgres:statistik_und_audit?rev=1752845584&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-07-18T13:33:04+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>statistik_und_audit</title>
        <link>http://wiki.redatek.de/postgres:statistik_und_audit?rev=1752845584&amp;do=diff</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;postgresql_ddl-audit_setup&quot;&gt;PostgreSQL DDL-Audit Setup&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Dieses Setup dokumentiert alle &lt;strong&gt;strukturverändernden Aktionen (DDL)&lt;/strong&gt; in PostgreSQL, wie z. B. &lt;code&gt;CREATE TABLE&lt;/code&gt;, &lt;code&gt;ALTER FUNCTION&lt;/code&gt;, &lt;code&gt;DROP INDEX&lt;/code&gt; usw.  
Die Änderungen werden automatisch in einer zentralen Audit-Tabelle gespeichert und sind über ein Dashboard oder View auswertbar.
&lt;/p&gt;

&lt;p&gt;
&lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt; &lt;strong&gt;Verwandter Artikel:&lt;/strong&gt; Tabellen, Trigger-Funktionen, Event Trigger und &lt;strong&gt;Wartung (DISABLE/ENABLE)&lt;/strong&gt; sind in &lt;a href=&quot;http://wiki.redatek.de/postgres:ddl_logging&quot; class=&quot;wikilink1&quot; title=&quot;postgres:ddl_logging&quot; data-wiki-id=&quot;postgres:ddl_logging&quot;&gt;PostgreSQL DDL Audit Logging&lt;/a&gt; beschrieben (Referenzimplementierung).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;PostgreSQL DDL-Audit Setup&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;postgresql_ddl-audit_setup&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-540&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;ziel&quot;&gt;Ziel&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
* Nachvollziehbare Dokumentation aller DDL-Änderungen
* Speicherung in einer zentralen Tabelle im Schema &lt;code&gt;public&lt;/code&gt;
* Unterstützung für &lt;code&gt;CREATE&lt;/code&gt;, &lt;code&gt;ALTER&lt;/code&gt;, &lt;code&gt;DROP&lt;/code&gt; und verwandte Befehle
* Trennung von Schema und Objektname für bessere Auswertbarkeit
* Minimale Belastung für produktive Systeme
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Ziel&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;ziel&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;541-862&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;komponenten&quot;&gt;Komponenten&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
* &lt;strong&gt;Audit-Tabelle:&lt;/strong&gt; Speicherung der DDL-Ereignisse
* &lt;strong&gt;Event Trigger:&lt;/strong&gt; Reaktion auf DDL-Befehle
* &lt;strong&gt;Trigger-Prozeduren:&lt;/strong&gt; Extrahieren der Metadaten aus Systemfunktionen
* &lt;strong&gt;Optional: pg_stat_statements:&lt;/strong&gt; Ergänzende Erfassung von DDL-Texten
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Komponenten&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;komponenten&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;863-1132&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;schritt_1audit-tabelle_erstellen&quot;&gt;Schritt 1: Audit-Tabelle erstellen&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code sql&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;TABLE&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;ddl_audit_log &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;
id SERIAL &lt;span class=&quot;kw1&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;KEY&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
command_tag TEXT&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;             &lt;span class=&quot;co1&quot;&gt;-- z. B. CREATE TABLE, DROP FUNCTION&lt;/span&gt;
object_type TEXT&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;             &lt;span class=&quot;co1&quot;&gt;-- z. B. TABLE, FUNCTION, INDEX&lt;/span&gt;
schema_name TEXT&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;             &lt;span class=&quot;co1&quot;&gt;-- z. B. public&lt;/span&gt;
object_name TEXT&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;             &lt;span class=&quot;co1&quot;&gt;-- z. B. users&lt;/span&gt;
executed_by TEXT &lt;span class=&quot;kw1&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;CURRENT_USER&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
executed_at &lt;span class=&quot;kw1&quot;&gt;TIMESTAMP&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Schritt 1: Audit-Tabelle erstellen&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;schritt_1audit-tabelle_erstellen&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1133-1577&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;schritt_2prozedur_fuer_create_alter&quot;&gt;Schritt 2: Prozedur für CREATE/ALTER&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code sql&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;OR&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;REPLACE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;FUNCTION&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;log_ddl_command&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;RETURNS&lt;/span&gt; event_trigger
&lt;span class=&quot;kw1&quot;&gt;LANGUAGE&lt;/span&gt; plpgsql
&lt;span class=&quot;kw1&quot;&gt;AS&lt;/span&gt; $$
&lt;span class=&quot;kw1&quot;&gt;DECLARE&lt;/span&gt;
ddl_record RECORD;
&lt;span class=&quot;kw1&quot;&gt;BEGIN&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;FOR&lt;/span&gt; ddl_record &lt;span class=&quot;kw1&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; pg_event_trigger_ddl_commands&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
LOOP
&lt;span class=&quot;kw1&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;INTO&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;ddl_audit_log &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;
command_tag&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
object_type&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
schema_name&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
object_name&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
executed_by
&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;
ddl_record&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;command_tag&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
ddl_record&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;object_type&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
split_part&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;ddl_record&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;object_identity&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;.&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
split_part&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;ddl_record&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;object_identity&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;.&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;CURRENT_USER&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span class=&quot;kw1&quot;&gt;END&lt;/span&gt; LOOP;
&lt;span class=&quot;kw1&quot;&gt;END&lt;/span&gt;;
$$;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Schritt 2: Prozedur f\u00fcr CREATE\/ALTER&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;schritt_2prozedur_fuer_create_alter&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;1578-2136&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;schritt_3event_trigger_fuer_create_alter&quot;&gt;Schritt 3: Event Trigger für CREATE/ALTER&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code sql&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;CREATE&lt;/span&gt; EVENT &lt;span class=&quot;kw1&quot;&gt;TRIGGER&lt;/span&gt; ddl_audit_trigger
&lt;span class=&quot;kw1&quot;&gt;ON&lt;/span&gt; ddl_command_end
&lt;span class=&quot;kw1&quot;&gt;EXECUTE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;FUNCTION&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;log_ddl_command&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Schritt 3: Event Trigger f\u00fcr CREATE\/ALTER&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;schritt_3event_trigger_fuer_create_alter&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;2137-2313&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;schritt_4prozedur_fuer_drop-aktionen&quot;&gt;Schritt 4: Prozedur für DROP-Aktionen&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code sql&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;OR&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;REPLACE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;FUNCTION&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;log_ddl_drop&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;RETURNS&lt;/span&gt; event_trigger
&lt;span class=&quot;kw1&quot;&gt;LANGUAGE&lt;/span&gt; plpgsql
&lt;span class=&quot;kw1&quot;&gt;AS&lt;/span&gt; $$
&lt;span class=&quot;kw1&quot;&gt;DECLARE&lt;/span&gt;
obj RECORD;
&lt;span class=&quot;kw1&quot;&gt;BEGIN&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;FOR&lt;/span&gt; obj &lt;span class=&quot;kw1&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; pg_event_trigger_dropped_objects&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
LOOP
&lt;span class=&quot;kw1&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;INTO&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;ddl_audit_log &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;
command_tag&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
object_type&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
schema_name&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
object_name&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
executed_by
&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;
&lt;span class=&quot;st0&quot;&gt;&#039;DROP&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
obj&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;object_type&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
split_part&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;obj&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;object_identity&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;.&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
split_part&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;obj&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;object_identity&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;.&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;CURRENT_USER&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span class=&quot;kw1&quot;&gt;END&lt;/span&gt; LOOP;
&lt;span class=&quot;kw1&quot;&gt;END&lt;/span&gt;;
$$;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Schritt 4: Prozedur f\u00fcr DROP-Aktionen&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;schritt_4prozedur_fuer_drop-aktionen&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;2314-2822&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit8&quot; id=&quot;schritt_5event_trigger_fuer_drop-aktionen&quot;&gt;Schritt 5: Event Trigger für DROP-Aktionen&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code sql&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;CREATE&lt;/span&gt; EVENT &lt;span class=&quot;kw1&quot;&gt;TRIGGER&lt;/span&gt; ddl_drop_audit_trigger
&lt;span class=&quot;kw1&quot;&gt;ON&lt;/span&gt; sql_drop
&lt;span class=&quot;kw1&quot;&gt;EXECUTE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;FUNCTION&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;log_ddl_drop&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Schritt 5: Event Trigger f\u00fcr DROP-Aktionen&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;schritt_5event_trigger_fuer_drop-aktionen&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;2823-2995&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit9&quot; id=&quot;wartungtrigger_aktivieren_deaktivieren&quot;&gt;Wartung: Trigger aktivieren/deaktivieren&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt; Befehle und Erläuterung: &lt;a href=&quot;http://wiki.redatek.de/postgres:ddl_logging&quot; class=&quot;wikilink1&quot; title=&quot;postgres:ddl_logging&quot; data-wiki-id=&quot;postgres:ddl_logging&quot;&gt;PostgreSQL DDL Audit Logging&lt;/a&gt; — Abschnitt &lt;strong&gt;Wartung: Trigger aktivieren/deaktivieren&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Wartung: Trigger aktivieren\/deaktivieren&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;wartungtrigger_aktivieren_deaktivieren&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;2996-3194&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit10&quot; id=&quot;beispielddl-aktion_und_auswertung&quot;&gt;Beispiel: DDL-Aktion und Auswertung&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code sql&quot;&gt;\&lt;span class=&quot;co1&quot;&gt;-- Beispielaktion&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;TABLE&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;audit_test &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;
id SERIAL &lt;span class=&quot;kw1&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;KEY&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
name TEXT
&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
&lt;span class=&quot;kw1&quot;&gt;DROP&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;TABLE&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;audit_test;
&amp;nbsp;
\&lt;span class=&quot;co1&quot;&gt;-- Auswertung&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;ddl_audit_log &lt;span class=&quot;kw1&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;BY&lt;/span&gt; executed_at &lt;span class=&quot;kw1&quot;&gt;DESC&lt;/span&gt;;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Beispiel: DDL-Aktion und Auswertung&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;beispielddl-aktion_und_auswertung&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;3195-3460&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit11&quot; id=&quot;optionalview_fuer_dashboard&quot;&gt;Optional: View für Dashboard&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code sql&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;VIEW&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;ddl_audit_summary &lt;span class=&quot;kw1&quot;&gt;AS&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;SELECT&lt;/span&gt;
executed_at::&lt;span class=&quot;kw1&quot;&gt;DATE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;AS&lt;/span&gt; datum&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
schema_name&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
object_name&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
command_tag&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
object_type&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
executed_by
&lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;ddl_audit_log
&lt;span class=&quot;kw1&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;BY&lt;/span&gt; executed_at &lt;span class=&quot;kw1&quot;&gt;DESC&lt;/span&gt;;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Optional: View f\u00fcr Dashboard&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;optionalview_fuer_dashboard&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;3461-3715&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit12&quot; id=&quot;erweiterungpg_stat_statements&quot;&gt;Erweiterung: pg_stat_statements&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Die PostgreSQL-Erweiterung &lt;code&gt;pg_stat_statements&lt;/code&gt; kann ergänzend verwendet werden, um &lt;strong&gt;vollständige DDL-Befehle&lt;/strong&gt; (inkl. Spaltennamen) zu erfassen, die über Event Trigger nicht verfügbar sind.
&lt;/p&gt;
&lt;pre class=&quot;code sql&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;SELECT&lt;/span&gt; query&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; calls&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; userid&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; dbid&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; queryid&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; total_time
&lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; pg_stat_statements
&lt;span class=&quot;kw1&quot;&gt;WHERE&lt;/span&gt; query &lt;span class=&quot;kw1&quot;&gt;LIKE&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;ALTER TABLE%&#039;&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;AND&lt;/span&gt; query \~\&lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;ADD COLUMN|DROP COLUMN|RENAME COLUMN&#039;&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;BY&lt;/span&gt; total_time &lt;span class=&quot;kw1&quot;&gt;DESC&lt;/span&gt;;&lt;/pre&gt;

&lt;p&gt;
oder eben selektiv mit lesbarem User und Datenbanknamen:
&lt;/p&gt;
&lt;pre class=&quot;code sql&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;SELECT&lt;/span&gt; a&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;rolname&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;b&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;datname&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;c&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;query
&lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; public&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;pg_stat_statements c&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; pg_roles a&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; pg_database b
&lt;span class=&quot;kw1&quot;&gt;WHERE&lt;/span&gt; a&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;oid &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; c&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;userid &lt;span class=&quot;kw1&quot;&gt;AND&lt;/span&gt; b&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;oid &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; c&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;dbid
&lt;span class=&quot;kw1&quot;&gt;AND&lt;/span&gt; c&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;query &lt;span class=&quot;kw1&quot;&gt;LIKE&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;ALTER%&#039;&lt;/span&gt;;&lt;/pre&gt;

&lt;p&gt;
Hinweis:
&lt;/p&gt;

&lt;p&gt;
* Die Erweiterung speichert normierte SQL-Befehle
* Die Statistik wird nicht sofort aktualisiert
* Für produktive Systeme mit hoher Last kann die Kombination mit Event Triggern zu Performance-Einbußen führen
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Erweiterung: pg_stat_statements&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;erweiterungpg_stat_statements&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;3716-4635&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit13&quot; id=&quot;hinweise&quot;&gt;Hinweise&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
* Die Spalte &lt;code&gt;ddl&lt;/code&gt; wurde entfernt, da der Typ &lt;code&gt;pg_ddl_command&lt;/code&gt; nicht direkt gespeichert werden kann.
* Spaltenänderungen (z. B. &lt;code&gt;ADD COLUMN&lt;/code&gt;) enthalten keine Spaltennamen über Event Trigger.
* Die Lösung ist leichtgewichtig und für produktive Systeme geeignet.
* DDL-Audit vorübergehend aus: &lt;a href=&quot;http://wiki.redatek.de/postgres:ddl_logging&quot; class=&quot;wikilink1&quot; title=&quot;postgres:ddl_logging&quot; data-wiki-id=&quot;postgres:ddl_logging&quot;&gt;PostgreSQL DDL Audit Logging&lt;/a&gt;, Abschnitt &lt;strong&gt;Wartung: Trigger aktivieren/deaktivieren&lt;/strong&gt; (&lt;code&gt;ALTER EVENT TRIGGER … DISABLE&lt;/code&gt; / &lt;code&gt;ENABLE&lt;/code&gt;).
* Event Trigger und Tabellen-Trigger sind verschiedene Mechanismen — siehe folgender Unterabschnitt.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Hinweise&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;hinweise&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:13,&amp;quot;range&amp;quot;:&amp;quot;4636-5228&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit14&quot; id=&quot;event_trigger_versus_tabellen-trigger&quot;&gt;Event Trigger versus Tabellen-Trigger&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;div class=&quot;table sectionedit15&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;thead&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0&quot;&gt; Aspekt &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Event Trigger (dieses DDL-Audit) &lt;/th&gt;&lt;th class=&quot;col2&quot;&gt; Tabellen-Trigger &lt;/th&gt;
	&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Zweck &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Reaktion auf &lt;strong&gt;DDL&lt;/strong&gt; (&lt;code&gt;CREATE TABLE&lt;/code&gt;, &lt;code&gt;DROP&lt;/code&gt;, …) auf Datenbankebene &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; Reaktion auf &lt;strong&gt;Datenänderungen&lt;/strong&gt; in einer Tabelle: &lt;code&gt;INSERT&lt;/code&gt; / &lt;code&gt;UPDATE&lt;/code&gt; / &lt;code&gt;DELETE&lt;/code&gt;, oft &lt;code&gt;FOR EACH ROW&lt;/code&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Anlage &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;code&gt;CREATE EVENT TRIGGER …&lt;/code&gt; &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; &lt;code&gt;CREATE TRIGGER … ON eine_tabelle …&lt;/code&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Abschalten (Beispiel) &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;code&gt;ALTER EVENT TRIGGER … DISABLE&lt;/code&gt; / &lt;code&gt;… ENABLE&lt;/code&gt; &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; z. B. &lt;code&gt;ALTER TABLE … DISABLE TRIGGER …&lt;/code&gt; &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;secid&amp;quot;:15,&amp;quot;range&amp;quot;:&amp;quot;5278-5759&amp;quot;} --&gt;
&lt;p&gt;
Zum &lt;strong&gt;vorübergehenden Abschalten dieses DDL-Audits&lt;/strong&gt; werden nur &lt;strong&gt;Event Trigger&lt;/strong&gt; mit &lt;code&gt;ALTER EVENT TRIGGER …&lt;/code&gt; gesteuert. &lt;code&gt;ALTER TABLE … DISABLE TRIGGER …&lt;/code&gt; betrifft &lt;strong&gt;Tabellen-Trigger&lt;/strong&gt; auf einer konkreten Tabelle und hat mit diesem DDL-Protokoll &lt;strong&gt;nichts&lt;/strong&gt; zu tun.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Event Trigger versus Tabellen-Trigger&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;event_trigger_versus_tabellen-trigger&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:14,&amp;quot;range&amp;quot;:&amp;quot;5229-6037&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit16&quot; id=&quot;erweiterungen_moeglich&quot;&gt;Erweiterungen möglich&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
* Filterung nach Objektarten oder Benutzer
* Integration mit Git zur Versionskontrolle
* Visualisierung der Änderungen über Dashboards
* Benachrichtigung bei kritischen Änderungen (z. B. DROP TABLE)
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Erweiterungen m\u00f6glich&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;erweiterungen_moeglich&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:16,&amp;quot;range&amp;quot;:&amp;quot;6038-6278&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit17&quot; id=&quot;bemerkung&quot;&gt;Bemerkung&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt; Für mich ist das Standard Vorgehen meist unbrauchbar, da pg_stat_statements wie auch pgaudit nicht das Objekt selbst aufzeichnet. Ich schreibe meine eigene Triggerfunction — dokumentiert in &lt;a href=&quot;http://wiki.redatek.de/postgres:ddl_logging&quot; class=&quot;wikilink1&quot; title=&quot;postgres:ddl_logging&quot; data-wiki-id=&quot;postgres:ddl_logging&quot;&gt;PostgreSQL DDL Audit Logging&lt;/a&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Bemerkung&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;bemerkung&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:17,&amp;quot;range&amp;quot;:&amp;quot;6279-6554&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit18&quot; id=&quot;stichworte&quot;&gt;Stichworte&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;em&gt;PostgreSQL, DDL, Audit, Event Trigger, pg_stat_statements, Dashboard&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Stichworte&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;stichworte&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:18,&amp;quot;range&amp;quot;:&amp;quot;6555-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/informix:informix_fdw?rev=1750425550&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-06-20T13:19:10+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>informix_fdw - angelegt</title>
        <link>http://wiki.redatek.de/informix:informix_fdw?rev=1750425550&amp;do=diff</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;import_foreign_schema_von_informix_nach_postgresql&quot;&gt;IMPORT FOREIGN SCHEMA von Informix nach PostgreSQL&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;IMPORT FOREIGN SCHEMA von Informix nach PostgreSQL&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;import_foreign_schema_von_informix_nach_postgresql&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-66&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit2&quot; id=&quot;vorbereitung&quot;&gt;Vorbereitung&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Zur besseren Nachverfolgung aktivieren wir das erweiterte Debugging:
&lt;/p&gt;
&lt;pre class=&quot;code sql&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;SET&lt;/span&gt; client_min_messages &lt;span class=&quot;kw1&quot;&gt;TO&lt;/span&gt; DEBUG2;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Vorbereitung&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;vorbereitung&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;67-214&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;vollstaendiger_import_aller_tabellen_eines_informix-datenbank-schemas&quot;&gt;Vollständiger IMPORT aller Tabellen eines Informix-Datenbank-Schemas&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code sql&quot;&gt;IMPORT &lt;span class=&quot;kw1&quot;&gt;FOREIGN&lt;/span&gt; SCHEMA daten
    &lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; SERVER tcp_azur_Test
    &lt;span class=&quot;kw1&quot;&gt;INTO&lt;/span&gt; test
    OPTIONS &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw1&quot;&gt;DATABASE&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;test&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Vollst\u00e4ndiger IMPORT aller Tabellen eines Informix-Datenbank-Schemas&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;vollstaendiger_import_aller_tabellen_eines_informix-datenbank-schemas&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;215-418&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;limitierter_import_z b_nur_eine_tabelle&quot;&gt;LIMITIERTER IMPORT (z. B. nur eine Tabelle)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code sql&quot;&gt;IMPORT &lt;span class=&quot;kw1&quot;&gt;FOREIGN&lt;/span&gt; SCHEMA informix
    &lt;span class=&quot;kw1&quot;&gt;LIMIT&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;TO&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;abfrage&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; SERVER tcp_azur_Test
    &lt;span class=&quot;kw1&quot;&gt;INTO&lt;/span&gt; test
    OPTIONS &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw1&quot;&gt;DATABASE&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;test&#039;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;

&lt;p&gt;
&lt;strong&gt;Hinweis:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; `IMPORT FOREIGN SCHEMA` bezieht sich &lt;strong&gt;nicht&lt;/strong&gt; auf das PostgreSQL-Schema, sondern auf den &lt;strong&gt;Owner&lt;/strong&gt; der Tabellen im Informix-System.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Die Angabe wie z. B. `daten` ist ein Benutzer (Owner) in Informix, &lt;strong&gt;nicht&lt;/strong&gt; der Name eines Schemas.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Beispielhafte vom Server generierte Abfrage:&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code sql&quot;&gt;    DEBUG:  &lt;span class=&quot;kw1&quot;&gt;PREPARE&lt;/span&gt; query &lt;span class=&quot;st0&quot;&gt;&amp;quot;SELECT tabid, trim(owner), tabname FROM systables 
    WHERE tabid &amp;gt;= 100 AND owner = &#039;daten&#039; 
    AND tabname IN (&#039;abfrage&#039;) ORDER BY tabname DESC&amp;quot;&lt;/span&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;LIMITIERTER IMPORT (z.\u202fB. nur eine Tabelle)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;limitierter_import_z\u202fb_nur_eine_tabelle&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;419-1134&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit5&quot; id=&quot;wichtiger_hinweis_zur_richtung_des_imports&quot;&gt;Wichtiger Hinweis zur Richtung des Imports&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ein `IMPORT FOREIGN SCHEMA` ist &lt;strong&gt;nur unidirektional möglich&lt;/strong&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
    Von Informix nach PostgreSQL. &lt;strong&gt;Nicht umgekehrt!&lt;/strong&gt; Ein Export oder Zugriff von Informix auf PostgreSQL über dieselbe Methode ist nicht möglich. Das Schema muss also zwingend auf Informix vorhanden sein! &lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Wichtiger Hinweis zur Richtung des Imports&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;wichtiger_hinweis_zur_richtung_des_imports&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;1135-1475&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;kopieren_der_tabellen_lokal_in_postgresql_struktur_daten&quot;&gt;Kopieren der Tabellen lokal in PostgreSQL (struktur+daten)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Die folgende PL/pgSQL-Prozedur kopiert Tabellen aus dem per Foreign Schema importierten Schema (`quelle`) in ein lokales Zielschema (`ziel`).
&lt;/p&gt;

&lt;p&gt;
Dabei wird:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; das Zielschema ggf. neu angelegt,&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; jede Tabelle zuerst strukturell dupliziert (`LIKE … INCLUDING ALL`),&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; anschließend werden die Daten kopiert.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Bei einem Fehler wird trotzdem die leere Tabelle erstellt (zur späteren Analyse oder Wiederholung).&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code sql&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;OR&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;REPLACE&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;PROCEDURE&lt;/span&gt; db&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;kopie&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;IN&lt;/span&gt; quelle TEXT&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;IN&lt;/span&gt; ziel TEXT&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;LANGUAGE&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&#039;plpgsql&#039;&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;AS&lt;/span&gt; $$
&lt;span class=&quot;kw1&quot;&gt;DECLARE&lt;/span&gt;
    tabelle TEXT;
&lt;span class=&quot;kw1&quot;&gt;BEGIN&lt;/span&gt;
    &lt;span class=&quot;co1&quot;&gt;-- Schema prüfen und ggf. erstellen&lt;/span&gt;
    PERFORM &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; information_schema&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;schemata &lt;span class=&quot;kw1&quot;&gt;WHERE&lt;/span&gt; schema_name &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; ziel;
    &lt;span class=&quot;kw1&quot;&gt;IF&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;NOT&lt;/span&gt; FOUND &lt;span class=&quot;kw1&quot;&gt;THEN&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;EXECUTE&lt;/span&gt; format&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;CREATE SCHEMA %I&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; ziel&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span class=&quot;kw1&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;IF&lt;/span&gt;;
&amp;nbsp;
    &lt;span class=&quot;co1&quot;&gt;-- Tabellenstruktur kopieren&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;FOR&lt;/span&gt; tabelle &lt;span class=&quot;kw1&quot;&gt;IN&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;TABLE_NAME&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; information_schema&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;tables
        &lt;span class=&quot;kw1&quot;&gt;WHERE&lt;/span&gt; table_schema &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; quelle
    LOOP
        &lt;span class=&quot;kw1&quot;&gt;EXECUTE&lt;/span&gt; format&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;DROP TABLE IF EXISTS %I.%I&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; ziel&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; tabelle&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
        RAISE NOTICE &lt;span class=&quot;st0&quot;&gt;&#039;Struktur % verarbeitet&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; tabelle;
        &lt;span class=&quot;kw1&quot;&gt;EXECUTE&lt;/span&gt; format&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;
            &lt;span class=&quot;st0&quot;&gt;&#039;CREATE TABLE %I.%I (LIKE %I.%I INCLUDING ALL)&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
            ziel&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; tabelle&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; quelle&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; tabelle
        &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span class=&quot;kw1&quot;&gt;END&lt;/span&gt; LOOP;
&amp;nbsp;
    &lt;span class=&quot;co1&quot;&gt;-- Daten kopieren mit Fehlerbehandlung&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;FOR&lt;/span&gt; tabelle &lt;span class=&quot;kw1&quot;&gt;IN&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;TABLE_NAME&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;FROM&lt;/span&gt; information_schema&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;tables
        &lt;span class=&quot;kw1&quot;&gt;WHERE&lt;/span&gt; table_schema &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; quelle
    LOOP
        &lt;span class=&quot;kw1&quot;&gt;BEGIN&lt;/span&gt;
            &lt;span class=&quot;kw1&quot;&gt;EXECUTE&lt;/span&gt; format&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&#039;INSERT INTO %I.%I SELECT * FROM %I.%I&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
                           ziel&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; tabelle&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; quelle&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; tabelle&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;;
            RAISE NOTICE &lt;span class=&quot;st0&quot;&gt;&#039;Tabelle % verarbeitet&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; tabelle;
        EXCEPTION &lt;span class=&quot;kw1&quot;&gt;WHEN&lt;/span&gt; OTHERS &lt;span class=&quot;kw1&quot;&gt;THEN&lt;/span&gt;
            RAISE NOTICE &lt;span class=&quot;st0&quot;&gt;&#039;------------ FEHLER bei % --------------&#039;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; tabelle;
            COMMIT;
        &lt;span class=&quot;kw1&quot;&gt;END&lt;/span&gt;;
    &lt;span class=&quot;kw1&quot;&gt;END&lt;/span&gt; LOOP;
&lt;span class=&quot;kw1&quot;&gt;END&lt;/span&gt;;
$$;
&amp;nbsp;
&lt;span class=&quot;kw1&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;PROCEDURE&lt;/span&gt; db&lt;span class=&quot;sy0&quot;&gt;.&lt;/span&gt;kopie&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;text&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; text&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    OWNER &lt;span class=&quot;kw1&quot;&gt;TO&lt;/span&gt; postgres;&lt;/pre&gt;
&lt;hr /&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kopieren der Tabellen lokal in PostgreSQL (struktur+daten)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;kopieren_der_tabellen_lokal_in_postgresql_struktur_daten&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;1476-3365&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit7&quot; id=&quot;zusammenfassung&quot;&gt;Zusammenfassung&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; `IMPORT FOREIGN SCHEMA` erlaubt das Einbinden externer Informix-Tabellen als &lt;em&gt;Foreign Tables&lt;/em&gt; in PostgreSQL.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ein vollständiger Import kann auf Wunsch auf einzelne Tabellen beschränkt werden.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Für dauerhafte Nutzung oder Fehlerunabhängigkeit empfiehlt sich die Kopie der Tabellen lokal via PL/pgSQL.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Der Prozess ist &lt;strong&gt;einseitig&lt;/strong&gt; – nur &lt;strong&gt;von Informix zu PostgreSQL&lt;/strong&gt; möglich.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Zusammenfassung&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;zusammenfassung&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;3366-3792&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit8&quot; id=&quot;stichworte&quot;&gt;Stichworte&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;em&gt;PostgreSQL, Informix, IMPORT FOREIGN SCHEMA, FDW, Foreign Data Wrapper&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Stichworte&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;stichworte&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;3793-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/wiki:informix_rowid?rev=1750163005&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-06-17T12:23:25+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>informix_rowid - angelegt</title>
        <link>http://wiki.redatek.de/wiki:informix_rowid?rev=1750163005&amp;do=diff</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;nutzung_der_rowid_in_sql_statements&quot;&gt;Nutzung der rowid in SQL Statements&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Die Verwendung der `rowid` in SQL-Statements sollte mit Vorsicht erfolgen und nach Möglichkeit vermieden werden. Dies gilt insbesondere im Kontext von Datenbankmigrationen oder bei der Verwendung von Datenbank-Wrapping-Technologien wie z.B. dem &lt;strong&gt;Informix-Wrapper&lt;/strong&gt; für PostgreSQL.
&lt;/p&gt;

&lt;p&gt;
Laut IBM-Dokumentation wird empfohlen, sich nicht auf `rowid` zu verlassen, da sie systemabhängig ist und sich unter bestimmten Umständen ändern kann.
(vgl. &lt;a href=&quot;https://www.ibm.com/docs/de/informix-servers/12.10.0?topic=statements-rowid-values-in-select&quot; class=&quot;urlextern&quot; title=&quot;https://www.ibm.com/docs/de/informix-servers/12.10.0?topic=statements-rowid-values-in-select&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.ibm.com/docs/de/informix-servers/12.10.0?topic=statements-rowid-values-in-select&lt;/a&gt;)
&lt;/p&gt;

&lt;p&gt;
In Informix ist `rowid` ein Integer-Wert. In PostgreSQL gibt es kein direktes Äquivalent, aber es existiert die systeminterne Spalte `ctid`, die eine ähnliche Funktion übernimmt.
(vgl. &lt;a href=&quot;https://www.enterprisedb.com/postgres-tutorials/what-equivalent-rowid-postgresql?lang=en&quot; class=&quot;urlextern&quot; title=&quot;https://www.enterprisedb.com/postgres-tutorials/what-equivalent-rowid-postgresql?lang=en&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.enterprisedb.com/postgres-tutorials/what-equivalent-rowid-postgresql?lang=en&lt;/a&gt; und &lt;a href=&quot;https://www.postgresql.org/docs/current/ddl-system-columns.html&quot; class=&quot;urlextern&quot; title=&quot;https://www.postgresql.org/docs/current/ddl-system-columns.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.postgresql.org/docs/current/ddl-system-columns.html&lt;/a&gt;)
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Nutzung der rowid in SQL Statements&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nutzung_der_rowid_in_sql_statements&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-950&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;unterschiede_zwischen_informix_rowid_und_postgresql_ctid&quot;&gt;Unterschiede zwischen Informix rowid und PostgreSQL ctid&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Der Informix-Wrapper leitet die `rowid` grundsätzlich an die PostgreSQL-`ctid` weiter. Dabei gibt es jedoch wichtige technische Unterschiede:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; `rowid` in Informix ist ein einfacher &lt;strong&gt;Integer&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; `ctid` in PostgreSQL ist ein &lt;strong&gt;Tupel bestehend aus (page_number, tuple_index)&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Der Informix-Wrapper setzt `rowid` auf den ersten Wert von `ctid`, also ergibt sich die übergebene Form: &lt;strong&gt;`ctid = (rowid, 0)`&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Unterschiede zwischen Informix rowid und PostgreSQL ctid&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;unterschiede_zwischen_informix_rowid_und_postgresql_ctid&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;951-1440&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;technische_eigenschaften_der_ctid_in_postgresql&quot;&gt;Technische Eigenschaften der ctid in PostgreSQL&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; `ctid` ändert sich bei jeder &lt;strong&gt;UPDATE-Operation&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Wird durch &lt;strong&gt;VACUUM FULL&lt;/strong&gt; neu zugewiesen.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Kann nach &lt;strong&gt;VACUUM ANALYZE&lt;/strong&gt; wiederverwendet werden.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ist systemintern und nicht als dauerhaft eindeutiger Schlüssel geeignet.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Technische Eigenschaften der ctid in PostgreSQL&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;technische_eigenschaften_der_ctid_in_postgresql&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1441-1738&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;beste_praktiken&quot;&gt;Beste Praktiken&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Statt `rowid` oder `ctid` zu verwenden, sollten möglichst &lt;strong&gt;logische Identifikatoren&lt;/strong&gt; eingesetzt werden. Empfohlene Alternativen:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Primärschlüssel&lt;/strong&gt; nutzen (z.B. durch `SERIAL` oder `BIGSERIAL` erzeugt).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Aufbau geeigneter &lt;strong&gt;Indexstrukturen&lt;/strong&gt; zur Performanceoptimierung.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Logische Referenzen&lt;/strong&gt; statt physischer Adressen (z.B. Foreign Keys auf Primärschlüssel).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Anpassung der Anwendung, um auf `rowid`/`ctid` zu verzichten.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Beste Praktiken&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;beste_praktiken&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1739-2215&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;moegliche_loesungen_bei_migration_oder_wrapper-nutzung&quot;&gt;Mögliche Lösungen bei Migration oder Wrapper-Nutzung&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Wenn eine bestehende Anwendung auf `rowid` angewiesen ist, gibt es folgende Workarounds:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Anlage einer &lt;strong&gt;eigenen physischen Spalte&lt;/strong&gt; `rowid` vom Typ `BIGSERIAL` in der PostgreSQL-Zielstruktur.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Aufbau eines &lt;strong&gt;dedizierten Index&lt;/strong&gt; zur effizienten Suche.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Anpassung der SQL-Statements in der Anwendung, um die neue Struktur zu unterstützen.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;strong&gt;Hinweis&lt;/strong&gt;: Die Verwendung von `ctid` als langfristiger Zeilenidentifikator sollte vermieden werden, da er sich durch normale Datenbankoperationen wie `UPDATE`, `VACUUM`, etc. verändern kann und somit nicht stabil ist.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;M\u00f6gliche L\u00f6sungen bei Migration oder Wrapper-Nutzung&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;moegliche_loesungen_bei_migration_oder_wrapper-nutzung&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;2216-2855&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Die `rowid` bzw. `ctid` sind für temporäre oder systeminterne Zwecke nützlich, sollten jedoch &lt;strong&gt;nicht als zuverlässige Referenz&lt;/strong&gt; in langlebigen Anwendungen oder Datenmodellen verwendet werden. Stattdessen ist auf &lt;strong&gt;Primärschlüssel-basierte Logik&lt;/strong&gt; umzusteigen.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Fazit&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;fazit&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;2856-3143&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;stichworte&quot;&gt;Stichworte&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;em&gt;Informix, PostgreSQL, rowid, ctid, FDW, Migration, Primärschlüssel&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Stichworte&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;stichworte&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;3144-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/wiki:dokuwiki?rev=1749392224&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-06-08T14:17:04+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>dokuwiki</title>
        <link>http://wiki.redatek.de/wiki:dokuwiki?rev=1749392224&amp;do=diff</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;dokuwiki&quot;&gt;DokuWiki&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.dokuwiki.org/wiki%3Adokuwiki&quot; class=&quot;media&quot; title=&quot;https://www.dokuwiki.org/wiki%3Adokuwiki&quot;&gt;&lt;img src=&quot;http://wiki.redatek.de/_media/wiki:dokuwiki-128.png&quot; class=&quot;medialeft&quot; align=&quot;left&quot; loading=&quot;lazy&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; DokuWiki is a simple to use and highly versatile Open Source &lt;a href=&quot;https://en.wikipedia.org/wiki/wiki&quot; class=&quot;interwiki iw_wp&quot; title=&quot;https://en.wikipedia.org/wiki/wiki&quot;&gt;wiki&lt;/a&gt; software that doesn&amp;#039;t require a database. It is loved by users for its clean and readable &lt;a href=&quot;http://wiki.redatek.de/wiki:syntax&quot; class=&quot;wikilink1&quot; title=&quot;wiki:syntax&quot; data-wiki-id=&quot;wiki:syntax&quot;&gt;syntax&lt;/a&gt;. The ease of maintenance, backup and integration makes it an administrator&amp;#039;s favorite. Built in &lt;a href=&quot;https://www.dokuwiki.org/acl&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/acl&quot;&gt;access controls&lt;/a&gt; and &lt;a href=&quot;https://www.dokuwiki.org/auth&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/auth&quot;&gt;authentication connectors&lt;/a&gt; make DokuWiki especially useful in the enterprise context and the large number of &lt;a href=&quot;https://www.dokuwiki.org/plugins&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/plugins&quot;&gt;plugins&lt;/a&gt; contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki.
&lt;/p&gt;

&lt;p&gt;
Read the &lt;a href=&quot;https://www.dokuwiki.org/manual&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/manual&quot;&gt;DokuWiki Manual&lt;/a&gt; to unleash the full power of DokuWiki.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;DokuWiki&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;dokuwiki&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-704&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;download&quot;&gt;Download&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
DokuWiki is available at &lt;a href=&quot;https://download.dokuwiki.org/&quot; class=&quot;urlextern&quot; title=&quot;https://download.dokuwiki.org/&quot; rel=&quot;ugc nofollow&quot;&gt;https://download.dokuwiki.org/&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Download&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;download&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;705-784&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;read_more&quot;&gt;Read More&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
All documentation and additional information besides the &lt;a href=&quot;http://wiki.redatek.de/wiki:syntax&quot; class=&quot;wikilink1&quot; title=&quot;wiki:syntax&quot; data-wiki-id=&quot;wiki:syntax&quot;&gt;syntax description&lt;/a&gt; is maintained in the DokuWiki at &lt;a href=&quot;https://www.dokuwiki.org/&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/&quot;&gt;www.dokuwiki.org&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;About DokuWiki&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/features&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/features&quot;&gt;A feature list&lt;/a&gt; &lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/users&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/users&quot;&gt;Happy Users&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/press&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/press&quot;&gt;Who wrote about it&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/blogroll&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/blogroll&quot;&gt;What Bloggers think&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.wikimatrix.org/show/DokuWiki&quot; class=&quot;urlextern&quot; title=&quot;https://www.wikimatrix.org/show/DokuWiki&quot; rel=&quot;ugc nofollow&quot;&gt;Compare it with other wiki software&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;strong&gt;Installing DokuWiki&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/requirements&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/requirements&quot;&gt;System Requirements&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://download.dokuwiki.org/&quot; class=&quot;urlextern&quot; title=&quot;https://download.dokuwiki.org/&quot; rel=&quot;ugc nofollow&quot;&gt;Download DokuWiki&lt;/a&gt; &lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/changes&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/changes&quot;&gt;Change Log&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/Install&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/Install&quot;&gt;How to install or upgrade&lt;/a&gt; &lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/config&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/config&quot;&gt;Configuration&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;strong&gt;Using DokuWiki&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/syntax&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/syntax&quot;&gt;Wiki Syntax&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/manual&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/manual&quot;&gt;The manual&lt;/a&gt; &lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/FAQ&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/FAQ&quot;&gt;Frequently Asked Questions (FAQ)&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/glossary&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/glossary&quot;&gt;Glossary&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;strong&gt;Customizing DokuWiki&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/tips&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/tips&quot;&gt;Tips and Tricks&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/Template&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/Template&quot;&gt;How to create and use templates&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/plugins&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/plugins&quot;&gt;Installing plugins&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/development&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/development&quot;&gt;Development Resources&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;strong&gt;DokuWiki Feedback and Community&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/newsletter&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/newsletter&quot;&gt;Subscribe to the newsletter&lt;/a&gt; &lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/mailinglist&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/mailinglist&quot;&gt;Join the mailing list&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://forum.dokuwiki.org&quot; class=&quot;urlextern&quot; title=&quot;https://forum.dokuwiki.org&quot; rel=&quot;ugc nofollow&quot;&gt;Check out the user forum&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/irc&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/irc&quot;&gt;Talk to other users in the IRC channel&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/splitbrain/dokuwiki/issues&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/splitbrain/dokuwiki/issues&quot; rel=&quot;ugc nofollow&quot;&gt;Submit bugs and feature wishes&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://www.dokuwiki.org/thanks&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/thanks&quot;&gt;Some humble thanks&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Read More&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;read_more&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;785-2217&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
2004-2020 © Andreas Gohr &lt;a href=&quot;mailto:&amp;#97;&amp;#110;&amp;#100;&amp;#105;&amp;#64;&amp;#115;&amp;#112;&amp;#108;&amp;#105;&amp;#116;&amp;#98;&amp;#114;&amp;#97;&amp;#105;&amp;#110;&amp;#46;&amp;#111;&amp;#114;&amp;#103;&quot; class=&quot;mail&quot; title=&quot;&amp;#97;&amp;#110;&amp;#100;&amp;#105;&amp;#64;&amp;#115;&amp;#112;&amp;#108;&amp;#105;&amp;#116;&amp;#98;&amp;#114;&amp;#97;&amp;#105;&amp;#110;&amp;#46;&amp;#111;&amp;#114;&amp;#103;&quot;&gt;&amp;#97;&amp;#110;&amp;#100;&amp;#105;&amp;#64;&amp;#115;&amp;#112;&amp;#108;&amp;#105;&amp;#116;&amp;#98;&amp;#114;&amp;#97;&amp;#105;&amp;#110;&amp;#46;&amp;#111;&amp;#114;&amp;#103;&lt;/a&gt;&lt;sup&gt;&lt;a href=&quot;#fn__1&quot; id=&quot;fnt__1&quot; class=&quot;fn_top&quot;&gt;1)&lt;/a&gt;&lt;/sup&gt; and the DokuWiki Community
&lt;/p&gt;

&lt;p&gt;
The DokuWiki engine is licensed under &lt;a href=&quot;https://www.gnu.org/licenses/gpl.html&quot; class=&quot;urlextern&quot; title=&quot;https://www.gnu.org/licenses/gpl.html&quot; rel=&quot;ugc nofollow&quot;&gt;GNU General Public License&lt;/a&gt; Version 2. If you use DokuWiki in your company, consider &lt;a href=&quot;https://www.dokuwiki.org/donate&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/donate&quot;&gt;donating&lt;/a&gt; a few bucks &lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/wink.svg&quot; class=&quot;icon smiley&quot; alt=&quot;;-)&quot; /&gt;.
&lt;/p&gt;

&lt;p&gt;
Not sure what this means? See the &lt;a href=&quot;https://www.dokuwiki.org/faq%3Alicense&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/faq%3Alicense&quot;&gt;FAQ on the Licenses&lt;/a&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Copyright&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;copyright&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2218-&amp;quot;} --&gt;&lt;div class=&quot;footnotes&quot;&gt;
&lt;div class=&quot;fn&quot;&gt;&lt;sup&gt;&lt;a href=&quot;#fnt__1&quot; id=&quot;fn__1&quot; class=&quot;fn_bot&quot;&gt;1)&lt;/a&gt;&lt;/sup&gt; 
&lt;div class=&quot;content&quot;&gt;Please do not contact me for help and support – use the &lt;a href=&quot;https://www.dokuwiki.org/mailinglist&quot; class=&quot;interwiki iw_doku&quot; title=&quot;https://www.dokuwiki.org/mailinglist&quot;&gt;mailinglist&lt;/a&gt; or &lt;a href=&quot;https://forum.dokuwiki.org&quot; class=&quot;urlextern&quot; title=&quot;https://forum.dokuwiki.org&quot; rel=&quot;ugc nofollow&quot;&gt;forum&lt;/a&gt; instead&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/mail:ham_spam_sa-learn?rev=1749385737&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-06-08T12:28:57+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>ham_spam_sa-learn</title>
        <link>http://wiki.redatek.de/mail:ham_spam_sa-learn?rev=1749385737&amp;do=diff</link>
        <description>
&lt;h3 class=&quot;sectionedit1&quot; id=&quot;hinzugefuegte_cronjob-eintraege&quot;&gt;Hinzugefügte Cronjob-Einträge&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Ich habe folgende Cronjob-Einträge hinzugefügt, um den Spam-Filter (SpamAssassin) zu trainieren:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Spam lernen:&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code bash&quot;&gt;    sa-learn &lt;span class=&quot;re5&quot;&gt;--spam&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;mail&lt;span class=&quot;sy0&quot;&gt;/*/*/&lt;/span&gt;.Junk &lt;span class=&quot;re5&quot;&gt;--dbpath&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;mail-state&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib-amavis&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;.spamassassin
&amp;nbsp;&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ham (keine Spam) lernen:&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code bash&quot;&gt;    sa-learn &lt;span class=&quot;re5&quot;&gt;--ham&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;mail&lt;span class=&quot;sy0&quot;&gt;/*/*/&lt;/span&gt;.Ham &lt;span class=&quot;re5&quot;&gt;--dbpath&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;var&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;mail-state&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib-amavis&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;.spamassassin
&amp;nbsp;&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Synchronisieren:&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code bash&quot;&gt;    sa-learn &lt;span class=&quot;re5&quot;&gt;--sync&lt;/span&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Hinzugef\u00fcgte Cronjob-Eintr\u00e4ge&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;hinzugefuegte_cronjob-eintraege&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-492&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit2&quot; id=&quot;einbindung_des_cron-job-volumes&quot;&gt;Einbindung des Cron-Job-Volumes&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Das Cron-Job-Volume wird über die `docker-compose.yml` eingebunden:
&lt;/p&gt;
&lt;pre class=&quot;code yml&quot;&gt;/container/mail/docker-data/dms/cron/sa-learn:/etc/cron.d/sa-learn&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Einbindung des Cron-Job-Volumes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;einbindung_des_cron-job-volumes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;493-690&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;nachtrag_2025_wechsel_von_amavisd_zu_rspamd&quot;&gt;Nachtrag 2025 Wechsel von amavisd zu rspamd&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;/div&gt;

&lt;h4 id=&quot;aenderung_der_cron_jobs&quot;&gt;Änderung der CRON Jobs&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
rspamd lernt über andere Hilfsprogramme. So sollte der cronjob Eintrag aussehen
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;9 3 * * * root rspamc learn_spam /var/mail/*/*/.Junk/cur
9 3 * * * root rspamc learn_ham /var/mail/*/*/.Ham/cur&lt;/pre&gt;

&lt;/div&gt;

&lt;h5 id=&quot;hinweis_nach_update_juni_2025&quot;&gt;Hinweis nach Update Juni 2025&lt;/h5&gt;
&lt;div class=&quot;level5&quot;&gt;

&lt;p&gt;
Das Procedere ist nach wie vor nötig &lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt; &lt;a href=&quot;http://wiki.redatek.de/mail:docker_mailserver_bug&quot; class=&quot;wikilink1&quot; title=&quot;mail:docker_mailserver_bug&quot; data-wiki-id=&quot;mail:docker_mailserver_bug&quot;&gt;Fehlermeldung syslog Docker-Mailserver&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Nachtrag 2025 Wechsel von amavisd zu rspamd&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nachtrag_2025_wechsel_von_amavisd_zu_rspamd&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;691-1138&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;stichworte&quot;&gt;Stichworte&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;em&gt;SpamAssassin, rspamd, sa-learn, Cron, Docker-Mailserver, Mail&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Stichworte&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;stichworte&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1139-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/wiki:letsencrypt_webpath_docker_renew?rev=1748792843&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-06-01T15:47:23+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>letsencrypt_webpath_docker_renew</title>
        <link>http://wiki.redatek.de/wiki:letsencrypt_webpath_docker_renew?rev=1748792843&amp;do=diff</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;apache_konfiguration_fuer_let_s_encrypt_zertifikats-erneuerung_mit_podman&quot;&gt;Apache Konfiguration für Let&amp;#039;s Encrypt Zertifikats-Erneuerung mit Podman&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Um Let&amp;#039;s Encrypt Zertifikate in einem Container zu erneuern, ist eine spezifische Konfiguration des Apache Virtual Hosts erforderlich, da die Zertifikatserneuerung über einen Container erfolgt. Die folgende Konfiguration stellt sicher, dass Anfragen an die &lt;code&gt;/.well-known/acme-challenge&lt;/code&gt;-Ressourcen erfolgreich verarbeitet werden, selbst wenn der eigentliche DocumentRoot für die Webseite anders gesetzt ist.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Apache Konfiguration f\u00fcr Let&amp;#039;s Encrypt Zertifikats-Erneuerung mit Podman&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;apache_konfiguration_fuer_let_s_encrypt_zertifikats-erneuerung_mit_podman&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-502&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;apache_vhost_konfiguration&quot;&gt;Apache VHost Konfiguration&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
In der Apache-Konfigurationsdatei des Virtual Hosts wird der DocumentRoot auf das Verzeichnis der Webseite gesetzt. Da &lt;strong&gt;Let&amp;#039;s Encrypt&lt;/strong&gt; jedoch auf &lt;code&gt;/.well-known/acme-challenge&lt;/code&gt; zugreift, um die Zertifikate zu validieren, ist eine Alias-Direktive erforderlich, um Anfragen korrekt umzuleiten. Der relevante Ausschnitt der Konfiguration:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;.... &amp;lt;VirtualHost *:80&amp;gt; 
DocumentRoot /var/www/html/redatek 
Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/ 
... &amp;lt;/VirtualHost&amp;gt;&lt;/pre&gt;

&lt;p&gt;
&lt;strong&gt;Erklärung:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;DocumentRoot&lt;/strong&gt; legt das Verzeichnis fest, das die Hauptinhalte der Webseite enthält. In diesem Beispiel: `/var/www/html/redatek`.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Alias&lt;/strong&gt; definiert eine Umleitung für das Verzeichnis &lt;code&gt;/.well-known/acme-challenge/&lt;/code&gt; auf `/var/www/html/.well-known/acme-challenge/`. Dadurch können Let&amp;#039;s Encrypt Validierungsanfragen unabhängig vom DocumentRoot beantwortet werden.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Apache VHost Konfiguration&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;apache_vhost_konfiguration&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;503-1453&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;beachten_im_containerbetrieb&quot;&gt;Beachten im Containerbetrieb&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt; Apache Config für http (80) anpassen:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&amp;lt;If &amp;quot;%{THE_REQUEST} !~ m# /.well-known/?#i&amp;quot;&amp;gt;
       RedirectPermanent / https://url.tld/
&amp;lt;/If&amp;gt;&lt;/pre&gt;

&lt;p&gt;
Zumindest Apache &amp;gt; 2.4 &lt;img src=&quot;http://wiki.redatek.de/lib/images/smileys/exclaim.svg&quot; class=&quot;icon smiley&quot; alt=&quot;:!:&quot; /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Beachten im Containerbetrieb&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;beachten_im_containerbetrieb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1454-1678&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;zertifikat_generieren&quot;&gt;Zertifikat generieren&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
den Webroot Ordner angeben –&amp;gt; certbot certonly –webroot /var/www/ -d domain.tld
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Zertifikat generieren&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;zertifikat_generieren&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1679-1792&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;let_s_encrypt_zertifikats-erneuerung_im_container&quot;&gt;Let&amp;#039;s Encrypt Zertifikats-Erneuerung im Container&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Da die Zertifikatserneuerung über &lt;strong&gt;Podman&lt;/strong&gt; in einem Container stattfindet, wird das Verzeichnis für die Webseiten-Validierung gemountet. Dies erfolgt mittels Volumemapping, um sicherzustellen, dass Let&amp;#039;s Encrypt auf die notwendigen Verzeichnisse zugreifen kann.
&lt;/p&gt;

&lt;p&gt;
Der Befehl für die Zertifikats-Erneuerung im Container sieht wie folgt aus:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;podman run --rm -it
-v &amp;quot;/container/letsencrypt/log:/var/log/letsencrypt&amp;quot;
-v &amp;quot;/var/www/html:/var/www/&amp;quot;
-v &amp;quot;/container/letsencrypt/cert:/etc/letsencrypt&amp;quot;
docker.io/certbot/certbot renew&lt;/pre&gt;

&lt;p&gt;
&lt;strong&gt;Erklärung:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;–rm&lt;/strong&gt; löscht den Container nach der Ausführung, um Speicherplatz freizugeben.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;-it&lt;/strong&gt; ermöglicht eine interaktive Ausführung im Terminal.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;-v „/container/letsencrypt/log:/var/log/letsencrypt“&lt;/strong&gt; legt das Log-Verzeichnis fest, um Protokolle der Zertifikats-Erneuerung zu speichern.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;-v „/var/www/html:/var/www/„&lt;/strong&gt; mappt das lokale Webverzeichnis `/var/www/html` in das Verzeichnis `/var/www/` innerhalb des Containers.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;-v “/container/letsencrypt/cert:/etc/letsencrypt“&lt;/strong&gt; weist das Verzeichnis für die Zertifikate zu.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Let&amp;#039;s Encrypt Zertifikats-Erneuerung im Container&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;let_s_encrypt_zertifikats-erneuerung_im_container&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;1793-2965&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;neustart_nicht_vergessen&quot;&gt;Neustart nicht vergessen&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
nach dem
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;podman run --rm -it -v &amp;quot;/container/letsencrypt/log:/var/log/letsencrypt&amp;quot; -v &amp;quot;/var/www/html:/var/www/&amp;quot; -v &amp;quot;/container/letsencrypt/cert:/etc/letsencrypt&amp;quot; docker.io/certbot/certbot renew -v&lt;/pre&gt;

&lt;p&gt;
unbedingt die betreffenden Dienste neu starten damit der neue Key aktiv geladen wird.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;systemctl restart httpd
podman container restart mailserver&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Neustart nicht vergessen&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;neustart_nicht_vergessen&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;2966-3379&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;problematik_ohne_alias-direktive&quot;&gt;Problematik ohne Alias-Direktive&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Ohne das Alias-Mapping schlägt der Erneuerungsprozess fehl, da Let&amp;#039;s Encrypt auf &lt;code&gt;/.well-known/acme-challenge&lt;/code&gt; zugreifen muss. Der angegebene &lt;strong&gt;DocumentRoot&lt;/strong&gt; für die Webseite (&lt;code&gt;/var/www/html/redatek&lt;/code&gt;) enthält jedoch dieses Verzeichnis nicht direkt. Daher ist das Alias in der Apache-Konfiguration notwendig, um die Validierung erfolgreich abzuschließen.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Problematik ohne Alias-Direktive&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;problematik_ohne_alias-direktive&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;3380-3789&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit8&quot; id=&quot;zusammenfassung&quot;&gt;Zusammenfassung&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Diese Konfiguration ermöglicht es, Let&amp;#039;s Encrypt Zertifikate über einen Podman-Container zu erneuern, indem die Apache-Konfiguration angepasst wird, um die notwendigen Ressourcen bereitzustellen. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;DocumentRoot&lt;/strong&gt; verweist auf den Hauptinhalt der Webseite.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Alias&lt;/strong&gt; stellt sicher, dass die Zertifikatsanfragen von Let&amp;#039;s Encrypt korrekt beantwortet werden.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Podman Container&lt;/strong&gt;-Setup mit Volumemapping ermöglicht den Zugriff auf die Verzeichnisse für Logs und Zertifikate sowie auf das Webverzeichnis für die Validierung.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Zusammenfassung&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;zusammenfassung&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;3790-4359&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit9&quot; id=&quot;stichworte&quot;&gt;Stichworte&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;em&gt;Let&amp;#039;s Encrypt, ACME, Apache, Alias, VirtualHost, certbot, Podman, Docker, Zertifikat, /.well-known&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Stichworte&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;stichworte&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;4360-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/mail:neuer_user_domain?rev=1747999412&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2025-05-23T11:23:32+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>neuer_user_domain</title>
        <link>http://wiki.redatek.de/mail:neuer_user_domain?rev=1747999412&amp;do=diff</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;mail_prozedur&quot;&gt;Mail Prozedur&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;

&lt;h4 id=&quot;neue_konten&quot;&gt;Neue Konten&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;podman exec -ti mailserver setup add neu@domain.tld&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;kontrolle&quot;&gt;Kontrolle&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;podman exec -ti mailserver setup email list&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;neue_domain_dkim_dmarc&quot;&gt;Neue Domain DKIM DMARC&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;podman exec -ti mailserver setup config dkim&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;eintraege_im_dns&quot;&gt;Einträge im DNS&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;DKIM&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code&quot;&gt;  mail._domainkey IN TXT v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w......&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;DMARC&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code&quot;&gt;  _dmarc.example.com. IN TXT v=DMARC1; p=quarantine; sp=quarantine; fo=0; adkim=r; aspf=r; pct=100; rf=afrf; ri=86400; rua=mailto:dmarc.report@example.com; ruf=mailto:dmarc.report@example.com&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;SPF&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code&quot;&gt;  TXT v=spf1 ip4:91.26.196.29 ~all&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;pruefung&quot;&gt;Prüfung&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://mxtoolbox.com/SuperTool.aspx&quot; class=&quot;urlextern&quot; title=&quot;https://mxtoolbox.com/SuperTool.aspx&quot; rel=&quot;ugc nofollow&quot;&gt;MXToolbox SuperTool&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;h4 id=&quot;info&quot;&gt;Info&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://docker-mailserver.github.io/docker-mailserver/latest/config/best-practices/dkim_dmarc_spf/#web-interface&quot; class=&quot;urlextern&quot; title=&quot;https://docker-mailserver.github.io/docker-mailserver/latest/config/best-practices/dkim_dmarc_spf/#web-interface&quot; rel=&quot;ugc nofollow&quot;&gt;DKIM, DMARC, SPF – Docker Mailserver Dokumentation&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Mail Prozedur&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;mail_prozedur&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-890&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;stichworte&quot;&gt;Stichworte&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;em&gt;Mailserver, DKIM, DMARC, SPF, &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;, docker-mailserver, Podman&lt;/em&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Stichworte&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;stichworte&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;891-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/?image=wiki%3Aenterpriselogorahmen2.png&amp;ns=wiki&amp;rev=1725089735&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-31T07:35:35+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>enterpriselogorahmen2.png - angelegt</title>
        <link>http://wiki.redatek.de/?image=wiki%3Aenterpriselogorahmen2.png&amp;ns=wiki&amp;rev=1725089735&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;img src=&quot;http://wiki.redatek.de/_media/wiki:enterpriselogorahmen2.png?w=500&amp;amp;h=500&amp;amp;tok=41f699&quot; alt=&quot;enterpriselogorahmen2.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/?image=favicon.ico&amp;ns=0&amp;rev=1725087021&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-31T06:50:21+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>favicon.ico - angelegt</title>
        <link>http://wiki.redatek.de/?image=favicon.ico&amp;ns=0&amp;rev=1725087021&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;img src=&quot;http://wiki.redatek.de/_media/favicon.ico?w=500&amp;amp;h=500&amp;amp;tok=36a69b&quot; alt=&quot;favicon.ico&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/?image=logo.png&amp;ns=0&amp;rev=1725087021&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-31T06:50:21+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>logo.png - angelegt</title>
        <link>http://wiki.redatek.de/?image=logo.png&amp;ns=0&amp;rev=1725087021&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;img src=&quot;http://wiki.redatek.de/_media/logo.png?w=500&amp;amp;h=500&amp;amp;tok=9a464a&quot; alt=&quot;logo.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/?image=wiki%3Avt52.jpg&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-31T05:59:40+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>vt52.jpg - angelegt</title>
        <link>http://wiki.redatek.de/?image=wiki%3Avt52.jpg&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;img src=&quot;http://wiki.redatek.de/_media/wiki:vt52.jpg?w=500&amp;amp;h=500&amp;amp;tok=222e7c&quot; alt=&quot;vt52.jpg&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/?image=wiki%3Agfud.png&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-31T05:59:40+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>gfud.png - angelegt</title>
        <link>http://wiki.redatek.de/?image=wiki%3Agfud.png&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;img src=&quot;http://wiki.redatek.de/_media/wiki:gfud.png?w=500&amp;amp;h=500&amp;amp;tok=85ca85&quot; alt=&quot;gfud.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/?image=wiki%3Abanner.png&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-31T05:59:40+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>banner.png - angelegt</title>
        <link>http://wiki.redatek.de/?image=wiki%3Abanner.png&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;img src=&quot;http://wiki.redatek.de/_media/wiki:banner.png?w=500&amp;amp;h=500&amp;amp;tok=0bad4f&quot; alt=&quot;banner.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/?image=wiki%3Aitveteran.png&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-31T05:59:40+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>itveteran.png - angelegt</title>
        <link>http://wiki.redatek.de/?image=wiki%3Aitveteran.png&amp;ns=wiki&amp;rev=1725083980&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;img src=&quot;http://wiki.redatek.de/_media/wiki:itveteran.png?w=500&amp;amp;h=500&amp;amp;tok=7d3924&quot; alt=&quot;itveteran.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/?image=wiki%3Abdrthomas-336x400-1.jpg&amp;ns=wiki&amp;rev=1724247278&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-21T13:34:38+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>bdrthomas-336x400-1.jpg - angelegt</title>
        <link>http://wiki.redatek.de/?image=wiki%3Abdrthomas-336x400-1.jpg&amp;ns=wiki&amp;rev=1724247278&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;img src=&quot;http://wiki.redatek.de/_media/wiki:bdrthomas-336x400-1.jpg?w=500&amp;amp;h=500&amp;amp;tok=a5241d&quot; alt=&quot;bdrthomas-336x400-1.jpg&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/?image=ksnip_20240821-144545.png&amp;ns=0&amp;rev=1724245125&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-21T12:58:45+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>ksnip_20240821-144545.png - angelegt</title>
        <link>http://wiki.redatek.de/?image=ksnip_20240821-144545.png&amp;ns=0&amp;rev=1724245125&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;img src=&quot;http://wiki.redatek.de/_media/ksnip_20240821-144545.png?w=500&amp;amp;h=500&amp;amp;tok=031063&quot; alt=&quot;ksnip_20240821-144545.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
    </item>
    <item rdf:about="http://wiki.redatek.de/?image=ksnip_20240821-144826.png&amp;ns=0&amp;rev=1724245092&amp;tab_details=history&amp;media_do=diff&amp;do=media">
        <dc:format>text/html</dc:format>
        <dc:date>2024-08-21T12:58:12+00:00</dc:date>
        <dc:creator>Thomas Schilling (admin@undisclosed.example.com)</dc:creator>
        <title>ksnip_20240821-144826.png - angelegt</title>
        <link>http://wiki.redatek.de/?image=ksnip_20240821-144826.png&amp;ns=0&amp;rev=1724245092&amp;tab_details=history&amp;media_do=diff&amp;do=media</link>
        <description>&lt;img src=&quot;http://wiki.redatek.de/_media/ksnip_20240821-144826.png?w=500&amp;amp;h=500&amp;amp;tok=ec9f90&quot; alt=&quot;ksnip_20240821-144826.png&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;</description>
    </item>
</rdf:RDF>
