30 jours d'essai gratuit pour évaluer vos risques IACommencer
Aller au contenu principal

Protection des données pour développeurs

Déboguer SQL avec une base de données synthétique

Construisez le plus petit jeu de données inventé qui préserve les relations et contraintes derrière le problème SQL. Ne commencez pas par télécharger un dump de production et masquer quelques colonnes. Le fixture SQLite téléchargeable reproduit un surcompte de jointure avec des lignes fictives et une sortie attendue vérifiée, permettant de discuter la requête sans données client.

Pour Développeurs, DBA et ingénierie sécurité

Notes de terrain AonaD18
Fixture relationnelle
3 orders. 4 items. One overcount.

Préservez la relation qui cause le bug, pas les enregistrements originaux.

Jeu de données entièrement synthétique. Sorties SQL et deux contraintes vérifiées hors ligne ; aucun test IA ou politique de point de terminaison effectué.

01

Définissez la question relationnelle

L’exemple demande pourquoi un total client devient trop élevé quand les frais de port sont ajoutés après la jointure des commandes aux lignes d’articles. La caractéristique importante est une commande avec plusieurs articles. Les noms clients, prix réels et base de données complète de production ne sont pas nécessaires pour reproduire cette relation.

Rédigez le résultat attendu avant de demander à un assistant d’expliquer la requête. Un fixture utile inclut un cas exposant l’erreur et un autre qui ne l’expose pas. Cela aide à distinguer une correction correcte d’une requête qui retourne simplement des chiffres plausibles pour une ligne.

02

Préservez les contraintes et inventez les lignes

Le pack crée clients, commandes et order_items avec clés primaires, clés étrangères et vérifications pour montants non négatifs et quantités positives. Toutes les étiquettes et valeurs sont inventées. Le schéma est un exemple pédagogique générique, non copié d’une base de données d’entreprise.

Lors de la création d’un fixture pour votre propre problème, conservez uniquement les relations et cas limites nécessaires à la question. Vérifiez si les noms de schéma, commentaires ou contraintes divulguent des informations propriétaires. Remplacer les noms dans des lignes de production copiées n’est pas équivalent à construire un fixture synthétique.

Contexte source : SQLite : Support des clés étrangères · OAIC : Utilisation de produits IA commerciaux

03

Comparer les requêtes correcte et surcomptée

La requête intentionnellement incorrecte ajoute les frais de livraison d’une commande une fois par article joint. Le premier client synthétique totalise donc 4 200 centimes au lieu de 3 900. Le second client a un article, donc les deux requêtes retournent 2 700 centimes. Cette différence rend la cause observable sans données réelles de client.

La requête correcte agrège les montants des articles par commande, ajoute les frais de livraison une fois, puis totalise par client. Les fichiers CSV attendus incluent les comptes ainsi que les montants pour rendre visible le changement de niveau d’agrégation. Ce sont des résultats SQL vérifiés localement pour le fixture, pas des observations d’un modèle IA ou d’un contrôle Aona.

Comparer les requêtes correcte et surcomptée
Client synthétiqueRequête surcomptéeRequête correcte
1: SYNTHETIC_ALPHA4 200 centimes ; 3 lignes jointes3,900 cents; 2 orders
2: SYNTHETIC_BETA2 700 centimes ; 1 ligne jointe2,700 cents; 1 order

Contexte source : SQLite: SELECT

04

Vérifier le fixture hors ligne

Le vérificateur Python inclus utilise la bibliothèque standard sqlite3 et une base de données en mémoire. Il vérifie les fichiers SQL inchangés par hash, exécute les deux requêtes et confirme que les lignes avec clés étrangères invalides et quantités nulles sont rejetées. Il n’ouvre aucune base de données de production ni n’effectue d’appels réseau ou fournisseur.

Le fixture active explicitement l’application des clés étrangères, comme l’exige la documentation SQLite pour une connexion. Si vous modifiez le SQL pour explorer un autre cas, gardez ce travail séparé et créez de nouveaux résultats attendus. Le vérificateur fourni refuse délibérément le SQL modifié plutôt que de valider silencieusement un exercice différent.

Contexte source : SQLite : Support des clés étrangères

05

Partager le fixture et la question précise

Pour un workflow de codage IA approuvé, fournissez le schéma fictif, la requête pertinente, le résultat attendu et la question à répondre. Excluez le dump de production, la chaîne de connexion et les enregistrements clients. Vérifiez si le compte sélectionné et le chemin d’entrée sont approuvés pour le matériel partagé.

Utilisez toute requête suggérée comme hypothèse à tester localement. Une réponse lisible n’est pas une preuve que la correction préserve les contraintes ou fonctionne sur d’autres cas. Ce guide prépare un exemple relationnel sûr ; il ne prétend pas qu’Aona gère les permissions de base de données ou chaque connexion SQL/MCP.

Mettez-le en pratique

Pack de débogage de jointure SQLite synthétique

Exécutez un fixture relationnel réel et comparez une requête surcomptée avec les résultats attendus vérifiés.

Jeu de données entièrement synthétique. Sorties SQL et deux contraintes vérifiées hors ligne ; aucun test IA ou politique de point de terminaison effectué.

