sichere Variante Tabelle in SQLite mit Variablen Spaltennamen zu erstellen?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
RichardeRicharde
User
Beiträge: 16
Registriert: Montag 29. November 2021, 14:37

Hallo Zusammen,
gibt es eine sichere Variante, welche SQLinjection verhindert, die es ermöglichte eine Tabelle anzulegen mit durchnummerierten Spalten?

Code: Alles auswählen

self.m_coursor.execute("""CREATE TABLE ergebnisse (
					Spalte_1 integer,
					Spalte_2 integer,
					Spalte_3 integer,
					)""")
Ich würde mich sehr über Antworten freuen - vielen Dank.
Richarde
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. DDL ist nicht parametrisch, nur DML, also Abfragen. Und allgemein ist es ein starker code smell wenn man dynamisch Tabellen anlegen will. Dafür gibt es eigentlich nie einen Grund. Warum glaubst du das tun zu müssen?
RichardeRicharde
User
Beiträge: 16
Registriert: Montag 29. November 2021, 14:37

Danke für Deine Antwort.

Für ein Rechenspiel möchte ich die Ergebnisse von Spielern speichern.

Das Datenmodell könnte so aussehen:
  • Spieler
  • Datum
  • Uhrzeit
  • Reihe (Anmerkung: des 1x1)
  • Ergebnis_1
  • Richtig_1
  • Zeit_1
  • Ergebnis_2
  • Richtig_2
  • Zeit_2
  • Ergebnis_3
  • Richtig_3
  • Zeit_3
    ...
durch Deine Frage bin ich noch auf diese Variante gekommen:
  • Spieler
  • Datum
  • Uhrzeit
  • Reihe (Anmerkung: des 1x1)
  • Faktor
  • Ergebnis
  • Richtig
  • Zeit
Beide Varianten haben Ihre Vor- und Nachteile - Deinem Kommentar entnehme ich aber es wäre Variante 2 zu bevorzugen.
Wenn ich so drüber Nachdenke sind deren angeblich Nachteile für mein Projekt zu vernachlässigen.

Vielen Dank und viele Grüße
Richarde
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@RichardeRicharde: das Äquivalent zu durchnummerierten Spalten ist eine weitere Tabelle.
Die Tabelle `ergebnis_spiel` mit den Spalten ID, Spieler, Datum Uhrzeit` und eine Tabelle `ergebnis_runde` mit den Spalten ID, spiel_id, runden_nummer, Ergebnis, Richtig und Zeit.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich weiss nicht so genau was du da als Nachteile empfindest. Aber die richtige Art, sowas zu modellieren, sieht mehrere Tabellen und 1:n-Beziehungen zwischen denen vor. Also zB

Code: Alles auswählen

table Spieler
  id  
  name

table Aufgabe
  id
  beschreibung
  ergebnis

table Versuch
   spieler_id
   aufgaben_id
   zeitstempel
   ergebnis
Dann ergibt sich zb die Antwort danach, ob der Versuch erfolgreich war, aus einem join ueber Aufgabe und Versuch

Code: Alles auswählen

select a.ergebnis == v.ergebnis for aufgabe as a, versuch as v where a.id == v.aufgaben_id
Da fehlt natuerlich noch eine Menge an Details.
RichardeRicharde
User
Beiträge: 16
Registriert: Montag 29. November 2021, 14:37

Vielen Dank für Deine fundierte Antwort.
__deets__ hat geschrieben: Montag 17. Januar 2022, 15:28 die richtige Art, sowas zu modellieren, sieht mehrere Tabellen und 1:n-Beziehungen zwischen denen vor. Also zB

Code: Alles auswählen

table Spieler
  id  
  name

table Aufgabe
  id
  beschreibung
  ergebnis

table Versuch
   spieler_id
   aufgaben_id
   zeitstempel
   ergebnis
Macht es Sinn die Spalten ID in den ersten Tabellen einzuführen?
Man könnte ja in der Tabelle Versuch die Zuordnung auch über den eindeutigen Namen herstellen wenn sicher ist das es diesen in der führenden Tabelle nur genau ein mal geben kann?

Oder hat id noch Vorteile die ich jetzt übersehe?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Du solltest dich belesen, was Normalisierung bei Datenbanken ist. Das wird automatisch viele deiner Fragen beantworten.
Edit: Zumindest gehe ich davon aus, weil das auch die "Beziehungen" zwischen Relationen verdeutlicht.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich persönlich arbeite immer mit IDs, und gerade bei Personen sehe ich dazu auch keine Alternative. Es gibt nunmal eine Menge Pamela Chantal Müllers. Und compound IDs sind (Achtung, Meinung) mir zu nervig. Wenn das zwei oder drei Werte werden, ist das ja anstrengend, die durch die Gegend zu schleppen.

Anders sieht das natürlich aus, wenn sich da etwas natürliches anbietet. ISO-Ländercodes, Standortnamen, Raumnummern (wenn sie fest sind). Aber wirklich einen Fehler macht man mit IDs in meinen Augen fast nie.
RichardeRicharde
User
Beiträge: 16
Registriert: Montag 29. November 2021, 14:37

Ich Danke Dir für Deine Erklärungen und Deine Geduld,
leider ist mir noch nicht ganz klar warum ich folgende Form

Code: Alles auswählen


table Spieler
  id  
  name

table Aufgabe
  id
  reihe
  faktor
  beschreibung
  ergebnis

table Versuch
   spieler_id
   aufgaben_id
   zeitstempel
   ergebnis
Der Form

Code: Alles auswählen


table Spieler
  name [unique primary key]

table Aufgabe
  id
  reihe
  faktor
  beschreibung
  ergebnis

table Versuch
   spieler_name
   aufgaben_id
   zeitstempel
   ergebnis
vorziehen sollte?

Ich merke aber schon beim schreiben das es zum Beispiel in der Tabelle Aufgabe von Vorteil sein wird auf ID zu wechseln, da sich dann die Beziehung im Join besser herstellen lässt.


EDIT: mit Deinem letzten Post der in der Zwischenzeit gepostet wurde, ist mir das nun auch klar. Ich Danke nochmals für die Ausführlichen Erklärungen und bin froh wieder etwas gelernt zu haben.

Danke und viele Grüße
Richarde
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei insbesondere Namen auch nicht fest sind. Da heiratet mal jemand oder ändert das Geschlecht und damit auch den Vornamen und schon ist der Name nicht mehr derselbe und müsste in anderen Tabellen angepasst werden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten