Database administration tasks including schema changes, backups, monitoring, and user access management.
57
64%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
High
Do not use without reviewing
Fix and improve this skill with Tessl
tessl review fix ./plugin-creator/evals/scenario-1/inputs/SKILL.mdThis skill covers everything related to running and maintaining a PostgreSQL database in production.
When the user needs to change the database schema:
psql $DATABASE_URL.SELECT * FROM schema_migrations WHERE applied_at IS NULL ORDER BY version;psql $DATABASE_URL -f migrations/<version>_<name>.sqlSELECT version, applied_at FROM schema_migrations ORDER BY applied_at DESC LIMIT 5;psql $DATABASE_URL -f migrations/<version>_<name>_rollback.sql<YYYYMMDDHHMMSS>_<short_description>.sql (e.g. 20240512140000_add_user_preferences.sql)_rollback.sql file.CREATE TABLE IF NOT EXISTS, ALTER TABLE ... ADD COLUMN IF NOT EXISTS).When the user asks to back up the database or when a backup is needed before a risky operation:
pg_dump $DATABASE_URL > backup_$(date +%Y%m%d_%H%M%S).sqlgzip backup_*.sqlaws s3 cp backup_*.sql.gz s3://company-db-backups/postgres/<env>/aws s3 ls s3://company-db-backups/postgres/<env>/ | tail -5rm backup_*.sql.gzaws s3 cp s3://company-db-backups/postgres/<env>/<file>.sql.gz .gunzip <file>.sql.gzpsql $DATABASE_URL < <file>.sqlSELECT COUNT(*) FROM users; (should match pre-backup count).When the user asks about database health, slow queries, or connection issues:
SELECT count(*), state FROM pg_stat_activity GROUP BY state;SELECT pid, now() - pg_stat_activity.query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active' AND now() - query_start > interval '30 seconds'
ORDER BY duration DESC;SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
LIMIT 20;SELECT relname, indexrelname, idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY relname;SELECT pg_terminate_backend(<pid>);VACUUM ANALYZE <tablename>;When the user needs to create, modify, or revoke database access:
SELECT rolname, rolsuper, rolcreaterole, rolcreatedb FROM pg_roles ORDER BY rolname;CREATE ROLE <username> WITH LOGIN PASSWORD '<password>';
GRANT CONNECT ON DATABASE <dbname> TO <username>;
GRANT USAGE ON SCHEMA public TO <username>;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO <username>;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO <username>;CREATE ROLE <username> WITH LOGIN PASSWORD '<password>';
GRANT CONNECT ON DATABASE <dbname> TO <username>;
GRANT USAGE ON SCHEMA public TO <username>;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO <username>;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO <username>;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO <username>;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO <username>;REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM <username>;
REVOKE CONNECT ON DATABASE <dbname> FROM <username>;
DROP ROLE <username>;SELECT grantee, table_name, privilege_type
FROM information_schema.role_table_grants
WHERE table_schema = 'public'
ORDER BY grantee, table_name;All database tasks rely on these environment variables being set:
DATABASE_URL — full connection string, e.g. postgresql://user:pass@host:5432/dbnameAWS_PROFILE or AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY — for S3 backup operationsSLACK_WEBHOOK_URL — for posting notifications to Slack channelsIf any of these are missing, ask the user to provide them before proceeding.
These rules apply to all database operations:
$ENVIRONMENT variable.37f0a21
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.