<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=Umbraco-Datenbank_w%C3%A4chst_durch_Formulardaten</id>
	<title>Umbraco-Datenbank wächst durch Formulardaten - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=Umbraco-Datenbank_w%C3%A4chst_durch_Formulardaten"/>
	<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=Umbraco-Datenbank_w%C3%A4chst_durch_Formulardaten&amp;action=history"/>
	<updated>2026-10-22T08:22:15Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in maxTechCorner</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://techcorner.max-it.de/index.php?title=Umbraco-Datenbank_w%C3%A4chst_durch_Formulardaten&amp;diff=4319&amp;oldid=prev</id>
		<title>imported&gt;TechCorner-Redaktion: Neufassung: Umbraco Forms ScheduledRecordDeletion und Aufbewahrungsfristen, Contour-SQL als Altsystem-Variante</title>
		<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=Umbraco-Datenbank_w%C3%A4chst_durch_Formulardaten&amp;diff=4319&amp;oldid=prev"/>
		<updated>2026-10-14T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;Neufassung: Umbraco Forms ScheduledRecordDeletion und Aufbewahrungsfristen, Contour-SQL als Altsystem-Variante&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Steckbrief&lt;br /&gt;
| gilt_fuer   = Umbraco Forms 13/17 (Umbraco 13/17 LTS); Altinstallationen mit Umbraco Contour (Umbraco 4–7)&lt;br /&gt;
| bereich     = Server-Software&lt;br /&gt;
| dauer       = ca. 20 Minuten&lt;br /&gt;
| rechte      = Umbraco-Administrator, Zugriff auf appsettings.json bzw. SQL Server&lt;br /&gt;
| stand       = Oktober 2026&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wächst die Umbraco-Datenbank durch Formulardaten&amp;#039;&amp;#039;&amp;#039;, liegt das fast immer an gespeicherten Einsendungen von Umbraco Forms (früher &amp;#039;&amp;#039;Contour&amp;#039;&amp;#039;): Jede Formularabsendung – auch Spam und abgebrochene mehrstufige Formulare – landet in der Datenbank und bleibt dort ohne Aufbewahrungsregel für immer. Aktuelle Umbraco-Forms-Versionen bringen dafür eine automatische Löschung mit.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Umbraco-Formulardaten.png|thumb|center|750px|Umbraco Forms: Mit ScheduledRecordDeletion und Aufbewahrungsfristen je Formular werden alte Einsendungen automatisch gelöscht.]]&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
* Die Umbraco-Datenbank wird stetig größer, Backups und Wiederherstellungen dauern länger.&lt;br /&gt;
* Im Backoffice unter &amp;#039;&amp;#039;Forms → Formular → Entries&amp;#039;&amp;#039; liegen tausende alte oder Spam-Einträge.&lt;br /&gt;
* In Altsystemen mit Contour verbleiben abgebrochene mehrstufige Formulare im Status &amp;#039;&amp;#039;PartiallySubmitted&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Ursache ==&lt;br /&gt;
Umbraco Forms speichert Einsendungen standardmäßig unbegrenzt in den Tabellen &amp;lt;code&amp;gt;UFRecords&amp;lt;/code&amp;gt; und den zugehörigen Datentabellen. Eine Löschung findet nur statt, wenn eine Aufbewahrungsfrist konfiguriert ist. Neben dem Speicherplatz ist das auch ein Datenschutzproblem: Personenbezogene Formulardaten dürfen nach [[DSGVO]] nicht länger als nötig aufbewahrt werden.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
=== Variante 1: Automatische Löschung in Umbraco Forms aktivieren (empfohlen) ===&lt;br /&gt;
# Die geplante Löschung in der &amp;lt;code&amp;gt;appsettings.json&amp;lt;/code&amp;gt; einschalten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;Umbraco&amp;quot;: {&lt;br /&gt;
    &amp;quot;Forms&amp;quot;: {&lt;br /&gt;
      &amp;quot;Options&amp;quot;: {&lt;br /&gt;
        &amp;quot;ScheduledRecordDeletion&amp;quot;: {&lt;br /&gt;
          &amp;quot;Enabled&amp;quot;: true,&lt;br /&gt;
          &amp;quot;FirstRunTime&amp;quot;: &amp;quot;0 3 * * *&amp;quot;,&lt;br /&gt;
          &amp;quot;Period&amp;quot;: &amp;quot;1.00:00:00&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Im Backoffice je Formular unter &amp;#039;&amp;#039;Settings&amp;#039;&amp;#039; die Aufbewahrungsfristen festlegen: &amp;#039;&amp;#039;&amp;#039;Tage für übermittelte, genehmigte und abgelehnte Einträge&amp;#039;&amp;#039;&amp;#039; (Konfigurationsnamen &amp;lt;code&amp;gt;DaysToRetainSubmittedRecordsFor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DaysToRetainApprovedRecordsFor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DaysToRetainRejectedRecordsFor&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; = unbegrenzt). Einträge in anderen Zuständen (z. B. abgebrochene Einsendungen aus Altversionen) erfassen diese Fristen nicht – solche Einträge im Backoffice unter &amp;#039;&amp;#039;Entries&amp;#039;&amp;#039; manuell löschen.&lt;br /&gt;
# Website neu starten. Die Löschung läuft danach täglich um 3:00 Uhr (&amp;lt;code&amp;gt;FirstRunTime&amp;lt;/code&amp;gt; im Cron-Format; leer = 3 Minuten nach dem Start, &amp;lt;code&amp;gt;Period&amp;lt;/code&amp;gt; = Intervall).&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Standardwerte für neue Formulare lassen sich in der &amp;lt;code&amp;gt;appsettings.json&amp;lt;/code&amp;gt; unter &amp;lt;code&amp;gt;Umbraco:Forms:FormDesign:Defaults&amp;lt;/code&amp;gt; setzen. Bereits vorhandene Formulare müssen im Backoffice einzeln angepasst werden.}}&lt;br /&gt;
&lt;br /&gt;
=== Variante 2: Spam gar nicht erst speichern ===&lt;br /&gt;
* Formular-Einstellung &amp;#039;&amp;#039;&amp;#039;„Store records locally“&amp;#039;&amp;#039;&amp;#039; deaktivieren, wenn Einsendungen nur per E-Mail-Workflow weiterverarbeitet werden – dann landet nichts in der Datenbank.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Honeypot&amp;#039;&amp;#039;&amp;#039; und Anti-Forgery-Token (in Umbraco Forms integriert) aktiv lassen und zusätzlich ein Captcha-Feld wie reCAPTCHA v3 oder hCaptcha verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Variante 3: Altsysteme mit Contour per SQL bereinigen ===&lt;br /&gt;
Auf Umbraco-7-Installationen mit Contour gibt es keine automatische Löschung. Dort lassen sich alte Einträge per Stored Procedure entfernen – &amp;#039;&amp;#039;&amp;#039;vorher die Datenbank sichern&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;tsql&amp;quot;&amp;gt;&lt;br /&gt;
-- Löscht Contour-Datensätze eines Formulars, die älter als @MaxAge Tage sind.&lt;br /&gt;
-- @FormState: 0=Opened 1=Resumed 2=PartiallySubmitted 3=Submitted 4=Approved 5=Deleted&lt;br /&gt;
CREATE PROCEDURE [dbo].[DeleteContourRecords]&lt;br /&gt;
    @FormId UNIQUEIDENTIFIER,&lt;br /&gt;
    @MaxAge INT = 50,&lt;br /&gt;
    @FormState INT = 2,&lt;br /&gt;
    @Limit INT = 50&lt;br /&gt;
AS&lt;br /&gt;
BEGIN&lt;br /&gt;
    SET NOCOUNT ON;&lt;br /&gt;
    BEGIN TRANSACTION&lt;br /&gt;
    CREATE TABLE #records (id UNIQUEIDENTIFIER)&lt;br /&gt;
    INSERT INTO #records&lt;br /&gt;
        SELECT TOP(@Limit) u.Id FROM UFRecords u&lt;br /&gt;
        WHERE updated &amp;lt; GETDATE()-@MaxAge AND u.State = @FormState AND u.Form = @FormId&lt;br /&gt;
        ORDER BY u.updated&lt;br /&gt;
    DELETE FROM UFRecordsXml WHERE id IN (SELECT id FROM #records)&lt;br /&gt;
    DELETE FROM UFRecords    WHERE id IN (SELECT id FROM #records)&lt;br /&gt;
    DROP TABLE #records&lt;br /&gt;
    COMMIT&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Aufruf, z. B. für PartiallySubmitted-Einträge älter als 180 Tage (je Lauf maximal 100):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;tsql&amp;quot;&amp;gt;&lt;br /&gt;
EXECUTE DeleteContourRecords &amp;#039;8B045F53-352A-4708-9A36-0DC8D67FD1AB&amp;#039;, 180, 2, 100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Achtung|Das SQL-Skript ist nur für das alte Contour-Datenbankschema gedacht. In aktuellen Umbraco-Forms-Versionen unterscheidet sich das Schema (u. a. weitere Datentabellen und Audit-Tabellen) – dort ausschließlich Variante 1 oder das Backoffice verwenden, sonst bleiben verwaiste Daten zurück.}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Datenbank verkleinern:&amp;#039;&amp;#039;&amp;#039; Gelöschte Einträge geben Platz innerhalb der Datenbank frei; die Datei schrumpft erst nach einer Wartung. &amp;lt;code&amp;gt;DBCC SHRINKDATABASE&amp;lt;/code&amp;gt; nur gezielt einsetzen, da es Indizes fragmentiert.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Contour und Umbraco 7&amp;#039;&amp;#039;&amp;#039; erhalten seit Jahren keine Sicherheitsupdates mehr. Eine Migration auf Umbraco 17 LTS mit Umbraco Forms ist dringend zu empfehlen, siehe [[CMS Umbraco]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Export vor dem Löschen:&amp;#039;&amp;#039;&amp;#039; Wichtige Einsendungen vorher im Backoffice als CSV/Excel exportieren.&lt;br /&gt;
* Bei Betrieb, Bereinigung und Upgrade von Umbraco-Websites unterstützt Sie die [https://www.max-it.de/development/individuelle-softwareentwicklung/ individuelle Softwareentwicklung von m.a.x. it].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[CMS Umbraco]]&lt;br /&gt;
* [[DSGVO]]&lt;br /&gt;
&lt;br /&gt;
== Links und Quellen ==&lt;br /&gt;
* [https://docs.umbraco.com/umbraco-forms/developer/configuration Umbraco-Dokumentation: Konfiguration von Umbraco Forms]&lt;br /&gt;
* [https://www.max-it.de/development/individuelle-softwareentwicklung/ Individuelle Softwareentwicklung von m.a.x. it]&lt;br /&gt;
&lt;br /&gt;
{{Uebermax}}&lt;br /&gt;
[[Kategorie:Server-Software]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;TechCorner-Redaktion</name></author>
	</entry>
</feed>