La relation qui révèle l’erreur
01

Commande 101

Deux articles partagent un seul frais de livraison

La jointure naïve ajoute les frais deux fois

02

Niveau correct

Agréger les articles par commande, puis totaliser par client

Premier total attendu : 3 900 centimes

03

Cas témoin

Un article sur la commande 201

Les deux requêtes retournent 2 700 centimes

Pack de débogage de jointure SQLite synthétique
VérifierRésultat attendu du fixtureVérification
Totaux corrects3,900 et 2,700 centsVérifié localement
Exemple de surcomptage4,200 et 2,700 centsVérifié localement
Commande orphelineRejet de clé étrangèreVérifié localement
Quantité d’article nulleRejet de contrainte de vérificationVérifié localement

Travaillez votre révision

Utilisez les vérifications pour organiser les preuves dont vous avez besoin. Enregistrez vos sélections dans Word, puis ajoutez vos notes et preuves. Vos sélections restent dans cet onglet jusqu'à leur téléchargement.

0 sur 3 révisé

Exemples et matériel de révision

Lisez les détails ici, ou conservez ensemble le PDF, le document Word modifiable et les feuilles de calcul.

Télécharger le pack complet (ZIP)
Synthetic SQLite debugging fixtureLire

All rows, labels et amounts are invented. No customer records, credentials, external connection strings or API calls are included.

Question: why does adding order shipping after a join overcount the first customer?

The optional verifier uses only Python’s standard sqlite3 module and an in-memory database. Run verify_fixture.py from this extracted pack to check the unchanged SQL, both expected query outputs and two constraints. It does not open an existing database or use a network. Changed SQL is rejected by hash.

Review fixture.sql, overcounting-query.sql and correct-query.sql with the expected CSV files. If you choose to share the example with an approved AI client, share only these synthetic files and the question. Treat a suggested query as something to validate locally, not a verified production fix.

Guide et sources

Canonical guide: https://aona.ai/resources/guides/database-fixtures-ai-debugging/ Source review: 2026-09-21

  • SQLite: Foreign Key Support: https://www.sqlite.org/foreignkeys.html
  • SQLite: SELECT: https://www.sqlite.org/lang_select.html
  • OAIC: Use of commercially available AI products: https://www.oaic.gov.au/privacy/privacy-guidance-for-organisations-and-government-agencies/guidance-on-privacy-and-the-use-of-commercially-available-ai-products
Expected correctLire
Enregistrements d’exemples détaillés
Customer IDTotal centsOrder count
139002
227001
Expected overcountingLire
Enregistrements d’exemples détaillés
Customer IDTotal centsJoined row count
142003
227001

Code fonctionnel et fichiers de test

Utilisez les fichiers originaux pour les exercices de code et de données. Le ZIP source inclut leurs instructions et données d'entrée.

Télécharger les exemples source (ZIP)
FixtureSQL
-- Fully synthetic SQLite fixture. No real customer data or credentials.
PRAGMA foreign_keys = ON;
CREATE TABLE customers (
  customer_id INTEGER PRIMARY KEY,
  label TEXT NOT NULL CHECK (label LIKE 'SYNTHETIC_%')
);
CREATE TABLE orders (
  order_id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL REFERENCES customers(customer_id),
  shipping_cents INTEGER NOT NULL CHECK (shipping_cents >= 0)
);
CREATE TABLE order_items (
  item_id INTEGER PRIMARY KEY,
  order_id INTEGER NOT NULL REFERENCES orders(order_id),
  quantity INTEGER NOT NULL CHECK (quantity > 0),
  unit_price_cents INTEGER NOT NULL CHECK (unit_price_cents >= 0)
);
INSERT INTO customers VALUES (1, 'SYNTHETIC_ALPHA'), (2, 'SYNTHETIC_BETA');
INSERT INTO orders VALUES (101, 1, 300), (102, 1, 500), (201, 2, 200);
INSERT INTO order_items VALUES (1001, 101, 2, 1000), (1002, 101, 1, 500), (1003, 102, 3, 200), (1004, 201, 1, 2500);
Télécharger fixture.sql
Requête correcteSQL
-- Aggregate items per order before adding each order's shipping once.
WITH per_order AS (
  SELECT o.order_id, o.customer_id,
         o.shipping_cents + COALESCE(SUM(i.quantity * i.unit_price_cents), 0) AS total_cents
  FROM orders AS o
  LEFT JOIN order_items AS i ON i.order_id = o.order_id
  GROUP BY o.order_id, o.customer_id, o.shipping_cents
)
SELECT customer_id, SUM(total_cents) AS total_cents, COUNT(*) AS order_count
FROM per_order
GROUP BY customer_id
ORDER BY customer_id;
Télécharger correct-query.sql
Requête surcomptéeSQL
-- Intentionally wrong for this task: shipping is added once per joined item.
SELECT o.customer_id,
       SUM(i.quantity * i.unit_price_cents + o.shipping_cents) AS total_cents,
       COUNT(*) AS joined_row_count
