amjadiqbal/laravel-sql-dashboard
A Laravel package that adds a SQL dashboard to your application, letting you run queries and inspect database results through a simple web interface. Useful for quick data checks, debugging, and lightweight SQL monitoring.
composer require and pin to ^0.1.1 — this is a 0.x package, so treat the minor version as potentially breaking. Do not float on *.php artisan migrate, then clear caches. The dashboard persists shared queries, dashboards, checks and alert settings, so the storage layer is part of your app's schema — back it up like any other table.app()->environment('local'), so out of the box the dashboard is a local-only tool. Anyone who clears the gate can edit and delete shared queries, dashboards and checks — there is no per-object ownership. Widen it deliberately, and wrap the routes in your app's normal auth (plus 2FA if you have it) so the gate is a second lock, not the only one.SELECT against a table you know, save it as a shared query, pin it to a dashboard, then add a check with an alerts.rows_in_alert threshold and a mail alert. That exercises the whole path — connection check, query execution, persistence, alerting — in about ten minutes.SELECT only on the schemas you want visible. The package refuses superusers and dangerous role memberships, but that refusal is a backstop; the grant is the real control. Never reuse your application's runtime credentials.alerts.rows_in_alert is effectively a cron-free assertion: "if this returns more than N rows, tell someone." Set the threshold per check rather than relying on a global default; the failure mode of a shared threshold is either silence or constant noise.Mail::fake() test for the mail path, then verify once by hand in a real workspace.false catches the classic mistake of widening the gate for a demo and forgetting to narrow it again.U&"..."-escaping the name ("pg_advisory_lock"(1), pg_catalog."pg_read_file"(...), `GET_LOCK`(...), [load_extension](...)) slipped straight past the deny-list. If anyone other than you can reach the query box on 0.1.0, assume the deny-list was decorative.GET_LOCK are not released by a rollback. 0.1.1 explicitly releases them after each query. If you write your own execution path or wrap the package's runner, replicate that cleanup or a "read-only" query can wedge a connection pool.PROCESS is now a refusal for MySQL. Monitoring and analytics users very often carry PROCESS (alongside the already-refused FILE and SUPER). Expect an upgrade-day surprise where a long-working connection suddenly fails the check; the fix is a fresh, narrower user, not a config workaround.pg_read_server_files, pg_write_server_files, pg_execute_server_program or pg_signal_backend, dblink execution rights, and USAGE on a foreign server all disqualify the role. Superusers are refused even on a standby, so there is no "it's only a replica" exemption.dblink, postgres_fdw, MySQL wait/lock and UDF names) but a tokenizer reasons about tokens, not semantics. Your grant is the control that holds.alerts.rows_in_alert or the gate config won't take effect until php artisan config:clear / a redeploy that rebuilds the cache.rows_in_alert per check and delete stale checks aggressively — anyone with the gate can create them.How can I help you explore Laravel packages today?