<< All versions
Skill v1.0.0
currentTrusted Publisher100/100microsoft/rayfin/schema-discovery
──Details
PublishedOctober 10, 2026 at 08:42 AM
Content Hashsha256:221fff3cf90b78e0...
Git SHA
──Files
Files (1 file, 6.8 KB)
SKILL.md6.8 KBactive
SKILL.md · 132 lines · 6.8 KB
version: "1.0.0" name: schema-discovery description: > Explore Power BI semantic model schemas using DAX INFO functions. Progressive metadata discovery strategy, scope estimation, and narrowing techniques for tables, columns, measures, and relationships.
Schema Discovery
Table of Contents
| Task | Reference | Notes | |
|---|---|---|---|
| Must/Prefer/Avoid | SKILL.md: Must/Prefer/Avoid | Guardrails for schema discovery | |
| Progressive Discovery Strategy | SKILL.md: Progressive Schema Discovery | Decision tree for on-demand metadata fetching | |
| Recommended Discovery Order | SKILL.md: Recommended Discovery Order | Start with scope estimation → tables → columns → measures → relationships | |
| Metadata Object → INFO Function Map | SKILL.md: Metadata Object → INFO Function Map | Tables, columns, measures, relationships, calc groups, calendars, UDFs, variations | |
| Scope Estimation Queries | discovery-queries.md: Scope Estimation Queries | Probe table/column/measure/relationship counts before deep discovery | |
| INFO Output Columns | discovery-queries.md: INFO Output Columns | INFO.VIEW.(read access); INFO. (may need elevated access) | |
| Narrowing Results (Projection + Filtering) | discovery-queries.md: Narrowing Results | SELECTCOLUMNS + FILTER to reduce output volume | |
| Advanced Metadata (Calc Groups, Calendars, UDFs) | discovery-queries.md: Advanced Metadata Queries | INFO.CALCULATIONGROUPS, INFO.CALENDARS, INFO.USERDEFINEDFUNCTIONS, INFO.VARIATIONS | |
| Complete INFO Function Catalog | discovery-queries.md: Complete INFO Function Catalog | Dynamic query to enumerate all INFO functions in the engine |
Must / Prefer / Avoid
Must
- Use fully-qualified
'Table'[Column]for column references - Use simple
[Measure]for measure references
Prefer
- INFO.VIEW functions for initial metadata discovery (read access, lightweight)
- Progressive schema discovery over full schema dumps
- SELECTCOLUMNS + FILTER to narrow INFO results
Avoid
- Fetching full schema upfront — discover incrementally based on need
- Re-fetching metadata already discovered in this conversation
- Using GetSemanticModelSchema, DiscoverArtifacts, or GenerateQuery MCP tools (these are not available)
Progressive Schema Discovery
Discover metadata incrementally based on what the user actually needs.
Strategy (Decision Tree)
text
User asks a question→ Do I know which tables are relevant?→ NO: Run INFO.VIEW.TABLES() to get table inventory→ YES: Do I know the columns/measures for those tables?→ NO: Run filtered INFO.VIEW.COLUMNS() and INFO.VIEW.MEASURES() for those tables→ YES: Do I need relationships?→ YES: Run INFO.VIEW.RELATIONSHIPS() filtered to those tables→ NO: Do I need advanced metadata?→ Have elevated INFO functions already failed in this session?→ YES: Skip — assume no permission for all elevated queries→ NO: Try the relevant elevated query:→ Calculation groups: INFO.CALCULATIONGROUPS() + INFO.CALCULATIONITEMS()→ Calendars: INFO.CALENDARS()→ User-defined functions: INFO.USERDEFINEDFUNCTIONS()→ Variations: INFO.VARIATIONS()→ If query fails with permission error: mark elevated access as unavailable→ Use discovered schema to write DAX queries (see dax-authoring skill)
Rules
- Start with scope estimation — Run the scope probe query first to understand model size
- Discover on demand — Only fetch tables/columns/measures relevant to the current user request
- Use INFO.VIEW functions first (read access) — tables, columns, measures, relationships
- Use INFO functions (may need elevated access) for: calculation groups, calculation items, variations, user-defined functions, calendars
- Handle permission failures gracefully — If an elevated INFO function fails but INFO.VIEW.* functions succeeded, assume the user lacks elevated permissions and skip all elevated discoveries entirely
- Always narrow results — Use SELECTCOLUMNS + FILTER to fetch only needed columns and rows
- Cache discovered schema mentally — Don't re-fetch what you've already discovered in this conversation
Recommended Discovery Order
- Scope estimation — Count tables, columns, measures, relationships
- Tables — Get table names, identify relevant ones
- Columns — Get columns for relevant tables only
- Measures — Get measures (prefer using these over raw aggregations)
- Relationships — Get relationships between relevant tables
- Advanced metadata (if needed) — Calculation groups, calendars, UDFs, variations
Scope Estimation Query
dax
EVALUATEROW("TableCount", COUNTROWS(INFO.VIEW.TABLES()),"ColumnCount", COUNTROWS(INFO.VIEW.COLUMNS()),"MeasureCount", COUNTROWS(INFO.VIEW.MEASURES()),"RelationshipCount", COUNTROWS(INFO.VIEW.RELATIONSHIPS()))
Metadata Object → INFO Function Map
| Metadata Object | Primary INFO Functions | Access Level | |
|---|---|---|---|
| Tables | INFO.VIEW.TABLES() | Read | |
| Columns | INFO.VIEW.COLUMNS() | Read | |
| Measures | INFO.VIEW.MEASURES() | Read | |
| Relationships | INFO.VIEW.RELATIONSHIPS() | Read | |
| Model config | INFO.MODEL() | May need elevated | |
| Calculation groups | INFO.CALCULATIONGROUPS(), INFO.CALCULATIONITEMS() | May need elevated | |
| Calendars | INFO.CALENDARS(), INFO.CALENDARCOLUMNGROUPS(), INFO.CALENDARCOLUMNREFERENCES() | May need elevated | |
| User-defined functions | INFO.USERDEFINEDFUNCTIONS() | May need elevated | |
| Variations | INFO.VARIATIONS() | May need elevated |
For the full query catalog and output column details, see discovery-queries.md.
Running Discovery Queries
Use npx fabric-app-data query <alias> --query '<DAX>' to execute INFO queries against a semantic model. For full CLI options (profiles, file input, result limits), see the fabric-cli skill.
bash
npx fabric-app-data query <alias> --query "EVALUATE INFO.VIEW.TABLES()"
Troubleshooting
| Problem | Solution | |
|---|---|---|
| INFO functions return permission errors | Fall back to INFO.VIEW functions; mark elevated access as unavailable for this session | |
| Metadata output too large | Use scope estimation + narrowing patterns from discovery-queries.md |