Regel
Vermeiden Sie SELECT * in SQL Abfragen.
SELECT * in Produktion Code macht Anwendungen
anfällig auf Schema Änderungen und verdunkelt Daten Abhängigkeiten.
Unterstützte Sprachen: 45+Einleitung
Nutzung SELECT * in Produktionsabfragen ruft jede Spalte aus einer Tabelle ab, einschließlich Spalten, die Ihre Anwendung nicht verwendet. Wenn sich Datenbankschemata entwickeln und neue Spalten hinzugefügt werden (einschließlich sensibler Daten wie Passwörter oder PII), Abfragen, die verwendet werden SELECT * beginnen automatisch, diese ohne Codeänderungen abzurufen. Dies schafft Sicherheitslücken und bricht Annahmen in Ihrer Anwendungslogik.
Warum es wichtig ist
Leistungsauswirkungen: Das Abrufen unnötiger Spalten erhöht die Abfrageausführungszeit, die Netzwerkübertragungsgröße und den Speicherverbrauch. Eine Tabelle mit 50 Spalten, von denen Sie nur 5 benötigen, bedeutet, dass Sie die 10-fache Datenmenge des Notwendigen übertragen, was die Antwortzeiten verschlechtert und die Infrastrukturkosten erhöht.
Sicherheitsimplikationen: Neue Spalten, die zu Tabellen hinzugefügt werden (Audit-Felder, interne Flags, sensible Benutzerdaten), werden automatisch über SELECT * Abfragen. Ihre API könnte beginnen, Passworthashes, SSNs oder interne Geschäftsdaten preiszugeben, die nie für diesen Endpunkt vorgesehen waren.
Code-Wartbarkeit: Wann SELECT * Abfragen brechen nach Schemaänderungen, der Fehler tritt zur Laufzeit auf, nicht zur Kompilierzeit. Eine neue nicht-nullable Spalte oder ein umbenanntes Feld verursacht Produktionsfehler. Explizite Spaltenlisten machen Abhängigkeiten klar und unterbrechen Builds, wenn Schemata inkompatibel geändert werden.
Code-Beispiele
❌ Nicht konform:
async function getUserProfile(userId) {
const query = 'SELECT * FROM users WHERE id = ?';
const [user] = await db.execute(query, [userId]);
return {
name: user.name,
email: user.email,
createdAt: user.created_at
};
}
Warum es falsch ist: Dies ruft alle Spalten ab, einschließlich potenziell sensibler Felder wie password_hash, ssn, internal_notes oder deleted_at. Wenn das Schema wächst, wird diese Abfrage langsamer und legt mehr Daten offen, obwohl die Anwendung nur drei Felder verwendet.
✅ Konform:
async function getUserProfile(userId) {
const query = `
SELECT name, email, created_at
FROM users
WHERE id = ?
`;
const [user] = await db.execute(query, [userId]);
return {
name: user.name,
email: user.email,
createdAt: user.created_at
};
}
Fazit
Geben Sie in SQL-Abfragen immer explizite Spaltenlisten an. Dies verhindert Datenlecks, verbessert die Leistung und verdeutlicht Abhängigkeiten zwischen Code und Schema. Der geringe anfängliche Aufwand für die Eingabe von Spaltennamen verhindert ganze Klassen von Sicherheits- und Leistungsproblemen.
.avif)
