MonitorSQL será una plataforma web para entregar acceso solo lectura a bases de datos SQL, permitiendo que usuarios autorizados puedan explorar tablas, consultar datos con ayuda de IA, visualizar resultados y exportar información de forma segura.
El objetivo principal es reducir la fricción técnica al consultar bases de datos, sin comprometer la seguridad ni permitir modificaciones sobre los datos originales.
MonitorSQL busca convertirse en una capa segura e inteligente entre usuarios de negocio, analistas, equipos técnicos y bases de datos relacionales.
La aplicación permitirá:
- Conectar una o más bases de datos SQL en modo lectura.
- Explorar esquemas, tablas, columnas, tipos de datos y relaciones.
- Consultar datos usando SQL manual o lenguaje natural asistido por IA.
- Visualizar resultados en tablas interactivas.
- Exportar resultados a CSV, Excel o JSON.
- Controlar accesos por usuario, rol, conexión, tabla o esquema.
- Registrar auditoría de consultas y exportaciones.
MonitorSQL
- “Consulta tus datos SQL con IA, sin exponer permisos de escritura.”
- “Explorador SQL seguro, visual e inteligente.”
- “Acceso de solo lectura a bases de datos con consultas asistidas por IA.”
- Laravel 13
- PHP 8.3+
- Laravel AI SDK
- Laravel Sanctum o sistema de autenticación nativo según el tipo de despliegue
- Laravel Policies / Gates para autorización
- Laravel Queues para exportaciones grandes
- Laravel Scheduler para tareas de limpieza, auditoría o refresco de metadatos
- Vue 3
- Inertia.js o frontend desacoplado con API REST
- shadcn-vue para componentes UI
- Tailwind CSS
- TanStack Table o componente Data Table compatible con Vue
- Chart.js, ECharts o Recharts-compatible alternative para visualización de datos
- PostgreSQL o MySQL para almacenar usuarios, roles, conexiones, permisos, auditoría y configuraciones.
- MySQL / MariaDB
- PostgreSQL
Soporte futuro:
- SQL Server
- SQLite
- Oracle
- ClickHouse
- BigQuery
MonitorSQL no debe permitir operaciones de escritura sobre las bases de datos conectadas.
Operaciones bloqueadas:
- INSERT
- UPDATE
- DELETE
- DROP
- ALTER
- TRUNCATE
- CREATE
- REPLACE
- GRANT
- REVOKE
- EXEC / CALL, salvo que se autoricen explícitamente procedimientos seguros
Estrategias recomendadas:
- Usar credenciales SQL de solo lectura a nivel de base de datos.
- Validar y bloquear sentencias peligrosas desde la aplicación.
- Ejecutar consultas en transacciones read-only cuando el motor lo soporte.
- Aplicar límites de filas y tiempo máximo de ejecución.
- Auditar cada consulta ejecutada.
La IA nunca debe ejecutar directamente una consulta sin validación previa.
Toda consulta generada por IA debe pasar por:
- Clasificación de intención.
- Validación sintáctica.
- Verificación de que sea solo lectura.
- Revisión de tablas permitidas para el usuario.
- Límite automático de resultados.
- Confirmación del usuario antes de ejecutar, si el riesgo es medio o alto.
El usuario debe ver siempre:
- La consulta SQL generada.
- Las tablas involucradas.
- Los filtros aplicados.
- El límite de resultados.
- Si la respuesta fue generada por IA.
Puede:
- Crear conexiones a bases de datos.
- Configurar credenciales.
- Asignar permisos por usuario o rol.
- Definir límites de consulta.
- Ver auditoría.
- Activar o desactivar funciones de IA.
Puede:
- Explorar tablas autorizadas.
- Ejecutar consultas SQL de solo lectura.
- Usar consultas asistidas por IA.
- Exportar resultados si tiene permiso.
- Crear consultas guardadas.
Puede:
- Hacer preguntas en lenguaje natural.
- Ver resultados filtrados.
- Exportar información si tiene permiso.
- Usar dashboards o consultas predefinidas.
Puede:
- Revisar historial de consultas.
- Revisar exportaciones.
- Ver accesos por usuario.
- No necesariamente puede consultar datos directamente.
Funcionalidades:
- Login.
- Gestión de usuarios.
- Gestión de roles.
- Permisos por conexión.
- Permisos por base de datos, esquema, tabla o columna.
- Restricción de exportación por rol.
Permisos sugeridos:
connections.viewconnections.createconnections.updateconnections.deleteschemas.viewtables.viewqueries.executequeries.ai_generatequeries.exportaudit.view
Cada conexión debe guardar:
- Nombre visible.
- Motor SQL.
- Host.
- Puerto.
- Base de datos.
- Usuario.
- Contraseña cifrada.
- SSL habilitado o no.
- Estado de conexión.
- Fecha de última prueba.
- Configuración de límites.
Buenas prácticas:
- Cifrar credenciales con Laravel Encryption.
- No mostrar contraseñas luego de guardarlas.
- Probar conexión antes de activarla.
- Recomendar usuarios SQL de solo lectura.
- Permitir rotación de credenciales.
El usuario podrá navegar:
- Conexiones disponibles.
- Bases de datos o esquemas.
- Tablas.
- Columnas.
- Tipos de datos.
- Índices.
- Relaciones detectadas.
- Conteo aproximado de filas.
- Vista previa limitada de datos.
Pantallas sugeridas:
- Listado de conexiones.
- Árbol de esquemas/tablas.
- Detalle de tabla.
- Vista previa de datos.
- Buscador de columnas.
Características:
- Editor con resaltado SQL.
- Autocompletado de tablas y columnas.
- Historial de consultas.
- Consultas favoritas.
- Límite automático.
- Validación de solo lectura.
- Resultados paginados.
- Tiempo de ejecución visible.
Reglas:
- Agregar
LIMITautomático si el usuario no lo define. - Bloquear múltiples sentencias si no son necesarias.
- Bloquear comentarios sospechosos o intentos de bypass.
- Mostrar errores de forma segura sin exponer credenciales ni detalles internos.
El usuario podrá escribir preguntas como:
- “Muéstrame los clientes registrados este mes.”
- “Agrupa las ventas por día de la última semana.”
- “Encuentra los productos con menor stock.”
- “Genera una consulta para comparar ingresos por categoría.”
Flujo propuesto:
- Usuario selecciona conexión y, opcionalmente, tablas disponibles.
- Usuario escribe pregunta en lenguaje natural.
- El sistema obtiene metadatos permitidos para ese usuario.
- La IA genera una consulta SQL.
- El backend valida la consulta.
- Se muestra la consulta al usuario.
- El usuario ejecuta la consulta.
- El sistema muestra resultados y explicación breve.
La IA debe recibir solo el esquema permitido, no datos completos salvo muestras anonimizadas o autorizadas.
Vista de resultados:
- Tabla paginada.
- Ordenamiento.
- Filtros rápidos.
- Búsqueda sobre resultados cargados.
- Selector de columnas visibles.
- Copiar celda/fila.
- Conteo de resultados.
- Tiempo de ejecución.
Visualizaciones sugeridas:
- Tabla.
- Barras.
- Líneas.
- Pie / donut.
- Métricas tipo cards.
- Agrupaciones simples.
La IA puede sugerir visualizaciones según los tipos de columnas:
- Fechas + números: gráfico de línea.
- Categorías + números: gráfico de barras.
- Estado / categoría porcentual: donut.
- Un único valor agregado: KPI card.
Formatos iniciales:
- CSV
- XLSX
- JSON
Reglas:
- Exportar solo resultados de consultas validadas.
- Registrar auditoría de cada exportación.
- Permitir límites por rol.
- Ejecutar exportaciones grandes en cola.
- Expirar archivos exportados después de cierto tiempo.
Metadatos de exportación:
- Usuario.
- Conexión.
- Consulta ejecutada.
- Fecha.
- Cantidad de filas.
- Formato.
- IP.
Registrar:
- Inicio de sesión.
- Creación o edición de conexiones.
- Consulta ejecutada.
- Consulta generada por IA.
- Exportación realizada.
- Error de permisos.
- Intento de consulta bloqueada.
Campos sugeridos:
iduser_idconnection_idactionsql_hashsql_previewstatusduration_msrows_returnedip_addressuser_agentcreated_at
- UI Vue + shadcn-vue
- Laravel Controllers / Inertia Pages
- Application Services
- AI Services
- SQL Connection Manager
- Query Validator
- Read-only Query Executor
- Audit Logger
- Export Service
ConnectionServiceSchemaIntrospectionServiceQueryValidationServiceReadOnlyQueryExecutorAiSqlAssistantServiceResultVisualizationServiceExportServiceAuditService
Usuario escribe pregunta
↓
Frontend envía pregunta + contexto seleccionado
↓
Backend obtiene esquema permitido
↓
AiSqlAssistantService genera SQL
↓
QueryValidationService valida solo lectura y permisos
↓
Frontend muestra SQL generado
↓
Usuario ejecuta
↓
ReadOnlyQueryExecutor ejecuta con límites
↓
AuditService registra evento
↓
Frontend muestra tabla, visualización y opciones de exportación
Usuarios del sistema.
Roles funcionales.
Permisos granulares.
Conexiones externas configuradas.
Campos sugeridos:
idnamedriverhostportdatabaseusernameencrypted_passwordssl_enabledoptionsis_activecreated_bycreated_atupdated_at
Permisos por usuario o rol sobre conexiones, esquemas, tablas o columnas.
Consultas guardadas por usuarios.
Historial de ejecuciones.
Historial y estado de exportaciones.
Auditoría general.
- Las credenciales SQL externas deben ser de solo lectura.
- Toda consulta debe ser validada antes de ejecutarse.
- Nunca enviar credenciales al frontend.
- Nunca exponer errores crudos del motor SQL al usuario final.
- Usar rate limiting para IA y ejecución de consultas.
- Limitar tiempo máximo de consulta.
- Limitar cantidad máxima de filas.
- Auditar consultas bloqueadas.
- Cifrar secretos.
La validación debe considerar:
- Tipo de sentencia.
- Palabras prohibidas.
- Múltiples statements.
- Comentarios sospechosos.
- Acceso a tablas no permitidas.
- Uso de funciones potencialmente peligrosas.
- Límite obligatorio.
Eres un asistente experto en SQL. Tu tarea es generar consultas SQL de solo lectura.
Reglas obligatorias:
- Solo puedes generar SELECT o WITH que termine en SELECT.
- No puedes generar INSERT, UPDATE, DELETE, DROP, ALTER, TRUNCATE, CREATE, REPLACE, GRANT, REVOKE, EXEC ni CALL.
- Usa únicamente las tablas y columnas entregadas en el contexto.
- No inventes columnas ni relaciones.
- Agrega siempre un límite de resultados si la consulta no es agregada.
- Devuelve una respuesta estructurada con:
- sql
- explanation
- tables_used
- confidence
- suggested_visualization
Contexto disponible:
{{schema_context}}
Pregunta del usuario:
{{user_question}}
{
"sql": "SELECT ... LIMIT 100",
"explanation": "Esta consulta obtiene...",
"tables_used": ["customers", "orders"],
"confidence": "high",
"suggested_visualization": {
"type": "table",
"x_axis": null,
"y_axis": null,
"reason": "El resultado contiene datos detallados por fila."
}
}- Sidebar con conexiones y navegación.
- Header con buscador global, usuario y acciones rápidas.
- Área central para exploración, SQL, resultados y visualizaciones.
ButtonCardDialogSheetSidebarTableData TableTabsInputTextareaSelectBadgeDropdown MenuToast / SonnerSkeletonAlert DialogCommandResizable
- Login.
- Dashboard.
- Conexiones.
- Crear / editar conexión.
- Explorador de tablas.
- Editor SQL.
- Asistente IA.
- Resultados.
- Exportaciones.
- Auditoría.
- Administración de usuarios y permisos.
- Autenticación.
- CRUD de conexiones.
- Prueba de conexión.
- Exploración de tablas.
- Vista previa limitada.
- Editor SQL solo lectura.
- Validador básico SQL.
- Auditoría de consultas.
- Integración Laravel AI SDK.
- Generación SQL desde lenguaje natural.
- Respuesta estructurada.
- Validación post-IA.
- Explicación de consulta.
- Sugerencia de visualización.
- Tabla avanzada.
- Exportación CSV.
- Exportación XLSX.
- Exportación JSON.
- Visualizaciones básicas.
- Consultas guardadas.
- Restricción por tabla.
- Restricción por columna.
- Roles personalizados.
- Límites por usuario.
- Auditoría avanzada.
GET /dashboard
GET /connections
POST /connections
GET /connections/{connection}
PUT /connections/{connection}
DELETE /connections/{connection}
POST /connections/{connection}/test
GET /connections/{connection}/schemas
GET /connections/{connection}/tables
GET /connections/{connection}/tables/{table}
GET /connections/{connection}/tables/{table}/preview
POST /queries/validate
POST /queries/execute
POST /queries/ai-generate
GET /queries/history
POST /queries/save
POST /exports
GET /exports
GET /exports/{export}/download
GET /audit
POST /queries/ai-generate
Request:
{
"connection_id": 1,
"question": "Muéstrame las ventas del último mes agrupadas por día",
"selected_tables": ["orders", "order_items"]
}Response:
{
"sql": "SELECT DATE(created_at) AS day, SUM(total) AS total_sales FROM orders WHERE created_at >= CURRENT_DATE - INTERVAL '30 days' GROUP BY DATE(created_at) ORDER BY day LIMIT 100",
"explanation": "Agrupa las ventas de los últimos 30 días por fecha.",
"tables_used": ["orders"],
"confidence": "high",
"suggested_visualization": {
"type": "line",
"x_axis": "day",
"y_axis": "total_sales"
}
}POST /queries/execute
Request:
{
"connection_id": 1,
"sql": "SELECT * FROM customers LIMIT 100"
}Response:
{
"columns": [
{ "name": "id", "type": "integer" },
{ "name": "name", "type": "string" }
],
"rows": [{ "id": 1, "name": "Cliente Demo" }],
"meta": {
"duration_ms": 42,
"row_count": 1,
"limited": true
}
}Responsabilidades:
- Detectar statements no permitidos.
- Validar que sea SELECT.
- Normalizar SQL.
- Agregar límite si corresponde.
- Identificar tablas usadas.
- Verificar permisos.
Responsabilidades:
- Construir contexto de esquema permitido.
- Enviar prompt al modelo IA.
- Solicitar respuesta estructurada.
- Validar formato de respuesta.
- Enviar SQL generado al validador.
Responsabilidades:
- Crear conexión dinámica.
- Ejecutar consulta con timeout.
- Aplicar límites.
- Normalizar resultados.
- Medir duración.
- Registrar auditoría.
Responsabilidades:
- Crear exportaciones.
- Procesar exportaciones grandes en background queue.
- Guardar archivos temporalmente.
- Controlar expiración.
- Registrar descargas.
MonitorSQL debe aprovechar Laravel AI SDK como la capa principal para construir la experiencia de IA del producto.
Laravel presenta el SDK como un paquete first-party para crear aplicaciones AI-native dentro del ecosistema Laravel, instalable con:
composer require laravel/aiEl SDK permite trabajar con agentes, herramientas, respuestas estructuradas, streaming, colas, embeddings, archivos, vector stores, testing y failover entre proveedores.
Crear un agente dedicado, por ejemplo:
php artisan make:agent SqlQueryAssistant --structuredEste agente debe encargarse de transformar preguntas en lenguaje natural en SQL de solo lectura.
Responsabilidades del agente:
- Recibir la pregunta del usuario.
- Recibir solo el esquema permitido para ese usuario.
- Generar SQL seguro.
- Explicar la consulta.
- Declarar tablas usadas.
- Sugerir visualización.
- Devolver una salida estructurada.
La generación SQL debe usar salida estructurada, no texto libre.
Estructura sugerida:
{
"sql": "SELECT ... LIMIT 100",
"explanation": "Descripción breve de lo que hace la consulta.",
"tables_used": ["orders"],
"confidence": "high",
"suggested_visualization": {
"type": "line",
"x_axis": "created_at",
"y_axis": "total"
}
}MonitorSQL puede definir tools propias para que el agente consulte metadatos controlados, sin acceder directamente a la base de datos productiva.
Tools sugeridas:
GetAllowedSchemaToolFindTablesToolDescribeTableToolValidateSqlToolSuggestVisualizationTool
Regla importante: el agente no debe tener una tool que ejecute SQL directamente sobre la base externa. La ejecución debe quedar en ReadOnlyQueryExecutor, después de pasar por validación.
El streaming puede usarse para mejorar la experiencia cuando la IA está explicando una consulta, generando pasos o analizando resultados.
Uso recomendado:
- Streaming para explicación y asistencia conversacional.
- No depender de streaming para ejecutar consultas SQL.
Las tareas pesadas deben ir a cola:
- Generación de exportaciones grandes.
- Análisis de resultados grandes.
- Indexación de metadatos.
- Creación de embeddings sobre documentación interna del esquema.
Configurar failover para mantener disponibilidad si un proveedor IA falla, tiene rate limits o latencia alta.
Ejemplo de estrategia:
- Proveedor primario: OpenAI.
- Proveedor secundario: Anthropic, Gemini, Groq u OpenRouter.
- Modelos más baratos para clasificación y validación.
- Modelos más potentes para generación SQL compleja.
Usar las herramientas de testing del SDK para simular agentes, outputs estructurados y herramientas.
Casos mínimos de prueba:
- Pregunta simple genera
SELECTválido. - Pregunta de escritura genera rechazo.
- Pregunta sobre tabla no permitida genera rechazo.
- Output inválido no se ejecuta.
- Consulta sin
LIMITrecibe límite automático. - IA no inventa columnas fuera del esquema.
Nombre sugerido:
App/Ai/Agents/SqlQueryAssistant
Interfaces sugeridas:
- Agent
- HasStructuredOutput
- HasTools
- Opcionalmente Conversational, si se desea mantener contexto por sesión
Instrucciones base:
Eres un asistente experto en SQL de solo lectura para MonitorSQL.
Tu objetivo es ayudar al usuario a consultar datos de forma segura.
Reglas obligatorias:
- Solo puedes generar SELECT o WITH que termine en SELECT.
- Nunca generes INSERT, UPDATE, DELETE, DROP, ALTER, TRUNCATE, CREATE, REPLACE, GRANT, REVOKE, EXEC ni CALL.
- Usa únicamente tablas y columnas del contexto autorizado.
- No inventes columnas, tablas ni relaciones.
- Si falta información, pide aclaración o responde que no puedes generar una consulta segura.
- Agrega LIMIT cuando la consulta devuelva filas detalladas.
- Devuelve siempre salida estructurada.
Usuario pregunta
↓
Controller / Action
↓
SchemaPermissionService obtiene esquema autorizado
↓
SqlQueryAssistant genera respuesta estructurada
↓
QueryValidationService valida SQL
↓
Frontend muestra SQL + explicación
↓
Usuario confirma ejecución
↓
ReadOnlyQueryExecutor ejecuta consulta
↓
AuditService registra evento
↓
ResultVisualizationService sugiere tabla/gráfico/exportación
OPENAI_API_KEY=
ANTHROPIC_API_KEY=
GEMINI_API_KEY=
OPENROUTER_API_KEY=
AI_DEFAULT_PROVIDER=openai
AI_DEFAULT_MODEL=
AI_SQL_TIMEOUT=60
AI_SQL_MAX_SCHEMA_TOKENS=12000La IA debe usarse como asistente, no como autoridad final.
Buenas prácticas:
- Pasar solo metadatos autorizados.
- Evitar enviar datos sensibles como muestra.
- Pedir salida estructurada.
- Validar todo SQL generado.
- Registrar prompts y respuestas de forma segura, evitando guardar datos sensibles innecesarios.
- Mostrar confianza de la respuesta.
- Permitir al usuario editar el SQL antes de ejecutarlo.
- Separar generación SQL de ejecución SQL.
- No entregar credenciales ni conexión directa al agente.
| Riesgo | Mitigación |
|---|---|
| La IA genera SQL peligroso | Validador estricto + credenciales read-only |
| Usuario accede a tablas no autorizadas | Permisos por conexión/tabla/columna |
| Consultas muy pesadas | Timeout, LIMIT, paginación, colas |
| Exposición de credenciales | Cifrado, nunca enviar al frontend |
| Exportación masiva no controlada | Límites por rol y auditoría |
| Error del motor SQL expone información sensible | Sanitizar errores |
- Autenticación.
- Crear conexión MySQL/PostgreSQL.
- Explorar tablas.
- Ejecutar SELECT manual.
- Mostrar resultados en tabla.
- Validación SQL robusta.
- Auditoría básica.
- Exportación CSV.
- Historial de consultas.
- Integración IA.
- Generación SQL.
- Explicación de consultas.
- Consultas guardadas.
- Visualizaciones.
- Exportación XLSX/JSON.
- Permisos por tabla.
- Permisos avanzados por columna.
- Auditoría completa.
- Dashboards.
- Soporte multi-conexión estable.
- Hardening de seguridad.
El MVP será exitoso si permite que un usuario autorizado pueda:
- Iniciar sesión.
- Seleccionar una conexión SQL.
- Explorar tablas permitidas.
- Hacer una consulta SELECT segura.
- Preguntar algo en lenguaje natural y recibir SQL válido.
- Ver resultados en tabla.
- Exportar los resultados.
- Tener la acción registrada en auditoría.
- Documento técnico de arquitectura.
- Diagrama entidad-relación.
- Backlog de historias de usuario.
- Diseño de pantallas principales.
- Especificación del validador SQL.
- Prompt engineering inicial para IA.
- Plan de seguridad y auditoría.
- Plan de desarrollo por sprint.