Protección de datos para desarrolladores
Depurar SQL con una base de datos sintética
Construya el conjunto de datos inventado más pequeño que preserve las relaciones y restricciones detrás del problema SQL. No comience subiendo un volcado de producción y enmascarando algunas columnas. El fixture SQLite descargable reproduce un sobreconteo en un join con filas ficticias y salida esperada verificada, para que la consulta pueda discutirse sin registros de clientes.
Para Desarrolladores, DBAs e ingeniería de seguridad
Preserve la relación que causa el error, no los registros originales.
Conjunto de datos totalmente sintético. Salidas SQL y dos restricciones verificadas sin conexión; no se realizó prueba de IA ni de política de endpoint.01
Defina la pregunta relacional
El ejemplo pregunta por qué el total de un cliente se vuelve demasiado alto cuando se añade el envío después de unir órdenes con artículos. La característica importante es una orden con múltiples artículos. Nombres de clientes, precios reales y una base de datos completa de producción no son necesarios para reproducir esa relación.
Escriba el resultado esperado antes de pedir a un asistente que explique la consulta. Un fixture útil incluye un caso que expone el error y otro que no. Eso ayuda a distinguir una corrección correcta de una consulta que simplemente devuelve números plausibles para una fila.
02
Preserve restricciones e invente las filas
El paquete crea clientes, órdenes y order_items con claves primarias, claves foráneas y verificaciones de cantidades no negativas y cantidades positivas. Todas las etiquetas y valores son inventados. El esquema es un ejemplo genérico para enseñanza, no copiado de una base de datos empresarial.
Al crear un fixture para su propio problema, preserve solo las relaciones y casos límite necesarios para la pregunta. Revise si los nombres de esquema, comentarios o restricciones revelan información propietaria. Reemplazar nombres en filas copiadas de producción no es lo mismo que construir un fixture sintético.
Contexto de la fuente: SQLite: Soporte de clave externa · OAIC: Uso de productos de IA comercialmente disponibles
03
Compare las consultas correcta y con sobreconteo
La consulta incorrecta intencionalmente suma el envío de una orden una vez por cada artículo unido. Por lo tanto, el primer cliente sintético totaliza 4,200 céntimos en lugar de 3,900. El segundo cliente tiene un artículo, así que ambas consultas devuelven 2,700 céntimos. Esta diferencia hace que la causa sea observable sin datos reales de clientes.
La consulta correcta agrega montos por artículo y orden, añade el envío una vez y luego totaliza por cliente. Los archivos CSV esperados incluyen conteos y montos para que el nivel de agregación cambiado sea visible. Estos son resultados SQL verificados localmente para el fixture, no observaciones de un modelo IA o control Aona.
| Cliente sintético | Consulta con sobreconteo | Consulta correcta |
|---|---|---|
| 1: SYNTHETIC_ALPHA | 4,200 céntimos; 3 filas unidas | 3,900 cents; 2 orders |
| 2: SYNTHETIC_BETA | 2,700 céntimos; 1 fila unida | 2,700 cents; 1 order |
Contexto de la fuente: SQLite: SELECT
04
Verifique el fixture sin conexión
El verificador Python incluido usa la biblioteca estándar sqlite3 y una base de datos en memoria. Verifica los archivos SQL sin cambios por hash, ejecuta ambas consultas y confirma que filas con claves foráneas inválidas y cantidades cero son rechazadas. No abre ninguna base de datos de producción ni realiza llamadas de red o a proveedores.
El fixture habilita explícitamente la aplicación de claves foráneas, como requiere la documentación de SQLite para verificar esa configuración en una conexión. Si cambia el SQL para explorar otro caso, mantenga ese trabajo separado y cree nuevos resultados esperados. El verificador suministrado rechaza deliberadamente SQL modificado en lugar de validar silenciosamente un ejercicio diferente.
Contexto de la fuente: SQLite: Soporte de clave externa
Ponlo en práctica
Paquete sintético SQLite para depuración de joins
Ejecute un fixture relacional real y compare una consulta con sobreconteo con resultados esperados verificados.
Conjunto de datos totalmente sintético. Salidas SQL y dos restricciones verificadas sin conexión; no se realizó prueba de IA ni de política de endpoint.
Pedido 101
Dos artículos comparten un único cargo de envío
El join ingenuo suma el envío dos veces
Nivel correcto
Agrega artículos por pedido, luego total por cliente
Total esperado primero: 3.900 céntimos
Caso de control
Un artículo en el pedido 201
Ambas consultas devuelven 2.700 céntimos
| Comprobado | Resultado esperado del fixture | Verificación |
|---|---|---|
| Totales correctos | 3,900 y 2,700 cents | Verificado localmente |
| Ejemplo de sobreconteo | 4,200 y 2,700 cents | Verificado localmente |
| Orden huérfana | Rechazo por clave foránea | Verificado localmente |
| Cantidad cero de artículo | Rechazo por restricción de comprobación | Verificado localmente |
Trabaja en tu reseña
Usa las verificaciones para organizar las pruebas que necesitas. Guarda tus selecciones en Word, luego añade tus notas y pruebas. Tus selecciones permanecen en esta pestaña hasta que las descargues.
0 de 3 Revisado
Ejemplos y material de revisión
Lee los detalles aquí, o mantén juntos el documento PDFeditable Word y las hojas de cálculo.
Synthetic SQLite debugging fixtureLee
All rows, labels y 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 y 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 correctLee
| Customer ID | Total cents | Order count |
|---|---|---|
| 1 | 3900 | 2 |
| 2 | 2700 | 1 |
Expected overcountingLee
| Customer ID | Total cents | Joined row count |
|---|---|---|
| 1 | 4200 | 3 |
| 2 | 2700 | 1 |
Código de trabajo y archivos de prueba
Utiliza los archivos originales para los ejercicios de código y datos. El código fuente ZIP incluye sus instrucciones y datos de entrada.
Descargar ejemplos de fuentes (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);
Descargar fixture.sqlConsulta correctaSQL
-- 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;
Descargar correct-query.sqlConsulta con sobreconteoSQL
-- 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;
Descargar overcounting-query.sqlVerify 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()
Descargar verify_fixture.pyAntes de que continúes
Mantén claras estas distinciones
- Enmascarar un volcado de producción y llamarlo sintético
- Inventar las filas y preservar solo la relación necesaria para reproducir el problema.
- Comprobar solo un total plausible
- Incluye un caso que expone el error, un caso de control y los recuentos o restricciones de agregación que lo explican.
Aplícalo al uso de IA por parte de empleados
Lleva tu ruta real de datos.
Aona puede ayudar a evaluar envíos de prompts o archivos de empleados soportados para una pregunta de codificación.
Aona no proporciona permisos de fila de base de datos ni garantiza la inspección de cada consulta, volcado o resultado MCP. Este fixture prueba SQL localmente, no una política de Aona.
Usa el esquema y consulta sintéticos en una demostración acotada de la ruta de envío soportada, manteniendo cualquier base de datos real fuera del ejercicio.
Revisa tu caso de usoPreguntas frecuentes
Preguntas sobre esta decisión
¿Es el fixture compatible con SQLite real?
¿El verificador se conecta a una base de datos existente?
¿Puedo usar un esquema de producción con filas falsas?
¿Los resultados SQL verificados prueban que una corrección generada por IA es segura?
Evidencia detrás de la guía
Fuentes y alcance
Preparado por Aona. Fuentes comprobadas 2026-09-21. El material citado respalda los puntos específicos a continuación; no certifica un producto ni su caso de uso.
- SQLite: Soporte de clave externa
Documenta relaciones de clave externa y habilitación de su aplicación para una conexión.
vendor · comprobado 2026-09-21 - SQLite: SELECT
Documenta joins, agrupaciones y evaluación de consultas usadas en el fixture.
vendor · comprobado 2026-09-21 - OAIC: Uso de productos de IA comercialmente disponibles
Explica consideraciones de privacidad para información personal suministrada a IA.
regulator · comprobado 2026-09-21