Umbraco-Datenbank wächst durch Formulardaten

Aus maxTechCorner

Auf einen Blick

Gilt fürUmbraco Forms 13/17 (Umbraco 13/17 LTS); Altinstallationen mit Umbraco Contour (Umbraco 4–7)
BereichServer-Software
Dauerca. 20 Minuten
RechteUmbraco-Administrator, Zugriff auf appsettings.json bzw. SQL Server
StandOktober 2026

Wächst die Umbraco-Datenbank durch Formulardaten, liegt das fast immer an gespeicherten Einsendungen von Umbraco Forms (früher Contour): 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.

Umbraco Forms: Mit ScheduledRecordDeletion und Aufbewahrungsfristen je Formular werden alte Einsendungen automatisch gelöscht.

Problem

  • Die Umbraco-Datenbank wird stetig größer, Backups und Wiederherstellungen dauern länger.
  • Im Backoffice unter Forms → Formular → Entries liegen tausende alte oder Spam-Einträge.
  • In Altsystemen mit Contour verbleiben abgebrochene mehrstufige Formulare im Status PartiallySubmitted.

Ursache

Umbraco Forms speichert Einsendungen standardmäßig unbegrenzt in den Tabellen UFRecords 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.

Lösung

Variante 1: Automatische Löschung in Umbraco Forms aktivieren (empfohlen)

  1. Die geplante Löschung in der appsettings.json einschalten:
{
  "Umbraco": {
    "Forms": {
      "Options": {
        "ScheduledRecordDeletion": {
          "Enabled": true,
          "FirstRunTime": "0 3 * * *",
          "Period": "1.00:00:00"
        }
      }
    }
  }
}
  1. Im Backoffice je Formular unter Settings die Aufbewahrungsfristen festlegen: Tage für übermittelte, genehmigte und abgelehnte Einträge (Konfigurationsnamen DaysToRetainSubmittedRecordsFor, DaysToRetainApprovedRecordsFor, DaysToRetainRejectedRecordsFor; 0 = unbegrenzt). Einträge in anderen Zuständen (z. B. abgebrochene Einsendungen aus Altversionen) erfassen diese Fristen nicht – solche Einträge im Backoffice unter Entries manuell löschen.
  2. Website neu starten. Die Löschung läuft danach täglich um 3:00 Uhr (FirstRunTime im Cron-Format; leer = 3 Minuten nach dem Start, Period = Intervall).


HinweisDie Standardwerte für neue Formulare lassen sich in der appsettings.json unter Umbraco:Forms:FormDesign:Defaults setzen. Bereits vorhandene Formulare müssen im Backoffice einzeln angepasst werden.

Variante 2: Spam gar nicht erst speichern

  • Formular-Einstellung „Store records locally“ deaktivieren, wenn Einsendungen nur per E-Mail-Workflow weiterverarbeitet werden – dann landet nichts in der Datenbank.
  • Honeypot und Anti-Forgery-Token (in Umbraco Forms integriert) aktiv lassen und zusätzlich ein Captcha-Feld wie reCAPTCHA v3 oder hCaptcha verwenden.

Variante 3: Altsysteme mit Contour per SQL bereinigen

Auf Umbraco-7-Installationen mit Contour gibt es keine automatische Löschung. Dort lassen sich alte Einträge per Stored Procedure entfernen – vorher die Datenbank sichern:

-- Löscht Contour-Datensätze eines Formulars, die älter als @MaxAge Tage sind.
-- @FormState: 0=Opened 1=Resumed 2=PartiallySubmitted 3=Submitted 4=Approved 5=Deleted
CREATE PROCEDURE [dbo].[DeleteContourRecords]
    @FormId UNIQUEIDENTIFIER,
    @MaxAge INT = 50,
    @FormState INT = 2,
    @Limit INT = 50
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRANSACTION
    CREATE TABLE #records (id UNIQUEIDENTIFIER)
    INSERT INTO #records
        SELECT TOP(@Limit) u.Id FROM UFRecords u
        WHERE updated < GETDATE()-@MaxAge AND u.State = @FormState AND u.Form = @FormId
        ORDER BY u.updated
    DELETE FROM UFRecordsXml WHERE id IN (SELECT id FROM #records)
    DELETE FROM UFRecords    WHERE id IN (SELECT id FROM #records)
    DROP TABLE #records
    COMMIT
END

Aufruf, z. B. für PartiallySubmitted-Einträge älter als 180 Tage (je Lauf maximal 100):

EXECUTE DeleteContourRecords '8B045F53-352A-4708-9A36-0DC8D67FD1AB', 180, 2, 100


AchtungDas 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.

Hinweise

  • Datenbank verkleinern: Gelöschte Einträge geben Platz innerhalb der Datenbank frei; die Datei schrumpft erst nach einer Wartung. DBCC SHRINKDATABASE nur gezielt einsetzen, da es Indizes fragmentiert.
  • Contour und Umbraco 7 erhalten seit Jahren keine Sicherheitsupdates mehr. Eine Migration auf Umbraco 17 LTS mit Umbraco Forms ist dringend zu empfehlen, siehe CMS Umbraco.
  • Export vor dem Löschen: Wichtige Einsendungen vorher im Backoffice als CSV/Excel exportieren.
  • Bei Betrieb, Bereinigung und Upgrade von Umbraco-Websites unterstützt Sie die individuelle Softwareentwicklung von m.a.x. it.

Siehe auch

Links und Quellen


Über m.a.x. it Die m.a.x. Informationstechnologie AG ist seit über 30 Jahren IT-Partner mittelständischer und großer Unternehmen in München und bietet maßgeschneiderte Lösungen und Services in den Bereichen Cloud, Cybersecurity, Netzwerk, Windows, Linux und Softwareentwicklung. Sie haben eine Frage zu diesem Artikel oder brauchen Unterstützung? Kontakt aufnehmen