FROM orders AS o
JOIN order_items AS i ON i.order_id = o.order_id
GROUP BY o.customer_id
ORDER BY o.customer_id;
Télécharger overcounting-query.sql
Verify fixturePY
# Offline, in-memory SQLite verification of the unchanged synthetic pack.
import hashlib
import json
from pathlib import Path
import sqlite3

root = Path(__file__).parent
expected_hashes = {'fixture.sql': 'ea22bd66ff6182552a4c726dbba7a2634c5e49e0726ab2b471165a1bc1736250', 'correct-query.sql': 'bce555fad1354c7b3dde4a286bfdee0fe2ea9b98b93b229c06b23112f8cbf197', 'overcounting-query.sql': 'b5b71cb2aff59ee818442585c14410c3a538181064f92a6b14fb7bf90871d97f'}
texts = {}
for name, expected in expected_hashes.items():
    text = (root / name).read_text()
    if hashlib.sha256(text.encode()).hexdigest() != expected:
        raise SystemExit("Refusing modified SQL: use the unchanged synthetic fixture.")
    texts[name] = text
connection = sqlite3.connect(":memory:")
try:
    connection.executescript(texts["fixture.sql"])
    assert connection.execute("PRAGMA foreign_keys").fetchone()[0] == 1
    correct_rows = connection.execute(texts["correct-query.sql"]).fetchall()
    overcounting_rows = connection.execute(texts["overcounting-query.sql"]).fetchall()
    assert correct_rows == [(1, 3900, 2), (2, 2700, 1)]
    assert overcounting_rows == [(1, 4200, 3), (2, 2700, 1)]
    rejected = []
    for label, statement in [
        ("foreign_key", "INSERT INTO orders VALUES (999, 999, 0)"),
        ("positive_quantity", "INSERT INTO order_items VALUES (9999, 101, 0, 100)")
    ]:
        try:
            connection.execute(statement)
        except sqlite3.IntegrityError:
            rejected.append(label)
        else:
            raise AssertionError("Expected constraint rejection: " + label)
    print(json.dumps({"fixture": "D18 synthetic only", "sqlite_version": sqlite3.sqlite_version,
        "correct_rows": correct_rows, "overcounting_rows": overcounting_rows,
        "constraints_rejected": rejected, "database": "in-memory", "network_calls": 0}))
finally:
    connection.close()
Télécharger verify_fixture.py

Avant de continuer

Gardez ces distinctions claires

Masquer un dump de production et l’appeler synthétique
Inventez les lignes et conservez uniquement la relation nécessaire pour reproduire le problème.
Vérifier uniquement un total plausible
Inclure un cas qui expose l’erreur, un cas témoin et les comptes d’agrégation ou contraintes qui l’expliquent.

Appliquez-le à l'utilisation de l'IA par les employés

Apportez votre chemin de données réel.

Aona peut aider à évaluer les soumissions de prompts ou fichiers employés supportés pour une question de codage.

Aona ne fournit pas de permissions sur les lignes de base de données ni ne garantit l’inspection de chaque requête, dump ou résultat MCP. Ce fixture teste le SQL localement, pas une politique Aona.

Utilisez le schéma et la requête synthétiques dans une démonstration ciblée du chemin de soumission supporté, en gardant toute base réelle hors de l’exercice.

Révisez votre cas d'utilisation

FAQ

Questions pour cette décision

Le fixture est-il compatible avec SQLite réel ?
Oui. Il utilise des tables, contraintes et requêtes SQLite standard. Le vérificateur Python inclus l’a exécuté en mémoire, vérifié les lignes attendues et confirmé les échecs de clés étrangères et de vérification de quantité.
Le vérificateur se connecte-t-il à une base existante ?
Non. Il crée uniquement une base en mémoire, n’accepte aucune chaîne de connexion et ne fait aucun appel réseau. Il rejette les modifications des trois fichiers SQL fournis.
Puis-je utiliser un schéma de production avec des lignes factices ?
Vérifiez d’abord si le schéma divulgue des informations propriétaires. Préférez une structure réduite et inventée qui conserve la relation à l’origine du bug et respecte la décision d’autorisation du propriétaire.
Les sorties SQL vérifiées prouvent-elles qu’une correction générée par IA est sûre ?
Non. Elles établissent les résultats attendus de ce fixture. Toute modification proposée nécessite ses propres tests locaux, contraintes et revue approuvée avant application ailleurs.

Preuves à l'appui du guide

Sources et portée

Préparé par Aona. Sources vérifiées 2026-09-21. Le matériel cité soutient les points spécifiques ci-dessous ; il ne certifie pas un produit ni votre cas d'usage.

  1. SQLite : Support des clés étrangères

    Documente les relations de clés étrangères et l’activation de leur application pour une connexion.

    vendor · vérifié 2026-09-21
  2. SQLite: SELECT

    Documente les jointures, regroupements et évaluation des requêtes utilisés dans le fixture.

    vendor · vérifié 2026-09-21
  3. OAIC : Utilisation de produits IA commerciaux

    Explique les considérations de confidentialité pour les informations personnelles fournies à l’IA.

    regulator · vérifié 2026-09-21
Fixtures SQLite synthétiques pour le débogage IA