30 días de prueba para evaluar sus riesgos de IAEmpezar ahora
Ir al contenido principal

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

Aona Notas de campoD18
Fixture relacional
3 orders. 4 items. One overcount.

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.

Compare las consultas correcta y con sobreconteo
Cliente sintéticoConsulta con sobreconteoConsulta correcta
1: SYNTHETIC_ALPHA4,200 céntimos; 3 filas unidas3,900 cents; 2 orders
2: SYNTHETIC_BETA2,700 céntimos; 1 fila unida2,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

05

Comparta el fixture y la pregunta precisa

Para un flujo de trabajo de codificación IA aprobado, proporcione el esquema ficticio, la consulta relevante, el resultado esperado y la pregunta que desea responder. Mantenga fuera el volcado de producción, cadena de conexión y registros de clientes. Revise si la cuenta seleccionada y la ruta de entrada están aprobadas para el material que comparte.

Use cualquier consulta sugerida como hipótesis para probar localmente. Una respuesta legible no prueba que la corrección preserve restricciones o funcione en otros casos. Esta guía prepara un ejemplo relacional seguro; no afirma que Aona gobierne permisos de base de datos o cada conexión SQL/MCP.

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.

La relación que revela el error
01

Pedido 101

Dos artículos comparten un único cargo de envío

El join ingenuo suma el envío dos veces

02

Nivel correcto

Agrega artículos por pedido, luego total por cliente

Total esperado primero: 3.900 céntimos

03

Caso de control

Un artículo en el pedido 201

Ambas consultas devuelven 2.700 céntimos

Paquete sintético SQLite para depuración de joins
ComprobadoResultado esperado del fixtureVerificación
Totales correctos3,900 y 2,700 centsVerificado localmente
Ejemplo de sobreconteo4,200 y 2,700 centsVerificado localmente
Orden huérfanaRechazo por clave foráneaVerificado localmente
Cantidad cero de artículoRechazo por restricción de comprobaciónVerificado 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.

Descargar pack completo (ZIP)
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
Registros de ejemplo detallados
Customer IDTotal centsOrder count
139002
227001
Expected overcountingLee
Registros de ejemplo detallados
Customer IDTotal centsJoined row count
142003
227001

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.sql
Consulta 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.sql
Consulta 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.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()
Descargar verify_fixture.py

Antes 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 uso

Preguntas frecuentes

Preguntas sobre esta decisión

¿Es el fixture compatible con SQLite real?
Sí. Usa tablas, restricciones y consultas estándar de SQLite. El verificador Python incluido lo ejecutó en memoria, comprobó las filas esperadas y confirmó fallos de clave externa y verificación de cantidades.
¿El verificador se conecta a una base de datos existente?
No. Crea solo una base de datos en memoria, no acepta cadena de conexión ni realiza llamadas de red. Rechaza cambios en los tres archivos SQL incluidos.
¿Puedo usar un esquema de producción con filas falsas?
Primero revise si el esquema en sí revela información propietaria. Prefiera una estructura reducida e inventada que preserve la relación detrás del error y siga la decisión de permiso del propietario.
¿Los resultados SQL verificados prueban que una corrección generada por IA es segura?
No. Establecen los resultados esperados de este fixture. Cualquier cambio propuesto necesita sus propias pruebas locales, restricciones y revisión aprobada antes de aplicarse en otro lugar.

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.

  1. 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
  2. SQLite: SELECT

    Documenta joins, agrupaciones y evaluación de consultas usadas en el fixture.

    vendor · comprobado 2026-09-21
  3. OAIC: Uso de productos de IA comercialmente disponibles

    Explica consideraciones de privacidad para información personal suministrada a IA.

    regulator · comprobado 2026-09-21
Fixtures sintéticos SQLite para depuración de IA