Zum Inhalt springen
≈ 1 minNeuSQLDatenbankSecurity

Best Practices für SQL

SQL, das sicher, schnell und wartbar ist – parametrisierte Queries, gezielte Indizes, Transaktionen und versionierte Migrationen.

In 30 Sekunden

  1. 01

    Werte nie per String-Verkettung in Queries einbauen – immer Parameter nutzen, sonst droht SQL-Injection.

  2. 02

    Nur benötigte Spalten abfragen und Spalten indizieren, nach denen gefiltert und gejoint wird.

  3. 03

    Schemaänderungen laufen als versionierte Migrationen, nie per Hand in Produktion.

Sicherheit zuerst: Parameter statt Strings

Nicht so

cur.execute(
    f"SELECT * FROM users WHERE email = '{email}'"
)
# email = "' OR '1'='1" → alle User

So

cur.execute(
    "SELECT id, name FROM users WHERE email = %s",
    (email,),
)

Die wichtigsten Regeln

Kein SELECT *

Spalten explizit nennen: weniger Daten, stabil bei Schemaänderungen, Index-only-Scans möglich.

Gezielt indizieren

Indizes auf Fremdschlüssel und Spalten in WHERE/JOIN/ORDER BY. Mit EXPLAIN prüfen, ob sie greifen.

Constraints in der DB

NOT NULL, UNIQUE, FOREIGN KEY, CHECK – die Datenbank erzwingt Regeln auch dann, wenn der Code einen Bug hat.

Transaktionen

Zusammengehörige Änderungen in BEGIN … COMMIT, damit nie nur die Hälfte gespeichert wird.

Versionierte Migrationen

Jede Schemaänderung als Skript im Repo (Alembic, Flyway, EF Migrations) – reproduzierbar in jeder Umgebung.

Konsistente Namen

snake_case, eindeutige Konvention für Tabellen (Singular oder Plural) und Fremdschlüssel wie user_id.

Lesbare Joins

Nicht so

SELECT * FROM orders o, users u
WHERE o.user_id = u.id AND u.country = 'DE'

So

SELECT o.id, o.total, u.name
FROM orders AS o
JOIN users AS u ON u.id = o.user_id
WHERE u.country = 'DE';

Merksatz

„Die Datenbank ist dein letzter Verteidigungswall – Constraints und Parameter gehören dorthin, nicht nur in den Code.“

Selbsttest

Erst selbst überlegen, dann aufklappen.

01Warum kann ein Index Schreibzugriffe verlangsamen?

Jeder INSERT, UPDATE oder DELETE muss auch alle betroffenen Indizes aktualisieren. Deshalb nur Spalten indizieren, die wirklich in WHERE, JOIN oder ORDER BY vorkommen.

Weiter in Grundlagen

Best Practices für TypeScript